Routing optimization in a humanitarian context
Routing optimization generally solves the Vehicle Routing Problem (a simple example being the more widely known Traveling Salesman Problem). A more complex example would be the distribution of goods by a fleet of multiple vehicles to dozens of locations, where each vehicle has certain time windows in which it can operate and each delivery location has certain time windows in which it can be served (e.g. opening times of a supermarket).
In this Jupyter example we’ll look at atypical humanitarian scenario of distributing medical goods during disaster response following one of the worst tropical cyclones ever been recorded in Africa: Cyclone Idai.
In this scenario, a humanitarian organization shipped much needed medical goods to Beira, Mozambique, which were then dispatched to local vehicles to be delivered across the region. The supplies included vaccinations and medications for water-borne diseases such as Malaria and Cholera, so distribution efficiency was critical to contain disastrous epidemics.
The logistics setup
In total 20 sites were identified in need of the medical supplies, while 3 vehicles were scheduled for delivery. Let’s assume there was only one type of goods, e.g. standard moving boxes full of one medication. (In reality there were dozens of different good types, which can be modelled with the same workflow, but that’d unnecessarily bloat this example).
The vehicles were all located in the port of Beira and had the same following constraints:
- operation time windows from 8:00 to 20:00
- loading capacity of 300 [arbitrary unit]
To properly describe the vehicle routing problem in algorithmic terms, we have to provide the following information:
- vehicles start/end address: vehicle depot in Beira’s port
- vehicle capacity: 300
- vehicle operational times: 08:00 – 20:00
- service location: delivery location
- service time windows: individual delivery location’s time window
- service amount: individual delivery location’s needs
Then we have to only wrap this information into our code and send a request to OpenRouteService optimization service at
For all the details of the example see: https://openrouteservice.org/disaster-optimization/