@@ -87,10 +87,14 @@ Vehicle_pickDeliver::Vehicle_pickDeliver(
8787 double factor) :
8888 Vehicle (id, kind, starting_site, ending_site, p_capacity, p_speed, factor),
8989 cost ((std::numeric_limits<double >::max)()) {
90+ #if 0
9091 ENTERING();
92+ #endif
9193 m_orders_in_vehicle.clear ();
9294 invariant ();
95+ #if 0
9396 EXITING();
97+ #endif
9498 }
9599
96100
@@ -264,6 +268,7 @@ Vehicle_pickDeliver::do_while_feasable(
264268 msg.log << "m_feasable_orders" << m_feasable_orders << "\n";
265269#endif
266270 auto current_feasable = m_feasable_orders * unassigned;
271+ bool inserted = false ;
267272
268273 while (!current_feasable.empty ()) {
269274#if 0
@@ -298,8 +303,7 @@ Vehicle_pickDeliver::do_while_feasable(
298303 insert (order);
299304 break ;
300305 case OneDepot:
301- order = m_orders[m_orders.find_best_I (current_feasable)];
302- semiLIFO (order);
306+ inserted = semiLIFO (order);
303307 break ;
304308 default : pgassert (false );
305309 }
@@ -310,7 +314,7 @@ Vehicle_pickDeliver::do_while_feasable(
310314
311315 if (!is_feasable ()) {
312316 erase (order);
313- } else {
317+ } else if ((kind != OneDepot) || (kind == OneDepot && inserted)) {
314318 assigned += order.idx ();
315319 unassigned -= order.idx ();
316320 if (kind == BestBack) {
@@ -417,123 +421,75 @@ Vehicle_pickDeliver::is_order_feasable(const Order &order) const {
417421 return test_truck.is_feasable ();
418422}
419423
420- void
424+ bool
421425Vehicle_pickDeliver::semiLIFO (const Order &order) {
422- ENTERING ();
423426 invariant ();
424427 pgassert (!has_order (order));
425428
426- auto pick_pos (position_limits (order.pickup ()));
427- pgassert (pick_pos.first == 1 );
428- pick_pos.second = 1 ;
429- auto deliver_pos (position_limits (order.delivery ()));
430- #if 1
431- std::ostringstream err_log;
432- msg.log << " \n\t pickup limits (low, high) = ("
433- << pick_pos.first << " , "
434- << pick_pos.second << " ) "
435- << " \n\t deliver limits (low, high) = ("
436- << deliver_pos.first << " , "
437- << deliver_pos.second << " ) "
438- << " \n original" << tau ();
439- #endif
429+ /*
430+ * Insert pick up as first picked
431+ */
432+ Vehicle::insert (1 , order.pickup ());
440433
441- if (pick_pos.second < pick_pos.first ) {
442- /* pickup generates twv evrywhere,
443- * so put the order as last */
444- push_back (order);
445- return ;
446- }
434+ auto deliver_pos (drop_position_limits (order.delivery ()));
447435
448- if (deliver_pos.second < deliver_pos.first ) {
449- /* delivery generates twv evrywhere,
450- * so put the order as last */
451- push_back (order);
452- return ;
453- }
454436 /*
455- * Because delivery positions were estimated without
456- * the pickup:
457- * - increase the upper limit position estimation
437+ * delivery generates twv in all positions
458438 */
459- ++deliver_pos.second ;
439+ if (deliver_pos.second < deliver_pos.first ) {
440+ /*
441+ * Remove inserted pickup
442+ */
443+ Vehicle::erase (1 );
444+ invariant ();
445+ return false ;
446+ }
460447
448+ pgassert (!has_order (order));
449+
450+ while (deliver_pos.first <= deliver_pos.second ) {
451+ Vehicle::insert (deliver_pos.second , order.delivery ());
452+
453+ if (is_feasable () && !m_path[deliver_pos.second + 1 ].is_pickup ()) {
454+ /*
455+ * Found a position to insert the delivery
456+ */
461457
462- auto d_pos_backup (deliver_pos);
463- auto best_pick_pos = m_path.size ();
464- auto best_deliver_pos = m_path.size () + 1 ;
465- auto current_duration (duration ());
466- auto min_delta_duration = (std::numeric_limits<double >::max)();
467- auto found (false );
468- pgassertwm (!has_order (order), err_log.str ());
469- while (pick_pos.first <= pick_pos.second ) {
470- #ifndef NDEBUG
471- err_log << " \n\t pickup cycle limits (low, high) = ("
472- << pick_pos.first << " , "
473- << pick_pos.second << " ) " ;
474- #endif
475- Vehicle::insert (pick_pos.first , order.pickup ());
476- #ifndef NDEBUG
477- err_log << " \n pickup inserted: " << tau ();
478- #endif
479458
480- while (deliver_pos.first <= deliver_pos.second ) {
481- Vehicle::insert (deliver_pos.first , order.delivery ());
482459 m_orders_in_vehicle += order.idx ();
483- pgassertwm (has_order (order), err_log.str ());
484- #ifndef NDEBUG
485- err_log << " \n delivery inserted: " << tau ();
486- #endif
487- if (is_feasable ()) {
488- pgassert (is_feasable ());
489- auto delta_duration = duration () - current_duration;
490- if (delta_duration < min_delta_duration) {
491- #ifndef NDEBUG
492- err_log << " \n success" << tau ();
493- #endif
494- min_delta_duration = delta_duration;
495- best_pick_pos = pick_pos.first ;
496- best_deliver_pos = deliver_pos.first ;
497- found = true ;
498- }
499- }
500- Vehicle::erase (deliver_pos.first );
501- #ifndef NDEBUG
502- err_log << " \n delivery erased: " << tau ();
503- #endif
504- ++deliver_pos.first ;
460+
461+ /*
462+ * There is one more order in the vehicle
463+ */
464+ pgassert (has_order (order));
465+ pgassert (is_feasable ());
466+ pgassert (!has_cv ());
467+ pgassert (!has_twv ());
468+ pgassert (has_order (order));
469+ invariant ();
470+ return true ;
471+
505472 }
506- Vehicle::erase (pick_pos.first );
507- #ifndef NDEBUG
508- err_log << " \n pickup erased: " << tau ();
509- #endif
510- m_orders_in_vehicle -= order.idx ();
511- pgassertwm (!has_order (order), err_log.str ());
512473
513- deliver_pos = d_pos_backup;
514- #ifndef NDEBUG
515- err_log << " \n\t restoring deliver limits (low, high) = ("
516- << deliver_pos.first << " , "
517- << deliver_pos.second << " ) " ;
518- #endif
519- ++pick_pos.first ;
520- }
521- pgassertwm (!has_order (order), err_log.str ());
522- if (!found) {
523- /* order causes twv
524- * so put the order as last */
525- push_back (order);
526- return ;
474+ /*
475+ * This position in path is not suitable
476+ */
477+ Vehicle::erase (deliver_pos.second );
478+
479+ /*
480+ * got to next position
481+ */
482+ --deliver_pos.second ;
527483 }
528- Vehicle::insert (best_pick_pos, order.pickup ());
529- Vehicle::insert (best_deliver_pos, order.delivery ());
530484
531- m_orders_in_vehicle += order.idx ();
532- pgassertwm (is_feasable (), err_log.str ());
533- pgassertwm (has_order (order), err_log.str ());
534- pgassertwm (!has_cv (), err_log.str ());
485+ /*
486+ * Order could not be inserted
487+ */
488+ Vehicle::erase (1 );
489+
490+ pgassert (!has_order (order));
535491 invariant ();
536- EXITING () ;
492+ return false ;
537493}
538494
539495} // namespace vrp
0 commit comments