Hmm I have made some calculations to get a balanced race, and it involves some slightly time consuming data collecting and a little bit of an honor system in order to set up though. I know this may look complicated but it's actually really simple.
Phase 1: Setup
First and foremost, you must state some rules before the race that the transmission CAN NOT BE CHANGED during the equalization phase 2 and afterwards. The track, tune (N/A or Turbo) & PP should be known ahead of time, and the racer should set up their car for that race and/or race series beforehand. It may also be a good idea to tell people to have at least 10 ballast at a weight distribution of their choosing because 8 ballast fixes some minor PP disputes anyways. They should also be informed though that they shouldn't change the position of it too greatly in the next phases of this equalization process, to keep things fair (same with transmission).
Phase2: Point in Time Acceleration Phase
This is where it get a little complicated, because you need to find the point in time where the SLOWEST accelerating car is doing PP/3 kph. So if the race is 500 pp, the P.I.T. number (P.I.T.N. for short) is 166.6kph (500/3). So follow the slowest accelerating car's* "Point In Time" location, wherever this car reaches the P.I.T.N. and then follow any subsequent racer (if there's a new "slowest" car.. then you have to repeat this all over again which is why I said there's some set up; anyways,) and when the new racers reach this point in time, mark down their speed. Because the cars are the same PP, this area in time and the speed might be almost equal (especially if the cars are of similar weight and power) however any small variation can still matter at this point, and these numbers will ultimately determine the amount of ballast needed for each car. Also, while you are doing this, mark down the finishing times of the racers. This is important because the slowest accelerating car may not always be the one that finishes last.
Phase 3: Deciding to Add or Subtract Ballast
So you've now got the data for the P.I.T. of each car, each one is labeled "P.I.T.SlowestAcceleratingCar" (The car that did PP/3, the P.I.T.N.), "P.I.T.Car2", "P.I.T.Car3" etc. and the finishing times of the cars. Now comes the tricky part because there is a rare case where the slowest accelerating car finishes ahead of one of the other cars, and needs to take a ballast penalty itself. So, write out all of the cars final qualifying times out in seconds, and order them from fastest to slowest. If the slowest accelerating car has beat a player, you may choose to either ignore it (if it's within 0.3 of a second, and he only beat 1 racer, it's no big deal) or give him a penalty**.
Phase 4: Equalizing
Okay this ties into phase 3, Now that you have chosen which cars need more/less weight, you can give them ballast. The ballast is calculated by finding those P.I.T. speeds you wrote down, and making each one into a percent with:
P.I.T.CarX / P.I.T.SlowestAcceleratingCar
You can see that if you input the slowest accelerating car back into this equations numerator, you will get 100%, and so it needs no ballast, whereas every other car will give a percent; and that percent should be added to it's OWN weight, and taken as a fraction of it's own weight. So, for an example, a race was set up at 500pp and one car's P.I.T.N. 166.7, excluding the car that accelerated the slowest, was 174, and won the race by 3 seconds that car would get a ballast of 4.4%. So if that car weighed 1130, it would get a ballast of 50.
________________________________________
*Basically, it works off finding the cars acceleration, because the biggest variable is torque, and unfortunately you need heaps of torque to do what horsepower does.. and it's easier to modify ballast to get cars to the finish line evenly, rather than change torque around because then you may be adjusting horsepower and the PP drastically.
** (It might be a good idea to read phase 4 before this blurb!) Okay in the rare case where the slowest accelerating car doesn't lose, the slowest accelerating car can actually get a penalty. Find out which car(s) he beat, get the same P.I.T.CarX / P.I.T.SlowestAcceleratingCar percent, but instead of adding ballast to the carX, add the ballast to the slowest accelerating car. I know it seems kind of strange but because the (Slow Accelerating) car won, he is being penalized for equalization purposes. If there is more than 1 car that loses to him, the easiest way to penalize the slowest accelerating car while still being fair is by taking the average of all the cars that lost to that car P.I.T.N.'s, and using that as the percentile. It's fairly important that the new average is then used as the P.I.T.N number instead of the PP/3 number that was being used though, when this situation comes up.
If you don't think that this method is good, just consider the following:
carA
920kg 340pp
126 hp
87 ft/lb torque vs
carB
930kg 340pp
130hp
70 ft/lb torque
The torque figure doesn't mean enough on carA to out-power the horsepower input of carB, and will lose even though it is lighter and very similar. The already heavy car gets a (small) amount of ballast added to it after equalization.
Summary & Extra notes: Equalization DOES change the PP in the end though, so in the next race in the series.. perhaps let the losing cars drop 5 kg of weight, and the winners add 3 - although don't let them change their transmission or you should re-equalize the cars (like if you want to do a new race and let everyone change their transmission for the new course, they will need to be re-equalized). This method also brings everyone down to the lowest car's level.. so that nimble line they think they'll be able to take may result in a skid and a spin out (depending on tires). It takes some getting used to.
To find the P.I.T.N. area, it's usually best to take it from after a turn everyone is familiar with and takes consistently, like after the very last turn of a course, coming into on the first straight (assuming you get up to the PP/3 speed on that straight). Another way is simply to get everyone to tell you their speed once they reach a certain street lamp on SSR7 after "START". For 470pp, the 6th lamp give a good reading.. soo like probably for 450, the 6th lamp, 500, the 7th lamp, 550, the 8th lamp and so on. Make sure though that they have the settings they are using for the other course still on the car! You will also have to take their best lap from the course you plan to race on for Phase 3.
When penalizing ballast is added, the car may start going off kilter, but because it is their penalization ballast, I think it's fine if they move the balast after you tell them how much ballast they have been penalized.
There's not much you can do about sandbagging, which is why a lot of it's an honor system.
Edit: Please don't quote this entire wall of text, if you need to quote something for further understanding, choose portions.
Edit2: Another thing you can do because the whole thing is about equalization, is to get the ( P.I.T.CarX / P.I.T.SlowestAcceleratingCar ) percentile, and divide it by 2. adding and subtracting that ballast from both cars. I.E. the slower car gets some ballast off, and the fastest car gets ballast added. So for example, there would normally be 100 ballast added to one car because the time gap was 3 seconds or something - instead of adding 100 to one, or subtracting 100 from another, each gets half of the percentile in it's own weight added to it, so something like 49 taken away from one car, 51 added to the other.. keep in mind these are example figures and I'm not providing a proper (P.I.T.CarX / P.I.T.SlowestAcceleratingCar)/2 number. This is especially useful in a race of a lightweight vs. a heavyweight thats PPreally didn't provide an even race so that the ballast added or subtracted would have to be over 200.. which is not possible to add. If the cars instead take 100 each (or whatever figure that they get from their percentile), sometimes it is more possible to equalize that way.