28 #ifndef INCLUDE_CPP_COMMON_VRP_VROOM_PROBLEM_HPP_
29 #define INCLUDE_CPP_COMMON_VRP_VROOM_PROBLEM_HPP_
34 #include <unordered_set>
48 #include "structures/vroom/input/input.h"
49 #include "structures/vroom/job.h"
50 #include "structures/vroom/vehicle.h"
75 vroom::TimeWindow(time_window.
tw_open,
81 return vroom::TimeWindow(tw_open, tw_close);
84 std::vector<vroom::TimeWindow>
86 const std::vector<Vroom_time_window_t> &time_windows)
const {
87 std::vector < vroom::TimeWindow > tws;
88 for (
auto time_window : time_windows) {
94 return std::vector<vroom::TimeWindow>(1, vroom::TimeWindow());
114 if (amounts.size()) {
115 for (
auto amount : amounts) {
116 amt.push_back(amount);
119 const unsigned int amount_size =
123 for (
size_t i = 0; i < amounts.size(); i++) {
151 return std::unordered_set <Skill>(skills, skills + count);
170 const std::vector<Vroom_time_window_t> &job_tws)
const {
175 vroom::Skills skills =
177 std::vector<vroom::TimeWindow> time_windows =
179 vroom::Index location_id =
181 return vroom::Job(job.
id, location_id, job.
setup, job.
service, delivery, pickup,
186 const std::vector<Vroom_time_window_t> &job_tws) {
191 const std::vector<Vroom_time_window_t> &jobs_tws) {
192 std::map<Idx, std::vector<Vroom_time_window_t>> job_tws_map;
193 for (
auto job_tw : jobs_tws) {
195 if (job_tws_map.find(
id) == job_tws_map.end()) {
196 job_tws_map[id] = std::vector<Vroom_time_window_t>();
198 job_tws_map[id].push_back(job_tw);
200 for (
auto job :
jobs) {
208 std::vector<Vroom_job_t>(
jobs,
jobs + count),
209 std::vector<Vroom_time_window_t>(jobs_tws, jobs_tws + total_jobs_tws));
229 const std::vector<Vroom_time_window_t> &pickup_tws,
230 const std::vector<Vroom_time_window_t> &delivery_tws)
const {
233 vroom::Skills skills =
235 std::vector<vroom::TimeWindow> p_time_windows =
237 std::vector<vroom::TimeWindow> d_time_windows =
239 vroom::Index p_location_id =
static_cast<vroom::Index
>(
241 vroom::Index d_location_id =
static_cast<vroom::Index
>(
243 vroom::Job pickup = vroom::Job(
244 shipment.
id, vroom::JOB_TYPE::PICKUP, p_location_id,
247 vroom::Job delivery = vroom::Job(
248 shipment.
id, vroom::JOB_TYPE::DELIVERY, d_location_id,
251 return std::make_pair(pickup, delivery);
256 const std::vector<Vroom_time_window_t> &pickup_tws,
257 const std::vector<Vroom_time_window_t> &delivery_tws) {
263 const std::vector <Vroom_time_window_t> &shipments_tws) {
264 std::map<Idx, std::vector<Vroom_time_window_t>> pickup_tws_map;
265 std::map<Idx, std::vector<Vroom_time_window_t>> delivery_tws_map;
266 for (
auto shipment_tw : shipments_tws) {
267 Idx id = shipment_tw.id;
268 if (shipment_tw.kind ==
'p') {
269 if (pickup_tws_map.find(
id) == pickup_tws_map.end()) {
270 pickup_tws_map[id] = std::vector<Vroom_time_window_t>();
272 pickup_tws_map[id].push_back(shipment_tw);
273 }
else if (shipment_tw.kind ==
'd') {
274 if (delivery_tws_map.find(
id) == delivery_tws_map.end()) {
275 delivery_tws_map[id] = std::vector<Vroom_time_window_t>();
277 delivery_tws_map[id].push_back(shipment_tw);
282 delivery_tws_map[shipment.id]);
290 std::vector<Vroom_time_window_t>(shipment_tws, shipment_tws + total_shipment_tws));
309 const std::vector<Vroom_time_window_t> &break_tws)
const {
311 return vroom::Break(v_break.
id, tws, v_break.
service, v_break.
data);
314 std::vector < vroom::Break >
316 const std::vector <Vroom_break_t> &breaks,
317 const std::vector <Vroom_time_window_t> &breaks_tws)
const {
318 std::map<Idx, std::vector<Vroom_time_window_t>> breaks_tws_map;
319 for (
auto break_tw : breaks_tws) {
320 Idx id = break_tw.id;
321 if (breaks_tws_map.find(
id) == breaks_tws_map.end()) {
322 breaks_tws_map[id] = std::vector<Vroom_time_window_t>();
324 breaks_tws_map[id].push_back(break_tw);
326 std::vector < vroom::Break > v_breaks;
327 for (
auto v_break : breaks) {
328 v_breaks.push_back(
get_vroom_break(v_break, breaks_tws_map[v_break.id]));
349 const std::vector<Vroom_break_t> &breaks,
350 const std::vector<Vroom_time_window_t> &breaks_tws)
const {
353 vroom::Skills skills =
355 vroom::TimeWindow time_window =
360 std::optional<vroom::Location> start_id;
361 std::optional<vroom::Location> end_id;
366 if (vehicle.
end_id != -1) {
369 return vroom::Vehicle(vehicle.
id, start_id, end_id,
370 vroom::DEFAULT_PROFILE, capacity, skills, time_window,
377 const std::vector<Vroom_break_t> &breaks,
378 const std::vector<Vroom_time_window_t> &breaks_tws) {
383 const std::vector<Vroom_break_t> &breaks,
384 const std::vector<Vroom_time_window_t> &breaks_tws) {
385 std::map<Idx, std::vector<Vroom_time_window_t>> breaks_tws_map;
386 for (
auto break_tw : breaks_tws) {
387 Idx id = break_tw.id;
388 if (breaks_tws_map.find(
id) == breaks_tws_map.end()) {
389 breaks_tws_map[id] = std::vector<Vroom_time_window_t>();
391 breaks_tws_map[id].push_back(break_tw);
394 std::map<Idx, std::vector<Vroom_break_t>> v_breaks_map;
395 for (
auto v_break : breaks) {
396 Idx v_id = v_break.vehicle_id;
397 if (v_breaks_map.find(v_id) == v_breaks_map.end()) {
398 v_breaks_map[v_id] = std::vector<Vroom_break_t>();
400 v_breaks_map[v_id].push_back(v_break);
404 std::vector<Vroom_break_t> v_breaks = v_breaks_map[vehicle.id];
405 std::vector<Vroom_time_window_t> v_breaks_tws;
406 for (
auto v_break : v_breaks) {
407 std::vector<Vroom_time_window_t> tws = breaks_tws_map[v_break.id];
408 v_breaks_tws.insert(v_breaks_tws.end(), tws.begin(), tws.end());
418 std::vector<Vroom_break_t>(breaks, breaks + total_breaks),
419 std::vector<Vroom_time_window_t>(breaks_tws, breaks_tws + total_breaks_tws));
429 size_t amount_size = vroom_amount.size();
430 for (
size_t i = 0; i < amount_size; i++) {
431 *((*amount) + i) = vroom_amount[i];
437 switch (vroom_job_type) {
438 case vroom::JOB_TYPE::SINGLE:
441 case vroom::JOB_TYPE::PICKUP:
444 case vroom::JOB_TYPE::DELIVERY:
453 switch (step.step_type) {
454 case vroom::STEP_TYPE::START:
457 case vroom::STEP_TYPE::END:
460 case vroom::STEP_TYPE::BREAK:
463 case vroom::STEP_TYPE::JOB:
471 std::vector < Vroom_rt > results;
472 std::vector<vroom::Route> routes = solution.routes;
474 char *empty_desc = strdup(
"{}");
475 for (
auto route : routes) {
478 char *vehicle_data = strdup(route.description.c_str());
479 for (
auto step : route.steps) {
480 Idx task_id = step.id;
482 char *task_data = strdup(step.description.c_str());
484 if (step_type == 1 || step_type == 6) {
485 task_id =
static_cast<Idx>(-1);
486 task_data = empty_desc;
489 size_t load_size = step.load.size();
493 Duration travel_time = step.duration - prev_duration;
494 prev_duration = step.duration;
495 Duration departure = step.arrival + step.setup + step.service + step.waiting_time;
539 std::vector<vroom::Job> unassigned = solution.unassigned;
541 for (
auto job : unassigned) {
543 Idx vehicle_id =
static_cast<Idx>(-1);
546 char *task_data = strdup(job.description.c_str());
569 vroom::Summary summary = solution.summary;
585 summary.waiting_time,
593 std::vector<Vroom_rt>
solve(int32_t exploration_level, int32_t timeout,
594 int32_t loading_time) {
595 std::vector <Vroom_rt> results;
600 const unsigned int amount_size =
602 ?
static_cast<unsigned int>(
m_vehicles[0].capacity.size())
604 vroom::Input problem_instance(amount_size);
607 problem_instance.add_vehicle(vehicle);
609 for (
const auto &job :
m_jobs) {
610 problem_instance.add_job(job);
613 problem_instance.add_shipment(shipment.first, shipment.second);
617 problem_instance.set_durations_matrix(vroom::DEFAULT_PROFILE, std::move(duration_matrix));
618 problem_instance.set_costs_matrix(vroom::DEFAULT_PROFILE, std::move(cost_matrix));
620 unsigned threads = 4;
622 auto solution = problem_instance.solve(
623 static_cast<unsigned>(exploration_level), threads);
626 int timeout_ms = (loading_time <= timeout * 1000) ? (timeout * 1000 - loading_time) : 0;
627 auto solution = problem_instance.solve(
628 static_cast<unsigned>(exploration_level), threads, timeout_ms);
631 }
catch (
const vroom::Exception &ex) {
633 }
catch (
const std::exception &ex) {
650 #endif // INCLUDE_CPP_COMMON_VRP_VROOM_PROBLEM_HPP_