In this text, an attempt is made to present a simple (the simplest?) version here, and to wait with improvements until Part III. In this section, there will be an exception: The modification presented here is not strictly necessary. Not including it does, however, result in strong artifacts and asymmetries in the traffic dynamics.
A disadvantage of the above code for intersection movement is that certain incoming links always get served earlier than others. A useful way to improve the situation is to go through the incoming links in random sequence. This can be achieved by
{}
typedef multimap<double,Link*> RndLinks ;
RndLinks rnd_links ;
// go through all inLinks, give them a random number, and insert
// them according to it:
for ( VLinks::iterator ll=inLinks_.begin(); ll!=inLinks_.end();
++ll ) {
Link* link = *ll ;
rnd_links.insert( make_pair( myRand(), link ) ) ;
}
// retrieve the inLinks in the order of their random numbers:
for ( RndLinks::iterator ll = rnd_links.begin();
ll != rnd_links.end(); ll++ ) {
Link* inLink = ll->second ;
and then continue as above.
The above algorithm goes through all incoming links and gives them a
random number and then inserts them into the multimap using the random
number as key. A multimap is similar to the map we used
for links and nodes with the only difference that keys do not have to
be unique; this is necessary since it could happen that two random
numbers are identical. The links are then taken out of the multimap
in increasing order of the random number.