Fixup PickupDelivery
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user