18
18
#include < limits>
19
19
#include < memory>
20
20
#include < random>
21
- #include < set>
22
21
#include < string>
23
22
#include < utility>
23
+ #include < vector>
24
24
25
25
#include " absl/container/btree_set.h"
26
+ #include " absl/random/distributions.h"
27
+ #include " absl/random/random.h"
26
28
#include " absl/strings/str_format.h"
29
+ #include " absl/strings/string_view.h"
30
+ #include " absl/types/span.h"
27
31
#include " ortools/base/logging.h"
32
+ #include " ortools/constraint_solver/constraint_solver.h"
28
33
#include " ortools/constraint_solver/routing.h"
29
34
#include " ortools/constraint_solver/routing_index_manager.h"
30
35
@@ -157,12 +162,17 @@ int64_t StopServiceTimePlusTransition::Compute(NodeIndex from,
157
162
: stop_time_ + transition_time_ (from, to);
158
163
}
159
164
160
- void DisplayPlan (
161
- const RoutingIndexManager& manager, const RoutingModel& routing,
162
- const operations_research::Assignment& plan, bool use_same_vehicle_costs,
163
- int64_t max_nodes_per_group, int64_t same_vehicle_cost,
164
- const operations_research::RoutingDimension& capacity_dimension,
165
- const operations_research::RoutingDimension& time_dimension) {
165
+ void DisplayPlan (const RoutingIndexManager& manager,
166
+ const RoutingModel& routing,
167
+ const operations_research::Assignment& plan,
168
+ bool use_same_vehicle_costs, int64_t max_nodes_per_group,
169
+ int64_t same_vehicle_cost,
170
+ absl::Span<const std::string> dimension_names) {
171
+ std::vector<const operations_research::RoutingDimension*> dimensions;
172
+ for (const std::string& dimension_name : dimension_names) {
173
+ dimensions.push_back (&routing.GetDimensionOrDie (dimension_name));
174
+ }
175
+
166
176
// Display plan cost.
167
177
std::string plan_output = absl::StrFormat (" Cost %d\n " , plan.ObjectiveValue ());
168
178
@@ -207,6 +217,18 @@ void DisplayPlan(
207
217
}
208
218
209
219
// Display actual output for each vehicle.
220
+ const auto str_append_variable =
221
+ [&plan, &plan_output](const IntVar* var, absl::string_view name) {
222
+ if (var == nullptr || !plan.Contains (var)) return ;
223
+ const int64_t var_min = plan.Min (var);
224
+ const int64_t var_max = plan.Max (var);
225
+ if (var_min == var_max) {
226
+ absl::StrAppendFormat (&plan_output, " %s(%d) " , name, var_min);
227
+ } else {
228
+ absl::StrAppendFormat (&plan_output, " %s(%d, %d) " , name, var_min,
229
+ var_max);
230
+ }
231
+ };
210
232
for (int route_number = 0 ; route_number < routing.vehicles ();
211
233
++route_number) {
212
234
int64_t order = routing.Start (route_number);
@@ -215,26 +237,16 @@ void DisplayPlan(
215
237
plan_output += " Empty\n " ;
216
238
} else {
217
239
while (true ) {
218
- operations_research::IntVar* const load_var =
219
- capacity_dimension.CumulVar (order);
220
- operations_research::IntVar* const time_var =
221
- time_dimension.CumulVar (order);
222
- operations_research::IntVar* const slack_var =
223
- routing.IsEnd (order) ? nullptr : time_dimension.SlackVar (order);
224
- if (slack_var != nullptr && plan.Contains (slack_var)) {
225
- absl::StrAppendFormat (
226
- &plan_output, " %d Load(%d) Time(%d, %d) Slack(%d, %d)" ,
227
- manager.IndexToNode (order).value (), plan.Value (load_var),
228
- plan.Min (time_var), plan.Max (time_var), plan.Min (slack_var),
229
- plan.Max (slack_var));
230
- } else {
231
- absl::StrAppendFormat (&plan_output, " %d Load(%d) Time(%d, %d)" ,
232
- manager.IndexToNode (order).value (),
233
- plan.Value (load_var), plan.Min (time_var),
234
- plan.Max (time_var));
240
+ absl::StrAppendFormat (&plan_output, " %d " ,
241
+ manager.IndexToNode (order).value ());
242
+ for (const operations_research::RoutingDimension* dimension : dimensions) {
243
+ str_append_variable (dimension->CumulVar (order), dimension->name ());
244
+ operations_research::IntVar* const slack_var =
245
+ routing.IsEnd (order) ? nullptr : dimension->SlackVar (order);
246
+ str_append_variable (slack_var, dimension->name () + " Slack" );
235
247
}
236
248
if (routing.IsEnd (order)) break ;
237
- plan_output += " -> " ;
249
+ plan_output += " -> " ;
238
250
order = plan.Value (routing.NextVar (order));
239
251
}
240
252
plan_output += " \n " ;
0 commit comments