From 7ab4c1f4380a9ebf86485df6b4746df9260ef9dc Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Mon, 30 Sep 2024 14:30:43 +0200 Subject: [PATCH] routing: Fix parsers export --- ortools/routing/parsers/cvrptw_lib.cc | 57 ++++++++++-------- ortools/routing/parsers/cvrptw_lib.h | 34 +++++------ ortools/routing/samples/cvrp_disjoint_tw.cc | 31 +++++----- ortools/routing/samples/cvrptw.cc | 31 +++++----- .../routing/samples/cvrptw_soft_capacity.cc | 31 +++++----- ortools/routing/samples/cvrptw_with_breaks.cc | 33 +++++----- .../samples/cvrptw_with_precedences.cc | 30 +++++----- .../routing/samples/cvrptw_with_refueling.cc | 60 ++++++++++++------- .../routing/samples/cvrptw_with_resources.cc | 30 +++++----- .../cvrptw_with_stop_times_and_resources.cc | 30 +++++----- .../cvrptw_with_time_dependent_costs.cc | 32 +++++----- 11 files changed, 215 insertions(+), 184 deletions(-) diff --git a/ortools/routing/parsers/cvrptw_lib.cc b/ortools/routing/parsers/cvrptw_lib.cc index 446cb04cb57..d3f85531997 100644 --- a/ortools/routing/parsers/cvrptw_lib.cc +++ b/ortools/routing/parsers/cvrptw_lib.cc @@ -20,9 +20,11 @@ #include #include #include +#include #include "absl/container/btree_set.h" #include "absl/random/distributions.h" +#include "absl/random/random.h" #include "absl/strings/str_format.h" #include "ortools/base/logging.h" #include "ortools/constraint_solver/constraint_solver.h" @@ -158,12 +160,17 @@ int64_t StopServiceTimePlusTransition::Compute(NodeIndex from, : stop_time_ + transition_time_(from, to); } -void DisplayPlan( - const RoutingIndexManager& manager, const RoutingModel& routing, - const operations_research::Assignment& plan, bool use_same_vehicle_costs, - int64_t max_nodes_per_group, int64_t same_vehicle_cost, - const operations_research::RoutingDimension& capacity_dimension, - const operations_research::RoutingDimension& time_dimension) { +void DisplayPlan(const RoutingIndexManager& manager, + const RoutingModel& routing, + const operations_research::Assignment& plan, + bool use_same_vehicle_costs, int64_t max_nodes_per_group, + int64_t same_vehicle_cost, + const std::vector& dimension_names) { + std::vector dimensions; + for (const std::string& dimension_name : dimension_names) { + dimensions.push_back(&routing.GetDimensionOrDie(dimension_name)); + } + // Display plan cost. std::string plan_output = absl::StrFormat("Cost %d\n", plan.ObjectiveValue()); @@ -208,6 +215,18 @@ void DisplayPlan( } // Display actual output for each vehicle. + const auto str_append_variable = + [&plan, &plan_output](const IntVar* var, const std::string& name) { + if (var == nullptr || !plan.Contains(var)) return; + const int64_t var_min = plan.Min(var); + const int64_t var_max = plan.Max(var); + if (var_min == var_max) { + absl::StrAppendFormat(&plan_output, "%s(%d) ", name, var_min); + } else { + absl::StrAppendFormat(&plan_output, "%s(%d, %d) ", name, var_min, + var_max); + } + }; for (int route_number = 0; route_number < routing.vehicles(); ++route_number) { int64_t order = routing.Start(route_number); @@ -216,26 +235,16 @@ void DisplayPlan( plan_output += "Empty\n"; } else { while (true) { - operations_research::IntVar* const load_var = - capacity_dimension.CumulVar(order); - operations_research::IntVar* const time_var = - time_dimension.CumulVar(order); - operations_research::IntVar* const slack_var = - routing.IsEnd(order) ? nullptr : time_dimension.SlackVar(order); - if (slack_var != nullptr && plan.Contains(slack_var)) { - absl::StrAppendFormat( - &plan_output, "%d Load(%d) Time(%d, %d) Slack(%d, %d)", - manager.IndexToNode(order).value(), plan.Value(load_var), - plan.Min(time_var), plan.Max(time_var), plan.Min(slack_var), - plan.Max(slack_var)); - } else { - absl::StrAppendFormat(&plan_output, "%d Load(%d) Time(%d, %d)", - manager.IndexToNode(order).value(), - plan.Value(load_var), plan.Min(time_var), - plan.Max(time_var)); + absl::StrAppendFormat(&plan_output, "%d ", + manager.IndexToNode(order).value()); + for (const RoutingDimension* dimension : dimensions) { + str_append_variable(dimension->CumulVar(order), dimension->name()); + operations_research::IntVar* const slack_var = + routing.IsEnd(order) ? nullptr : dimension->SlackVar(order); + str_append_variable(slack_var, dimension->name() + "Slack"); } if (routing.IsEnd(order)) break; - plan_output += " -> "; + plan_output += "-> "; order = plan.Value(routing.NextVar(order)); } plan_output += "\n"; diff --git a/ortools/routing/parsers/cvrptw_lib.h b/ortools/routing/parsers/cvrptw_lib.h index b855d174cab..18c7c7d9a0e 100644 --- a/ortools/routing/parsers/cvrptw_lib.h +++ b/ortools/routing/parsers/cvrptw_lib.h @@ -93,44 +93,42 @@ class RandomDemand { // Service time (proportional to demand) + transition time callback. class ServiceTimePlusTransition { public: - ServiceTimePlusTransition( - int64_t time_per_demand_unit, - operations_research::RoutingNodeEvaluator2 demand, - operations_research::RoutingNodeEvaluator2 transition_time); + ServiceTimePlusTransition(int64_t time_per_demand_unit, + RoutingNodeEvaluator2 demand, + RoutingNodeEvaluator2 transition_time); int64_t Compute(RoutingIndexManager::NodeIndex from, RoutingIndexManager::NodeIndex to) const; private: const int64_t time_per_demand_unit_; - operations_research::RoutingNodeEvaluator2 demand_; - operations_research::RoutingNodeEvaluator2 transition_time_; + RoutingNodeEvaluator2 demand_; + RoutingNodeEvaluator2 transition_time_; }; // Stop service time + transition time callback. class StopServiceTimePlusTransition { public: - StopServiceTimePlusTransition( - int64_t stop_time, const LocationContainer& location_container, - operations_research::RoutingNodeEvaluator2 transition_time); + StopServiceTimePlusTransition(int64_t stop_time, + const LocationContainer& location_container, + RoutingNodeEvaluator2 transition_time); int64_t Compute(RoutingIndexManager::NodeIndex from, RoutingIndexManager::NodeIndex to) const; private: const int64_t stop_time_; const LocationContainer& location_container_; - operations_research::RoutingNodeEvaluator2 demand_; - operations_research::RoutingNodeEvaluator2 transition_time_; + RoutingNodeEvaluator2 demand_; + RoutingNodeEvaluator2 transition_time_; }; // Route plan displayer. // TODO(user): Move the display code to the routing library. -void DisplayPlan( - const operations_research::RoutingIndexManager& manager, - const operations_research::RoutingModel& routing, - const operations_research::Assignment& plan, bool use_same_vehicle_costs, - int64_t max_nodes_per_group, int64_t same_vehicle_cost, - const operations_research::RoutingDimension& capacity_dimension, - const operations_research::RoutingDimension& time_dimension); +void DisplayPlan(const RoutingIndexManager& manager, + const RoutingModel& routing, + const operations_research::Assignment& plan, + bool use_same_vehicle_costs, int64_t max_nodes_per_group, + int64_t same_vehicle_cost, + const std::vector& dimension_names); } // namespace operations_research::routing diff --git a/ortools/routing/samples/cvrp_disjoint_tw.cc b/ortools/routing/samples/cvrp_disjoint_tw.cc index 5e66df3c8db..563de8a7c62 100644 --- a/ortools/routing/samples/cvrp_disjoint_tw.cc +++ b/ortools/routing/samples/cvrp_disjoint_tw.cc @@ -24,34 +24,37 @@ #include #include +#include #include +#include #include #include +#include "absl/flags/flag.h" #include "absl/random/random.h" #include "google/protobuf/text_format.h" -#include "ortools/base/commandlineflags.h" #include "ortools/base/init_google.h" #include "ortools/base/logging.h" -#include "ortools/base/types.h" +#include "ortools/constraint_solver/constraint_solver.h" #include "ortools/routing/index_manager.h" #include "ortools/routing/parameters.h" #include "ortools/routing/parameters.pb.h" #include "ortools/routing/parsers/cvrptw_lib.h" #include "ortools/routing/routing.h" +#include "ortools/routing/types.h" using operations_research::Assignment; -using operations_research::DefaultRoutingSearchParameters; -using operations_research::GetSeed; -using operations_research::LocationContainer; -using operations_research::RandomDemand; -using operations_research::RoutingDimension; -using operations_research::RoutingIndexManager; -using operations_research::RoutingModel; -using operations_research::RoutingNodeIndex; -using operations_research::RoutingSearchParameters; -using operations_research::ServiceTimePlusTransition; using operations_research::Solver; +using operations_research::routing::DefaultRoutingSearchParameters; +using operations_research::routing::GetSeed; +using operations_research::routing::LocationContainer; +using operations_research::routing::RandomDemand; +using operations_research::routing::RoutingDimension; +using operations_research::routing::RoutingIndexManager; +using operations_research::routing::RoutingModel; +using operations_research::routing::RoutingNodeIndex; +using operations_research::routing::RoutingSearchParameters; +using operations_research::routing::ServiceTimePlusTransition; ABSL_FLAG(int, vrp_orders, 100, "Number of nodes in the problem."); ABSL_FLAG(int, vrp_vehicles, 20, "Number of vehicles in the problem."); @@ -189,9 +192,7 @@ int main(int argc, char** argv) { if (solution != nullptr) { DisplayPlan(manager, routing, *solution, absl::GetFlag(FLAGS_vrp_use_same_vehicle_costs), - kMaxNodesPerGroup, kSameVehicleCost, - routing.GetDimensionOrDie(kCapacity), - routing.GetDimensionOrDie(kTime)); + kMaxNodesPerGroup, kSameVehicleCost, {kCapacity, kTime}); } else { LOG(INFO) << "No solution found."; } diff --git a/ortools/routing/samples/cvrptw.cc b/ortools/routing/samples/cvrptw.cc index f30796a4a61..c0ec0973c98 100644 --- a/ortools/routing/samples/cvrptw.cc +++ b/ortools/routing/samples/cvrptw.cc @@ -22,33 +22,36 @@ // to be in meters and times in seconds. #include +#include #include +#include #include #include +#include "absl/flags/flag.h" #include "absl/random/random.h" #include "google/protobuf/text_format.h" -#include "ortools/base/commandlineflags.h" #include "ortools/base/init_google.h" #include "ortools/base/logging.h" -#include "ortools/base/types.h" +#include "ortools/constraint_solver/constraint_solver.h" #include "ortools/routing/index_manager.h" #include "ortools/routing/parameters.h" #include "ortools/routing/parameters.pb.h" #include "ortools/routing/parsers/cvrptw_lib.h" #include "ortools/routing/routing.h" +#include "ortools/routing/types.h" using operations_research::Assignment; -using operations_research::DefaultRoutingSearchParameters; -using operations_research::GetSeed; -using operations_research::LocationContainer; -using operations_research::RandomDemand; -using operations_research::RoutingDimension; -using operations_research::RoutingIndexManager; -using operations_research::RoutingModel; -using operations_research::RoutingNodeIndex; -using operations_research::RoutingSearchParameters; -using operations_research::ServiceTimePlusTransition; +using operations_research::routing::DefaultRoutingSearchParameters; +using operations_research::routing::GetSeed; +using operations_research::routing::LocationContainer; +using operations_research::routing::RandomDemand; +using operations_research::routing::RoutingDimension; +using operations_research::routing::RoutingIndexManager; +using operations_research::routing::RoutingModel; +using operations_research::routing::RoutingNodeIndex; +using operations_research::routing::RoutingSearchParameters; +using operations_research::routing::ServiceTimePlusTransition; ABSL_FLAG(int, vrp_orders, 100, "Number of nodes in the problem"); ABSL_FLAG(int, vrp_vehicles, 20, "Number of vehicles in the problem"); @@ -174,9 +177,7 @@ int main(int argc, char** argv) { if (solution != nullptr) { DisplayPlan(manager, routing, *solution, absl::GetFlag(FLAGS_vrp_use_same_vehicle_costs), - kMaxNodesPerGroup, kSameVehicleCost, - routing.GetDimensionOrDie(kCapacity), - routing.GetDimensionOrDie(kTime)); + kMaxNodesPerGroup, kSameVehicleCost, {kCapacity, kTime}); } else { LOG(INFO) << "No solution found."; } diff --git a/ortools/routing/samples/cvrptw_soft_capacity.cc b/ortools/routing/samples/cvrptw_soft_capacity.cc index cc9e0234ce1..8b5f95b8690 100644 --- a/ortools/routing/samples/cvrptw_soft_capacity.cc +++ b/ortools/routing/samples/cvrptw_soft_capacity.cc @@ -21,33 +21,36 @@ // distance. Distances are assumed to be in meters and times in seconds. #include +#include #include +#include #include #include +#include "absl/flags/flag.h" #include "absl/random/random.h" #include "google/protobuf/text_format.h" -#include "ortools/base/commandlineflags.h" #include "ortools/base/init_google.h" #include "ortools/base/logging.h" -#include "ortools/base/types.h" +#include "ortools/constraint_solver/constraint_solver.h" #include "ortools/routing/index_manager.h" #include "ortools/routing/parameters.h" #include "ortools/routing/parameters.pb.h" #include "ortools/routing/parsers/cvrptw_lib.h" #include "ortools/routing/routing.h" +#include "ortools/routing/types.h" using operations_research::Assignment; -using operations_research::DefaultRoutingSearchParameters; -using operations_research::GetSeed; -using operations_research::LocationContainer; -using operations_research::RandomDemand; -using operations_research::RoutingDimension; -using operations_research::RoutingIndexManager; -using operations_research::RoutingModel; -using operations_research::RoutingNodeIndex; -using operations_research::RoutingSearchParameters; -using operations_research::ServiceTimePlusTransition; +using operations_research::routing::DefaultRoutingSearchParameters; +using operations_research::routing::GetSeed; +using operations_research::routing::LocationContainer; +using operations_research::routing::RandomDemand; +using operations_research::routing::RoutingDimension; +using operations_research::routing::RoutingIndexManager; +using operations_research::routing::RoutingModel; +using operations_research::routing::RoutingNodeIndex; +using operations_research::routing::RoutingSearchParameters; +using operations_research::routing::ServiceTimePlusTransition; ABSL_FLAG(int, vrp_orders, 100, "Number of nodes in the problem."); ABSL_FLAG(int, vrp_vehicles, 20, "Number of vehicles in the problem."); @@ -198,9 +201,7 @@ int main(int argc, char** argv) { if (solution != nullptr) { DisplayPlan(manager, routing, *solution, absl::GetFlag(FLAGS_vrp_use_same_vehicle_costs), - kMaxNodesPerGroup, kSameVehicleCost, - routing.GetDimensionOrDie(kCapacity), - routing.GetDimensionOrDie(kTime)); + kMaxNodesPerGroup, kSameVehicleCost, {kCapacity, kTime}); } else { LOG(INFO) << "No solution found."; } diff --git a/ortools/routing/samples/cvrptw_with_breaks.cc b/ortools/routing/samples/cvrptw_with_breaks.cc index 2b2b0cf4c41..a62a019cd6f 100644 --- a/ortools/routing/samples/cvrptw_with_breaks.cc +++ b/ortools/routing/samples/cvrptw_with_breaks.cc @@ -26,38 +26,41 @@ // day or two smaller ones which can be taken during a longer period of the day. #include +#include #include +#include #include #include +#include "absl/flags/flag.h" #include "absl/random/random.h" #include "absl/strings/str_cat.h" #include "google/protobuf/text_format.h" -#include "ortools/base/commandlineflags.h" #include "ortools/base/init_google.h" #include "ortools/base/logging.h" -#include "ortools/base/types.h" +#include "ortools/constraint_solver/constraint_solver.h" #include "ortools/routing/enums.pb.h" #include "ortools/routing/index_manager.h" #include "ortools/routing/parameters.h" #include "ortools/routing/parameters.pb.h" #include "ortools/routing/parsers/cvrptw_lib.h" #include "ortools/routing/routing.h" +#include "ortools/routing/types.h" using operations_research::Assignment; -using operations_research::DefaultRoutingSearchParameters; -using operations_research::FirstSolutionStrategy; -using operations_research::GetSeed; using operations_research::IntervalVar; -using operations_research::LocationContainer; -using operations_research::RandomDemand; -using operations_research::RoutingDimension; -using operations_research::RoutingIndexManager; -using operations_research::RoutingModel; -using operations_research::RoutingNodeIndex; -using operations_research::RoutingSearchParameters; -using operations_research::ServiceTimePlusTransition; using operations_research::Solver; +using operations_research::routing::DefaultRoutingSearchParameters; +using operations_research::routing::FirstSolutionStrategy; +using operations_research::routing::GetSeed; +using operations_research::routing::LocationContainer; +using operations_research::routing::RandomDemand; +using operations_research::routing::RoutingDimension; +using operations_research::routing::RoutingIndexManager; +using operations_research::routing::RoutingModel; +using operations_research::routing::RoutingNodeIndex; +using operations_research::routing::RoutingSearchParameters; +using operations_research::routing::ServiceTimePlusTransition; ABSL_FLAG(int, vrp_orders, 100, "Nodes in the problem."); ABSL_FLAG(int, vrp_vehicles, 20, @@ -227,9 +230,7 @@ int main(int argc, char** argv) { LOG(INFO) << break_interval.Var()->name() << " unperformed"; } } - DisplayPlan(manager, routing, *solution, false, 0, 0, - routing.GetDimensionOrDie(kCapacity), - routing.GetDimensionOrDie(kTime)); + DisplayPlan(manager, routing, *solution, false, 0, 0, {kCapacity, kTime}); } else { LOG(INFO) << "No solution found."; } diff --git a/ortools/routing/samples/cvrptw_with_precedences.cc b/ortools/routing/samples/cvrptw_with_precedences.cc index 12ad737f16a..d70041bdd8f 100644 --- a/ortools/routing/samples/cvrptw_with_precedences.cc +++ b/ortools/routing/samples/cvrptw_with_precedences.cc @@ -23,33 +23,35 @@ #include #include +#include #include #include +#include "absl/flags/flag.h" #include "absl/random/random.h" #include "google/protobuf/text_format.h" -#include "ortools/base/commandlineflags.h" #include "ortools/base/init_google.h" #include "ortools/base/logging.h" -#include "ortools/base/types.h" +#include "ortools/constraint_solver/constraint_solver.h" #include "ortools/graph/graph_builder.h" #include "ortools/routing/index_manager.h" #include "ortools/routing/parameters.h" #include "ortools/routing/parameters.pb.h" #include "ortools/routing/parsers/cvrptw_lib.h" #include "ortools/routing/routing.h" +#include "ortools/routing/types.h" using operations_research::Assignment; -using operations_research::DefaultRoutingSearchParameters; -using operations_research::GetSeed; -using operations_research::LocationContainer; -using operations_research::RandomDemand; -using operations_research::RoutingDimension; -using operations_research::RoutingIndexManager; -using operations_research::RoutingModel; -using operations_research::RoutingNodeIndex; -using operations_research::RoutingSearchParameters; -using operations_research::ServiceTimePlusTransition; +using operations_research::routing::DefaultRoutingSearchParameters; +using operations_research::routing::GetSeed; +using operations_research::routing::LocationContainer; +using operations_research::routing::RandomDemand; +using operations_research::routing::RoutingDimension; +using operations_research::routing::RoutingIndexManager; +using operations_research::routing::RoutingModel; +using operations_research::routing::RoutingNodeIndex; +using operations_research::routing::RoutingSearchParameters; +using operations_research::routing::ServiceTimePlusTransition; ABSL_FLAG(int, vrp_orders, 100, "Nodes in the problem."); ABSL_FLAG(int, vrp_vehicles, 20, @@ -202,9 +204,7 @@ int main(int argc, char** argv) { if (solution != nullptr) { DisplayPlan(manager, routing, *solution, absl::GetFlag(FLAGS_vrp_use_same_vehicle_costs), - kMaxNodesPerGroup, kSameVehicleCost, - routing.GetDimensionOrDie(kCapacity), - routing.GetDimensionOrDie(kTime)); + kMaxNodesPerGroup, kSameVehicleCost, {kCapacity, kTime}); } else { LOG(INFO) << "No solution found."; } diff --git a/ortools/routing/samples/cvrptw_with_refueling.cc b/ortools/routing/samples/cvrptw_with_refueling.cc index 609fcfbbf9e..e74c031af81 100644 --- a/ortools/routing/samples/cvrptw_with_refueling.cc +++ b/ortools/routing/samples/cvrptw_with_refueling.cc @@ -20,36 +20,40 @@ // reaches zero. Fuel consumption is proportional to the distance traveled. #include +#include #include +#include #include +#include "absl/flags/flag.h" #include "absl/random/random.h" #include "google/protobuf/text_format.h" -#include "ortools/base/commandlineflags.h" #include "ortools/base/init_google.h" #include "ortools/base/logging.h" -#include "ortools/base/types.h" +#include "ortools/constraint_solver/constraint_solver.h" #include "ortools/routing/index_manager.h" #include "ortools/routing/parameters.h" #include "ortools/routing/parameters.pb.h" #include "ortools/routing/parsers/cvrptw_lib.h" #include "ortools/routing/routing.h" +#include "ortools/routing/types.h" using operations_research::Assignment; -using operations_research::DefaultRoutingSearchParameters; -using operations_research::GetSeed; -using operations_research::LocationContainer; -using operations_research::RandomDemand; -using operations_research::RoutingDimension; -using operations_research::RoutingIndexManager; -using operations_research::RoutingModel; -using operations_research::RoutingNodeIndex; -using operations_research::RoutingSearchParameters; -using operations_research::ServiceTimePlusTransition; +using operations_research::Solver; +using operations_research::routing::DefaultRoutingSearchParameters; +using operations_research::routing::GetSeed; +using operations_research::routing::LocationContainer; +using operations_research::routing::RandomDemand; +using operations_research::routing::RoutingDimension; +using operations_research::routing::RoutingIndexManager; +using operations_research::routing::RoutingModel; +using operations_research::routing::RoutingNodeIndex; +using operations_research::routing::RoutingSearchParameters; +using operations_research::routing::ServiceTimePlusTransition; -ABSL_FLAG(int, vrp_orders, 100, "Nodes in the problem."); -ABSL_FLAG(int, vrp_vehicles, 20, - "Size of Traveling Salesman Problem instance."); +ABSL_FLAG(int, vrp_orders, 20, "Nodes in the problem."); +ABSL_FLAG(int, vrp_vehicles, 4, + "Size of the Vehicle Routing Problem instance."); ABSL_FLAG(bool, vrp_use_deterministic_random_seed, false, "Use deterministic random seeds."); ABSL_FLAG(std::string, routing_search_parameters, "", @@ -84,6 +88,7 @@ int main(int argc, char** argv) { const int64_t kXMax = 100000; const int64_t kYMax = 100000; const int64_t kSpeed = 10; + const int64_t kRefuelCost = 10; LocationContainer locations( kSpeed, absl::GetFlag(FLAGS_vrp_use_deterministic_random_seed)); for (int location = 0; location <= absl::GetFlag(FLAGS_vrp_orders); @@ -95,7 +100,8 @@ int main(int argc, char** argv) { const int vehicle_cost = routing.RegisterTransitCallback( [&locations, &manager](int64_t i, int64_t j) { return locations.ManhattanDistance(manager.IndexToNode(i), - manager.IndexToNode(j)); + manager.IndexToNode(j)) + + (IsRefuelNode(i) ? kRefuelCost : 0); }); routing.SetArcCostEvaluatorOfAllVehicles(vehicle_cost); @@ -162,9 +168,21 @@ int main(int argc, char** argv) { // Only let slack free for refueling nodes. if (!IsRefuelNode(order) || routing.IsStart(order)) { fuel_dimension.SlackVar(order)->SetValue(0); + } else { + // Ensure that we do not refuel more than the capacity. + Solver* solver = routing.solver(); + solver->AddConstraint(solver->MakeSumLessOrEqual( + {fuel_dimension.SlackVar(order), fuel_dimension.CumulVar(order)}, + kFuelCapacity)); + routing.AddToAssignment(fuel_dimension.SlackVar(order)); } - // Needed to instantiate fuel quantity at each node. - routing.AddVariableMinimizedByFinalizer(fuel_dimension.CumulVar(order)); + // Needed to instantiate fuel quantity at each node. Deciding to refuel as + // much as possible to minimize the risk of running out of fuel. + routing.AddVariableMaximizedByFinalizer(fuel_dimension.CumulVar(order)); + } + for (int vehicle = 0; vehicle < routing.vehicles(); ++vehicle) { + routing.AddVariableMaximizedByFinalizer( + fuel_dimension.CumulVar(routing.End(vehicle))); } // Adding penalty costs to allow skipping orders. @@ -173,7 +191,8 @@ int main(int argc, char** argv) { for (RoutingIndexManager::NodeIndex order = kFirstNodeAfterDepot; order < routing.nodes(); ++order) { std::vector orders(1, manager.NodeToIndex(order)); - routing.AddDisjunction(orders, kPenalty); + routing.AddDisjunction( + orders, IsRefuelNode(manager.NodeToIndex(order)) ? 0 : kPenalty); } // Solve, returns a solution if any (owned by RoutingModel). @@ -184,8 +203,7 @@ int main(int argc, char** argv) { if (solution != nullptr) { DisplayPlan(manager, routing, *solution, /*use_same_vehicle_costs=*/false, /*max_nodes_per_group=*/0, /*same_vehicle_cost=*/0, - routing.GetDimensionOrDie(kCapacity), - routing.GetDimensionOrDie(kTime)); + {kTime, kCapacity, kFuel}); } else { LOG(INFO) << "No solution found."; } diff --git a/ortools/routing/samples/cvrptw_with_resources.cc b/ortools/routing/samples/cvrptw_with_resources.cc index 6c4876975ab..f32c74203db 100644 --- a/ortools/routing/samples/cvrptw_with_resources.cc +++ b/ortools/routing/samples/cvrptw_with_resources.cc @@ -22,35 +22,38 @@ // with variable demands. #include +#include #include +#include #include +#include "absl/flags/flag.h" #include "absl/random/random.h" #include "google/protobuf/text_format.h" -#include "ortools/base/commandlineflags.h" #include "ortools/base/init_google.h" #include "ortools/base/logging.h" -#include "ortools/base/types.h" +#include "ortools/constraint_solver/constraint_solver.h" #include "ortools/routing/index_manager.h" #include "ortools/routing/parameters.h" #include "ortools/routing/parameters.pb.h" #include "ortools/routing/parsers/cvrptw_lib.h" #include "ortools/routing/routing.h" +#include "ortools/routing/types.h" using operations_research::Assignment; -using operations_research::DefaultRoutingSearchParameters; -using operations_research::GetSeed; using operations_research::IntervalVar; using operations_research::IntVar; -using operations_research::LocationContainer; -using operations_research::RandomDemand; -using operations_research::RoutingDimension; -using operations_research::RoutingIndexManager; -using operations_research::RoutingModel; -using operations_research::RoutingNodeIndex; -using operations_research::RoutingSearchParameters; -using operations_research::ServiceTimePlusTransition; using operations_research::Solver; +using operations_research::routing::DefaultRoutingSearchParameters; +using operations_research::routing::GetSeed; +using operations_research::routing::LocationContainer; +using operations_research::routing::RandomDemand; +using operations_research::routing::RoutingDimension; +using operations_research::routing::RoutingIndexManager; +using operations_research::routing::RoutingModel; +using operations_research::routing::RoutingNodeIndex; +using operations_research::routing::RoutingSearchParameters; +using operations_research::routing::ServiceTimePlusTransition; ABSL_FLAG(int, vrp_orders, 100, "Nodes in the problem."); ABSL_FLAG(int, vrp_vehicles, 20, @@ -179,8 +182,7 @@ int main(int argc, char** argv) { if (solution != nullptr) { DisplayPlan(manager, routing, *solution, /*use_same_vehicle_costs=*/false, /*max_nodes_per_group=*/0, /*same_vehicle_cost=*/0, - routing.GetDimensionOrDie(kCapacity), - routing.GetDimensionOrDie(kTime)); + {kCapacity, kTime}); } else { LOG(INFO) << "No solution found."; } diff --git a/ortools/routing/samples/cvrptw_with_stop_times_and_resources.cc b/ortools/routing/samples/cvrptw_with_stop_times_and_resources.cc index cd046c6801f..d4dcb600462 100644 --- a/ortools/routing/samples/cvrptw_with_stop_times_and_resources.cc +++ b/ortools/routing/samples/cvrptw_with_stop_times_and_resources.cc @@ -20,36 +20,39 @@ // to one. #include +#include #include +#include #include +#include "absl/flags/flag.h" #include "absl/random/random.h" #include "absl/strings/str_cat.h" #include "google/protobuf/text_format.h" -#include "ortools/base/commandlineflags.h" #include "ortools/base/init_google.h" #include "ortools/base/logging.h" -#include "ortools/base/types.h" +#include "ortools/constraint_solver/constraint_solver.h" #include "ortools/routing/index_manager.h" #include "ortools/routing/parameters.h" #include "ortools/routing/parameters.pb.h" #include "ortools/routing/parsers/cvrptw_lib.h" #include "ortools/routing/routing.h" +#include "ortools/routing/types.h" using operations_research::Assignment; -using operations_research::DefaultRoutingSearchParameters; -using operations_research::GetSeed; using operations_research::IntervalVar; using operations_research::IntVar; -using operations_research::LocationContainer; -using operations_research::RandomDemand; -using operations_research::RoutingDimension; -using operations_research::RoutingIndexManager; -using operations_research::RoutingModel; -using operations_research::RoutingNodeIndex; -using operations_research::RoutingSearchParameters; using operations_research::Solver; -using operations_research::StopServiceTimePlusTransition; +using operations_research::routing::DefaultRoutingSearchParameters; +using operations_research::routing::GetSeed; +using operations_research::routing::LocationContainer; +using operations_research::routing::RandomDemand; +using operations_research::routing::RoutingDimension; +using operations_research::routing::RoutingIndexManager; +using operations_research::routing::RoutingModel; +using operations_research::routing::RoutingNodeIndex; +using operations_research::routing::RoutingSearchParameters; +using operations_research::routing::StopServiceTimePlusTransition; ABSL_FLAG(int, vrp_stops, 25, "Stop locations in the problem."); ABSL_FLAG(int, vrp_orders_per_stop, 5, "Nodes for each stop."); @@ -209,8 +212,7 @@ int main(int argc, char** argv) { if (solution != nullptr) { DisplayPlan(manager, routing, *solution, /*use_same_vehicle_costs=*/false, /*max_nodes_per_group=*/0, /*same_vehicle_cost=*/0, - routing.GetDimensionOrDie(kCapacity), - routing.GetDimensionOrDie(kTime)); + {kCapacity, kTime}); LOG(INFO) << "Stop intervals:"; for (IntervalVar* const interval : intervals) { if (solution->PerformedValue(interval)) { diff --git a/ortools/routing/samples/cvrptw_with_time_dependent_costs.cc b/ortools/routing/samples/cvrptw_with_time_dependent_costs.cc index 7cfd184859e..72c8a0954c9 100644 --- a/ortools/routing/samples/cvrptw_with_time_dependent_costs.cc +++ b/ortools/routing/samples/cvrptw_with_time_dependent_costs.cc @@ -17,38 +17,37 @@ #include #include #include -#include #include -#include +#include #include +#include "absl/flags/flag.h" #include "absl/functional/bind_front.h" #include "absl/random/random.h" #include "google/protobuf/text_format.h" -#include "ortools/base/commandlineflags.h" #include "ortools/base/init_google.h" #include "ortools/base/logging.h" -#include "ortools/base/types.h" +#include "ortools/constraint_solver/constraint_solver.h" #include "ortools/routing/index_manager.h" #include "ortools/routing/parameters.h" #include "ortools/routing/parameters.pb.h" #include "ortools/routing/parsers/cvrptw_lib.h" #include "ortools/routing/routing.h" -#include "ortools/util/range_query_function.h" +#include "ortools/routing/types.h" #include "ortools/util/step_function.h" using operations_research::Assignment; -using operations_research::DefaultRoutingSearchParameters; -using operations_research::GetSeed; -using operations_research::LocationContainer; -using operations_research::RandomDemand; -using operations_research::RoutingDimension; -using operations_research::RoutingIndexManager; -using operations_research::RoutingModel; -using operations_research::RoutingNodeIndex; -using operations_research::RoutingSearchParameters; -using operations_research::ServiceTimePlusTransition; using operations_research::StepFunction; +using operations_research::routing::DefaultRoutingSearchParameters; +using operations_research::routing::GetSeed; +using operations_research::routing::LocationContainer; +using operations_research::routing::RandomDemand; +using operations_research::routing::RoutingDimension; +using operations_research::routing::RoutingIndexManager; +using operations_research::routing::RoutingModel; +using operations_research::routing::RoutingNodeIndex; +using operations_research::routing::RoutingSearchParameters; +using operations_research::routing::ServiceTimePlusTransition; ABSL_FLAG(int, vrp_orders, 25, "Nodes in the problem."); ABSL_FLAG(int, vrp_vehicles, 10, @@ -239,8 +238,7 @@ int main(int argc, char** argv) { if (solution != nullptr) { DisplayPlan(manager, routing, *solution, /*use_same_vehicle_costs=*/false, /*max_nodes_per_group=*/0, /*same_vehicle_cost=*/0, - routing.GetDimensionOrDie(kCapacity), - routing.GetDimensionOrDie(kTime)); + {kCapacity, kTime, kTimeDependentCost}); } else { LOG(INFO) << "No solution found."; }