today I received this requirement from a partner. I'd like to respond to it on a generic level - maybe some of you can benefit from this:
And here's what I discussed with our optimization DEV team lead Frank:One of our customers has inquired about the possibility of tour optimization with a tanker vehicle problem.
I understand that we can specify a vehicle type to perform routing with restrictions for such a vehicle, but this problem is of a different kind.
Let's say we have a fleet of tanker trucks. Each tanker can have a different capacity; for example, one could be 21 cubic meters and another could be 39 cubic meters.
These tankers have compartments that divide their capacity, so a 39 cubic meter tanker truck has 5 separate chambers.
Our customer would like to optimize in such a way that each of their clients would be assigned a separate chamber for their cargo.
This means that even if the cargo does not fill the chamber completely, the remaining capacity in that chamber would not be available for anything else.
Have you encountered such a problem in the past? If so, do you have any suggestions on how to handle it?
So from my understanding the question refers to
- Routing: “how to ensure that a truck does not drive on roads which are forbidden for his hazardous goods category” - For the routing we can apply truck attributes and specific settings for tunnel codes out of the box.
- Optimal sequence / assignment to truck: “how to handle the set of orders that are on a truck using the model of quantities”
Let's look very close into the quantities vectors of orders and vehicles and maybe other params such as “equipment”.
Probably your customer would also need to consider “stability” of a vehicle but I guess that’s too much for us.
Here’s what I discussed with my team lead optimization Frank. The approach is based on the assumption that each chamber within a vehicle would have the same quantity as all the other chambers on the same vehicle.
The quantities of a TransportOrder in our model are based on a vector of double values and sometimes the challenge is to find a proper design of these values.
We would have to ensure
- that a single order is not matched to a single truck with insufficient capa
- that s set of orders is not matched to a specific truck at the same time if the pattern doesn’t make sense.
- vehicle.q[0] as “the number of available chambers on a truck”, e.g.
small truck with 4 compartments smallTruck.q[0] = 4;
large truck with 5 compartments largeTruck[0] = 5;
As an order is supposed to occupy an exclusive chamber the order requires q[0] = 1;
With this approach we ensure to have not more than 4 orders at the same time on a small vehicle, not more than 5 orders at the same time on a large vehicle. - Let’s use q[1] as “the maximum amount of fuel in a vehicle”: this is to ensure not to load too much fuel at the same time:
smallTruck.q[1] = 21; (4 compartments with 5.25 m³?)
largeTruck.q[1] = 39; (5 compartments with 7.8 m³?)
Example orders:
SmallOrder.q[1] = 4.0qm MediumOrder.q[1] = 6.0 qm LargeOrder.q[1] = 8.0 qm - Though the second criteria would be handy to ensure not to overload a vehicle it does not crosscheck whether the orders volume itself matches a single available chamber. Therefore we could apply some equipment properties (available through the abstract Order base class):
- SmallOrder.requiredVehicleEquipment :[ "SmallOrder" ];
- MediumOrder.requiredVehicleEquipment : [ "MediumOrder" ];
- LargeOrder.requiredVehicleEquipment : [ "LargeOrder" ];
- SmallVehicle.equipment : [ "SmallOrder" ];
- LargeVehicle.equipment : [ "SmallOrder" , "MediumOrder" ];
Bernd