Finalization Type
The Finalization Type is a post-processing instruction that fine-tunes the exact scheduled time for a stop after the optimal route has already been determined.
It does not change the sequence of stops in a route, but it adjusts when a vehicle is scheduled to arrive at a node within its available time window. This allows planners to control for preferences like minimizing vehicle waiting time or prioritizing early arrivals.
This setting is applied on a per-node basis using the finalization_type property.
How Finalization Type Works
Once the optimization engine has found the most efficient sequence of stops for a vehicle, the finalization step adjusts the arrival times based on one of two settings:
max: Schedule as late as possible. The optimizer pushes the scheduled arrival time to the latest possible moment within the node's time window.min: Schedule as early as possible. The optimizer sets the scheduled arrival time to the earliest possible moment.
Value for Planners and Impact on Routes
The finalization_type provides a powerful tool for planners to align route execution with specific business goals without altering the fundamental efficiency of the route itself.
-
For Planners:
- Minimize Slack:
maxis the key to reducing costly vehicle and driver idle time. It creates a more "just-in-time" schedule. - Improve Customer Service:
mincan be used to meet the expectations of customers who want their service as early as possible. - Operational Flexibility: It allows for fine-grained control over the schedule on a stop-by-stop basis.
- Minimize Slack:
-
Impact on Routes:
- No change in stop sequence: The actual path the vehicle takes remains the same.
- Adjusts slack and arrival times: Its primary impact is redistributing slack within the route. It can shift waiting time from one stop to another or eliminate it entirely by scheduling a previous stop later.
A Concrete Example
Consider a single vehicle route with two drop-off stops:
- Stop A: Time Window from 9:00 AM to 10:00 AM.
- Stop B: Time Window from 11:00 AM to 12:00 PM.
The optimizer determines the best route is Depot -> Stop A -> Stop B.
- Travel time from Depot to Stop A is 30 minutes. Vehicle leaves depot at 8:30 AM.
- Earliest arrival at Stop A is 9:00 AM.
- Service at Stop A takes 15 minutes.
- Travel from Stop A to Stop B is 45 minutes.
Scenario 1: No Finalization (Default Behavior)
- Arrive at Stop A: 9:00 AM.
- Depart Stop A: 9:15 AM.
- Arrive at Stop B: 10:00 AM.
- Wait at Stop B: 60 minutes (until the 11:00 AM window opens). This is vehicle slack.
Scenario 2: finalization_type: "max" at Stop A
- The optimizer sees the 60-minute slack at Stop B.
- To minimize this slack, it pushes the schedule for Stop A later.
- New arrival at Stop A: 10:00 AM (the end of its window).
- Depart Stop A: 10:15 AM.
- New arrival at Stop B: 11:00 AM.
- Wait at Stop B: 0 minutes. The slack has been absorbed by arriving later at the earlier stop.
Scenario 3: finalization_type: "min" at Stop A
- The schedule would be the same as the default behavior. The vehicle arrives as early as it can.
- This would be useful if the customer at Stop A prefers the earliest possible delivery.
Example Configuration
Here is a JSON snippet for a node_scheduler request. In this example, the first dropoff node is set to max to minimize potential waiting time before the second stop.
{
"nodes": [
{
"uid": "f0de0001-2024-0731-88ad-05ddd46ce72d",
"booking_uid": "b00c0000-2024-0421-0616-000000000001",
"node_type": "dropoff",
"lat": 1.280097,
"lon": 103.889129,
"open_time_ts": "2026-01-01T09:00:00+00:00",
"close_time_ts": "2026-01-01T10:00:00+00:00",
"service_time": 360,
"demand": { "units": 10 },
"finalization_type": "max"
},
{
"uid": "f0de0001-2024-0731-88ad-05ddd46ce74d",
"booking_uid": "b00c0000-2024-0421-0616-000000000002",
"node_type": "dropoff",
"lat": 1.290097,
"lon": 103.989129,
"open_time_ts": "2026-01-01T11:00:00+00:00",
"close_time_ts": "2026-01-01T12:00:00+00:00",
"service_time": 360,
"demand": { "units": 10 }
}
// ... other nodes and vehicle configuration
]
}
Playground
You can experiment with the Finalization Type concept using the playground below. The example is set up with two drop-off nodes with a time gap between them.
- Try setting the
finalization_typeof the first drop-off node to"max"to see how it reduces the slack time at the second node. - Then, change it to
"min"to see the vehicle arriving as early as possible, resulting in a longer wait at the next stop.