Search space and decision tree
Now that we can enumerate the paths and identify conflicts, we need to build the final decision tree that avoids all conflicts.
InfraExplorer, but currently it’s all over the place.
There’s a refactoring issue,
but we may not have the time to do it.The search space is described as a graph with nodes and edges. Edges are generally one signaling block long, but may be shorter in case of stops.
Generating new edges on a given path follow this sequence:
- The train movement is generated on the new segment (time and speed at each point)
- Conflicts are identified during this time segment
- Openings are identified
- One edge is generated per opening
An “opening” is an available time window between two occupied blocks. When there are several different openings, we get to choose if the new train goes before or after another train or work schedule.
On one given path, we now have a decision tree that looks like this:
Delays
We often need to add delay to the current simulation to actually go through an opening, when the train needs to reach a point later than it could have.
This can be done in several different ways:
- Delaying the train departure
- Lengthening a stop
- Forcing the train to go slower for a while (with something called “engineering allowances”)
We keep track of how much delay we can add at any given point to handle departure and stop changes. For engineering allowances, we’re identifying how much delay we can add if the train slows down then immediately speeds up.