This year, I have been working on what I hope are significant improvements to the way in which passenger transport is handled following experience on the
Bridgewater-Brunel server showing this to be an area in much need of improvement. Some of these things I have already implemented in various Github branches - others are still at the planning stages. The purpose of this post is to summarise those changes, and invite comment on them, especially the more radical amongst them, to help to refine the systems before they are released.
The first of the changes I have written about elsewhere, and I have now implemented on the walking-passengers Github branch: passengers can walk all the way to their destination provided that it is within their journey time tolerance (assuming a straight line journey from beginning to end and a walking speed set in simuconf.tab - the default is 5km/h); and the time for passengers walking from their origin to the first transport stop and from their last transport stop to their destination is taken into account in time calculations both for routing choice and journey time tolerance. No longer will passengers always walk if the stop closest to their origin and the stop closest to their destination are both within the coverage radii of stops: they will take transport if this is faster than walking. The coverage radius system is unchanged, but it is intended that the coverage radius be very greatly increased to go with this feature.
A related improvement that I have implemented just to-day is the transfer time. This takes into account the walking distance inside larger stops and adds it to the journey time. Because of the way in which routing works, it was not possible to make a bespoke transfer time depending on where in the stop/station that particular convoys stop, but the transfer time is based on the size of the stop and is shown in the stop details window in minutes and seconds. This behaves in the same way as waiting time, and is cumulative with waiting time. Small stops have a zero transfer time.
These two measures together make irrelevant the former practice, which is rather an exploit, of covering entire towns with very large stations made up of diagonally connected road stops.
The next improvement, which I have finished implementing to-day on the private-cars Github branch, is a reworking of the already existing private car routing system to make it work within reasonable limits of performance on larger maps. Currently, this feature has to be disabled on larger maps. Enabling this feature means that private journeys between towns (and to out of town attractions and industries) are based on the actual road network: private car journeys cannot be made where there is no road network, and their journey time will be based on the speed and directness of connecting roads.
Congestion has also been refined on the private-cars Github branch: instead of being a generalised disincentive to travel, congestion is now taken into account when determining journey times (the percentage figure represents the percentage of extra journey time above uncongested conditions), and the choice between walking, private car and public transport is based exclusively on journey times (taking into account congestion and the walk to and from transport stops, as applicable), except for that stubborn proportion of people who will always take their car if they can, the percentage of whom can be set in simuconf.tab.
I plan to refine and recalibrate congestion further so that the level of congestion is based on real life data about the relationship between the number of private car trips and the numbers of kilometres of road (TomTom publish quite extensive data on the subject): currently, the level of congestion is not well calibrated. I also plan to have player vehicles taken into account when calculating congestion, although I have not quite worked out how best to count them yet. Certainly, a city filled with 'buses and lorries should be more congested than one not so filled, all other things being equal.
A somewhat more radical feature that I am planning is to simulate car parking. Because private car usage is now dependant exclusively on journey times, I suspect that too high a proportion of people will use private cars (with the result that player transport will be under-utilised) unless limits on car parking are simulated, which is, in real life, a very significant incentive to use public transport in the largest of cities. Each building will have a setting determining whether it has unlimited, limited (and, if so, how many) or no car parking spaces. Car parking spaces will be defined as vehicle journeys ending in that building per month, multiplied by a factor designed to simulate the fact that average car occupancy is greater than 1. When the car parking spaces in that building have run out, no more private car journeys can terminate in that building that month: passengers must either walk or take public transport unless there is a nearby public car park (more on which below). The idea is for larger buildings to have proportionately fewer car parking spaces than smaller buildings (on average) so that higher density cities are realistically simulated with more restricted car parking. I also wonder whether I might borrow (and adapt) an idea from Sim City 4 and have a per city setting to allow or disallow street parking: when allowed, each building gains extra car parking spaces (even if its base allowance is zero), but congestion in the city is increased.
Aside from car parking in buildings, which is private car parking (in that the spaces will only be usable by passengers whose journeys terminate in those buildings), I plan to add public car parks, which can be built by players. Public car parks (which I think should probably be coded as a derivative of a stop or station extension building) will also have a limited capacity, but will allow any private car journey to terminate there: the passengers can then walk from the car park to the destination building, or a nearby (or even connected) public transport stop to continue their journeys. This will allow for park and ride facilities as well as station car parks allowing stations (and airports, docks, etc.) to have a much expanded range for motorists.
As an aside, I am aware that Kieron has hinted that he is planning to code some system of car ferries for Standard. He has not revealed how he plans to implement this system, but it would be interesting to see whether this can be made to fit in with this model of private car traffic such that passengers could drive to a ferry terminal, take their car on a ferry, and continue to drive to their destinations provided that there are adequate road links.
Much has already been written about the details of
calibrating the number of passengers generated, but things need to be considered more expansively than this, as the development and relative density of villages, towns and cities is highly relevant to this, too. On development, the plan is for the pattern of city development to be influenced heavily by transport. Each building will record the proportion of successful journeys made from it (subdivided into types of journey; this part is already implemented in the walking-passengers branch). When a city tries to build a new building, it will strongly favour locations that are next to other buildings with high success rates. Likewise, buildings with high success rates will be the first to be upgraded to higher levels. Higher level buildings will not be able to develop at all unless certain minimum thresholds of success rates are met, which will be higher the greater the level of the building. This system will not replace the cityrules.tab system (as that determines the structure of cities, which is a different thing), but will replace the existing rules causing higher density buildings to be built near the geographical centre of cities, and also the rule that larger cities grow faster. The reason for this is that both of those rules are simply proxies for the fact that larger cities, and areas near the centre of cities, tend to be better connected to other larger buildings (which are already favoured as passenger destinations over smaller buildings, even in Standard), and that this better connectivity is the reason for the greater development. This system will simulate the rapid expanse of towns following the introduction of urban railways, and the sort of suburban sprawl associated with high car usage (as increases in residential population will by preference be handled by new low density buildings over upgrading existing buildings). It will also simulate the fact that there was a very real limit on the size of towns and the placement of residential buildings when people could only get to work by walking.
What I have not yet quite worked out is how best to deal with overall city growth, and in particular, whether to continue with broadly the existing system of having cities grow in proportion to the overall level of transport and electricity provision, or whether to have some system whereby people will move to the better cities in preference to the less well connected cities, overall population growth being pre-determined (but, if that is done, it is hard to see how to avoid having only one city having all the growth).
Better to simulate journey patterns, I plan to categorise passenger destinations into residential, commercial (which will include attractions and consumer industries such as shops) and industrial (which will include all non-consumer industries), and borrowing (and probably adapting) the proportions from the original Sim City, have differing proportions of journeys go from different sorts of building. All outward journeys will go from residential buildings (this will avoid having to step commercial and industrial buildings, which will reduce computational load; this will require recalibration of my passenger generation calculations, however), and all journeys will generate a return journey (currently, only out of town journeys generate a return). Some journeys will also create an onward journey: for example, a residential to commercial journey might generate an onward journey from the destination building to another commercial building (and both parts of the journey will also generate a return journey). This is to compensate for not generating passengers afresh at commercial and industrial buildings. Passengers (always originating at residential buildings) will be far more likely to have destinations that are commercial and industrial buildings than other residential buildings, and onward journeys will likewise be weighted.
Passenger journeys will be of two sorts (to replace the current division of short, medium range, and long distance: this abolition is discussed furhter below): journeys to work and other journeys. Each different sort of journey will have a different journey time tolerance range, specified in simuconf.tab. The plan is for journeys to work to have a narrower range of tolerances (perhaps 20 - 75 minutes), whereas other journeys will have a wider range of tolerances. Onward journeys will always be counted a non-work journey. The success rates of these different sorts of journeys will be measured separately for each building. Building new or upgrading existing residential buildings will depend more heavily on success rates at journeys to work (as, for the most part, people move to find work and access to other amenities is more of a luxury), while commercial buildings will care more about other journeys (as they need customers even more than workers). Industrial buildings will also care about journeys to work more than other journeys, as they need a good workforce, but are less dependant on having customers actually visit them. Industrial city buildings (i.e., not industries that can be supplied by a player) sit in a somewhat odd position: there is much to be said for having the growth of these depend heavily on the success of full industries in the town (so that industrial city buildings are more likely to be built in towns with well connected industries than towns with no or badly connected industries). Indeed, it might be helpful to have a radius of influence around full industries which attract industrial city buildings in proportion to their success. This would have the effect of giving towns a distinctive growth pattern: industries are placed randomly (one day, it would be good to have their placement depend on resources), which attract residents to work there - if they are well connected (the industry boost function will be useful here). The residents provide customers for commerce, which also provides more jobs for residents, and, if everything is well connected, a positive feedback cycle will emerge. It will be sensible in the light of this to have all but primary industries (farms, fisheries, mines, quarries, etc.) located in towns.
The measure of a town's population also needs to adapt to take into account the above: instead of a single population figure, we need to adopt the practice of Sim City 4 and have a separate figure for population (based on the residential buildings) and jobs (based on the commercial and industrial buildings). This, too, will require some recalibration of my passenger generation figures. With this system, it will not much matter that the jobs and population in a single city do not match, as, if they are well connected enough, people can commute to a neighbouring city for work.
As mentioned above, I plan to abolish the system of classing journeys as long-distance, mid-range and local. The idea of having this system was to simulate the fact that most passengers travel to local destinations. This is true enough, but this is only because journeys to local destinations take less time than journeys to far away destinations, and we already simulate journey time: there is little point in adopting an heuristic to represent something that is already simulated in detail. All that needs to be done is to have a weighted system for the journey time tolerances (as discussed elsewhere to ensure that the greater proportion by far of tolerances are at the lower end of the range) so that it is no longer necessary to break them down into three linear ranges, and to allow a much larger number of alternative destinations so that passengers are permitted to have many retries to select a viable destination within range, where that range is based on journey time. There is much to be said for having the number of alternative destinations partly set by a formula based on the size of the map (x destinations per 1,000 sq. km, for example). Some careful work will need to be done to ensure that these settings produce realistic proportions of passengers desiring to reach particular locations and that broadly match real life figures as to the distances of their journeys.
This set of changes will hopefully allow for a far more realistic simulation of passenger transport (and urban development, for that matter), and will hopefully alleviate some of the difficulties in passenger transport currently encountered in present versions of Simutrans-Experimental (and a side effect of more accurate tolerances will be far fewer passengers travelling, which should both directly and indirectly improve in-game performance).
I should be very interested in and grateful for people's thoughts on these features so that they can be refined and polished before being included.