Fixup PickupDelivery

This commit is contained in:
Corentin Le Molgat
2019-01-16 14:16:35 +01:00
parent fbc6f4c4da
commit cce5710487
4 changed files with 30 additions and 28 deletions

View File

@@ -118,18 +118,19 @@ public class VrpPickupDelivery {
// Define cost of each arc.
// [START arc_cost]
int transitCostIndex = routing.RegisterTransitCallback(
int transitCallbackIndex = routing.RegisterTransitCallback(
(long fromIndex, long toIndex) => {
// Convert from routing variable Index to distance matrix NodeIndex.
var fromNode = manager.IndexToNode(fromIndex);
var toNode = manager.IndexToNode(toIndex);
return data.GetDistanceMatrix()[fromNode, toNode]; }
);
routing.SetArcCostEvaluatorOfAllVehicles(transitCostIndex);
routing.SetArcCostEvaluatorOfAllVehicles(transitCallbackIndex);
// [END arc_cost]
// Add Distance constraint.
// [START distance_constraint]
routing.AddDimension(transitCostIndex, 0, 3000,
routing.AddDimension(transitCallbackIndex, 0, 3000,
true, // start cumul to zero
"Distance");
RoutingDimension distanceDimension = routing.GetMutableDimension("Distance");

View File

@@ -82,18 +82,18 @@ public class VrpPickupDelivery {
/// two different indices.
static class ManhattanDistance extends LongLongToLong {
public ManhattanDistance(DataModel data, RoutingIndexManager manager) {
// precompute distance between location to have distance callback in O(1)
distanceMatrix_ = data.distanceMatrix;
indexManager_ = manager;
distanceMatrix = data.distanceMatrix;
indexManager = manager;
}
@Override
public long run(long fromIndex, long toIndex) {
int fromNode = indexManager_.indexToNode(fromIndex);
int toNode = indexManager_.indexToNode(toIndex);
return distanceMatrix_[fromNode][toNode];
// Convert from routing variable Index to distance matrix NodeIndex.
int fromNode = indexManager.indexToNode(fromIndex);
int toNode = indexManager.indexToNode(toIndex);
return distanceMatrix[fromNode][toNode];
}
private final long[][] distanceMatrix_;
private final RoutingIndexManager indexManager_;
private final long[][] distanceMatrix;
private final RoutingIndexManager indexManager;
}
// [END manhattan_distance]
@@ -144,13 +144,13 @@ public class VrpPickupDelivery {
// Define cost of each arc.
// [START arc_cost]
LongLongToLong distanceEvaluator = new ManhattanDistance(data, manager);
int transitCostIndex = routing.registerTransitCallback(distanceEvaluator);
routing.setArcCostEvaluatorOfAllVehicles(transitCostIndex);
int transitCallbackIndex = routing.registerTransitCallback(distanceEvaluator);
routing.setArcCostEvaluatorOfAllVehicles(transitCallbackIndex);
// [END arc_cost]
// Add Distance constraint.
// [START distance_constraint]
routing.addDimension(transitCostIndex, 0, 3000,
routing.addDimension(transitCallbackIndex, 0, 3000,
true, // start cumul to zero
"Distance");
RoutingDimension distanceDimension = routing.getMutableDimension("Distance");

View File

@@ -140,17 +140,19 @@ void VrpGlobalSpan() {
// Define cost of each arc.
// [START arc_cost]
const int transit_cost_id = routing.RegisterTransitCallback(
const int transit_callback_index = routing.RegisterTransitCallback(
[&data, &manager](int64 from_index, int64 to_index) -> int64 {
return data.distance_matrix[manager.IndexToNode(from_index).value()]
[manager.IndexToNode(to_index).value()];
// Convert from routing variable Index to distance matrix NodeIndex.
auto from_node = manager.IndexToNode(from_index).value();
auto to_node = manager.IndexToNode(to_index).value();
return data.distance_matrix[from_node][to_node];
});
routing.SetArcCostEvaluatorOfAllVehicles(transit_cost_id);
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index);
// [END arc_cost]
// Add Distance constraint.
// [START distance_constraint]
routing.AddDimension(transit_cost_id, // transit callback
routing.AddDimension(transit_callback_index, // transit callback
0, // no slack
3000, // vehicle maximum travel distance
true, // start cumul to zero

View File

@@ -120,12 +120,12 @@ def print_solution(data, manager, routing, assignment):
plan_output = 'Route for vehicle {}:\n'.format(vehicle_id)
route_distance = 0
while not routing.IsEnd(index):
plan_output += ' {} ->'.format(manager.IndexToNode(index))
plan_output += ' {} -> '.format(manager.IndexToNode(index))
previous_index = index
index = assignment.Value(routing.NextVar(index))
route_distance += routing.GetArcCostForVehicle(
previous_index, index, vehicle_id)
plan_output += ' {}\n'.format(manager.IndexToNode(index))
plan_output += '{}\n'.format(manager.IndexToNode(index))
plan_output += 'Distance of the route: {}m\n'.format(route_distance)
print(plan_output)
total_distance += route_distance
@@ -143,9 +143,7 @@ def main():
# Create the routing index manager.
# [START index_manager]
manager = pywrapcp.RoutingIndexManager(
len(data['distance_matrix']),
data['num_vehicles'],
data['depot'])
len(data['distance_matrix']), data['num_vehicles'], data['depot'])
# [END index_manager]
# Create Routing Model.
@@ -158,19 +156,20 @@ def main():
# [START arc_cost]
def distance_callback(from_index, to_index):
"""Returns the manhattan distance between the two nodes."""
# Convert from routing variable Index to distance matrix NodeIndex.
from_node = manager.IndexToNode(from_index)
to_node = manager.IndexToNode(to_index)
return data['distance_matrix'][from_node][to_node]
transit_cost_id = routing.RegisterTransitCallback(distance_callback)
routing.SetArcCostEvaluatorOfAllVehicles(transit_cost_id)
transit_callback_index = routing.RegisterTransitCallback(distance_callback)
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)
# [END arc_cost]
# Add Distance constraint.
# [START distance_constraint]
dimension_name = 'Distance'
routing.AddDimension(
transit_cost_id,
transit_callback_index,
0, # no slack
3000, # vehicle maximum travel distance
True, # start cumul to zero
@@ -214,4 +213,4 @@ def main():
if __name__ == '__main__':
main()
# [END program]
# [END program]