SpazDC,
I would make use of 'info. targets', which are sections of the map, that if the a.i. is within the area of a target, it's new path is given to it. As for example, let's say you have a straight road with a curve in it at it's end. Code your map, that if the a.i. is within the straight, then his bounds are the width of the road(as where it is suppose to be driving), and it's direction(objective) is the angle of the straight. In further, the a.i. should know his objective, though through the use of your in-game physics and interaction with the player, he get's pushed from it. If so be, then when able, the a.i. should try to get back within the road's bounds and begin to drive the direction it is suppose to be going.
When the a.i. gets to the curve in the straight, calculate the angle of the curve, and have the a.i.'s objective be that turn.
In conclusion, have areas set aside, at the beginning of straights and the start of turns, that when the a.i. comes within these areas, his objective(angle and speed) are recorded. Code the a.i. to try to stay within this objective at all times. I have not ever coded a racing game, so this is all theory and 'logic' talk. However, I believe that with some experimentation, good results can be achieved using this method.
+NanoBrain+