TOCs▸ are quick to blame shortage of rolling stock for overcrowding and not increasing services. They should, in thoery be overjoyed, and qqueuing for any spare units. Although I have said before that their profit is greater from a 125 full to bursting point with disgruntled passengers than it would be from two trains with everyone able to get a seat. That said, GWR▸ made good use of the small number of extra units they were able to get a couple of years back.
The business of an overcrowded train being more profitable, even though potential travellers are put off, has interested me for a while - looking at how the arithmetic works. So I put a program together to try out a few things / figure and see what I got.
Potential passengers - 300
1 carriage ... 1.89 142 429.0 4.00
2 carriages ... 1.70 255 1110.0 2.00
3 carriages ... 1.22 275 675.0 1.33
4 carriages ... 0.95 285 120.0 1.00
5 carriages ... 0.78 291 -483.0 0.80
6 carriages ... 0.66 295 -1110.0 0.67
Figures on each line ...
... actual loading
... physical number of passsnegers carried
... profit made
... potential loading if everyone who wanted to travel did so
So there's 9 times more profit to be made running a 2 coach train full to bursting point than there is running a 4 coach train with a handful of spare seats, even though your 2 coach train has put off 30 people to the extent that they're not your customers at all, and have driven/ taken the bus etc.
If your potential customer pool has increased - let's say to 450 people, then it is worth adding an extra carriage.
Potential passengers - 450
1 carriages ... 1.89 142 429.0 6.00
2 carriages ... 1.90 285 1470.0 3.00
3 carriages ... 1.70 382 1959.0 2.00
4 carriages ... 1.35 405 1560.0 1.50
5 carriages ... 1.11 418 1041.0 1.20
6 carriages ... 0.95 427 474.0 1.00
Here are the inputs I used to my model:
pricePerSeat = 9.00 # How much it costs to provide a seat
incomePerPassenger = 12.00 # How much each passenger pays to travel
seatsPerCarriage = 75 # Number of seats per carriage
crewCosts = 600.00 # Crew cost for running the service
goldenLoad = 0.5 # Loading below which no-one is put off
physicalLimit = 1.9 # Loading above which it's physically impossible to board
mustGo = 0.5 # Proportion of people who simply have to travel
rampScale = 0.1 # Scaling by how much other people are put off by overcrowding
And of course the results will change based on the numbers which are educated guesses on my part (any expert like to come up with real numbers for me?)
The next complication comes in the need to add in the cost of the return working ... if the potential passenger count on that is only a half peak direction working, the results are all the more stark. With 300 on the outward leg and 150 on the return leg, a 2 coach train turns in a profit of 864, but a 4 coach train results in a loss of 1380.
Then you have partial journeys and the effect of fare levels and frequencies on the numbers of potential passengers. And then you need to conside the effect of promotional offers to get people using seats which would be running empty otherwise, and how to avoid those offers tempting people who would travel at full price to travel more cheaply ... I wouldn't want to run a TOC
For the more techical reader - my algorithms, coded in Python:
def getPassengers(potential, seats):
loadfactor = float(potential) / float(seats)
if loadfactor < goldenLoad:
return potential,loadfactor
putoff = (loadfactor - goldenLoad) * rampScale
if putoff > mustGo: putoff = 1.0 - mustGo
willgo = int(potential * (1.0 - putoff))
willtake = int(seats * physicalLimit)
if willgo > willtake: return willtake,loadfactor
return willgo,loadfactor
# generate result tables from 50 to 450 passenger
for potential in range(50,500,50):
print "Potential passengers -",potential
for carriages in range(1,7):
seats = carriages * seatsPerCarriage
passengers,plf = getPassengers(potential,seats)
alf = float(passengers) / float(seats)
incomings = passengers * incomePerPassenger
outgoings = seats * pricePerSeat + crewCosts
profit = incomings - outgoings
print carriages,"carriages ... ","%.2f" % alf,passengers,profit,"%.2f" % plf
print