Skip to content

Commit fd1456a

Browse files
committed
refining initial solution for OneDepot
1 parent eca9f3e commit fd1456a

9 files changed

Lines changed: 114 additions & 117 deletions

File tree

include/vrp/vehicle.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,8 +344,10 @@ class Vehicle : public Identifier, public PD_problem {
344344

345345

346346
std::pair<POS, POS> position_limits(const Vehicle_node node) const;
347+
std::pair<POS, POS> drop_position_limits(const Vehicle_node node) const;
347348

348349
private:
350+
POS getDropPosLowLimit(const Vehicle_node &node) const;
349351
POS getPosLowLimit(const Vehicle_node &node) const;
350352
POS getPosHighLimit(const Vehicle_node &node) const;
351353
};

include/vrp/vehicle_pickDeliver.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ class Vehicle_pickDeliver : public Vehicle {
162162
* Can generate time window violation
163163
* No capacity violation
164164
*/
165-
void semiLIFO(const Order &order);
165+
bool semiLIFO(const Order &order);
166166

167167
#if 0
168168
void insert_while_compatibleJ(

sql/vrp_basic/_pgr_vrpOneDepot.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ BEGIN
9090
$$' || orders_sql || '$$,
9191
$$' || trucks_sql || '$$,
9292
$$' || $3 || '$$,
93-
max_cycles := 1,
93+
max_cycles := 0,
9494
initial_sol := 7 ); ';
9595

9696
RAISE DEBUG '%', orders_sql;

src/pickDeliver/fleet.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,10 @@ Fleet::release_truck(size_t id) {
7777

7878
Vehicle_pickDeliver
7979
Fleet::get_truck(size_t order) {
80+
#if 0
8081
msg.log << "Available vehicles: " << un_used << "\n";
8182
msg.log << "NOT Available vehicles: " << used << "\n";
83+
#endif
8284
auto idx = un_used.front();
8385

8486
for (const auto i : un_used) {
@@ -155,7 +157,9 @@ Fleet::add_vehicle(
155157
vehicle.capacity,
156158
vehicle.speed,
157159
factor));
160+
#if 0
158161
msg.log << "inserting vehicle: " << m_trucks.back().tau() << "\n";
162+
#endif
159163
pgassert((m_trucks.back().idx() + 1) == m_trucks.size());
160164
pgassert(m_trucks.back().is_ok());
161165
}

src/pickDeliver/optimize.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ Optimize::inter_swap() {
117117
#endif
118118
}
119119
}
120+
pgassert(false);
120121
while (!p_swaps.empty()) {
121122
swapped_f = swap_order() || swapped_f;
122123
}
@@ -188,18 +189,13 @@ Optimize::swap_worse(Vehicle_pickDeliver &to, Vehicle_pickDeliver &from) {
188189
/*
189190
* insert them in the other truck
190191
*/
191-
#if 1
192192
if (this->get_kind() == OneDepot) {
193-
pgassert(false);
194-
from_truck.insert(to_order);
195-
to_truck.insert(from_order);
193+
from_truck.semiLIFO(to_order);
194+
to_truck.semiLIFO(from_order);
196195
} else {
197-
#endif
198196
from_truck.insert(to_order);
199197
to_truck.insert(from_order);
200-
#if 1
201198
}
202-
#endif
203199

204200
if (from_truck.is_feasable() && to_truck.is_feasable()) {
205201
/*
@@ -228,9 +224,9 @@ Optimize::swap_worse(Vehicle_pickDeliver &to, Vehicle_pickDeliver &from) {
228224
#endif
229225
msg.log
230226
<< "\n Found Swap order "
231-
<< from_order.pickup().id()
227+
<< from_order
232228
<< " from truck " << from_truck.idx()
233-
<< " with order " << to_order.pickup().id()
229+
<< " with order " << to_order
234230
<< " of truck " << to_truck.idx();
235231

236232
swapped = true;

src/pickDeliver/pickDeliver.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ process(
9393
PGR_DBG("total vehicles %ld", total_vehicles);
9494

9595

96+
#if 0
9697
for (size_t i = 0; i < total_pd_orders; i++) {
9798
PGR_DBG("%ld %f pick %f %f %ld - "
9899
"%f %f %f deliver %f %f %ld - %f %f %f ",
@@ -138,7 +139,7 @@ process(
138139

139140
vehicles_arr[i].cant_v);
140141
}
141-
142+
#endif
142143
PGR_DBG("load matrix");
143144
Matrix_cell_t *matrix_cells_arr = NULL;
144145
size_t total_cells = 0;

src/pickDeliver/vehicle.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,45 @@ Vehicle::position_limits(const Vehicle_node node) const {
391391
return std::make_pair(low, high);
392392
}
393393

394+
std::pair<size_t, size_t>
395+
Vehicle::drop_position_limits(const Vehicle_node node) const {
396+
POS high = getPosHighLimit(node);
397+
POS low = getDropPosLowLimit(node);
398+
return std::make_pair(low, high);
399+
}
400+
401+
/*
402+
* start searching from postition low = pos(E)
403+
*
404+
* S 1 2 3 4 5 6 7 ..... E
405+
* node -> E
406+
* node -> ...
407+
* node -> 7
408+
* node -> 6
409+
* node -> 5
410+
* node /-> 4
411+
*
412+
* return low_limit = 5
413+
*
414+
*/
415+
size_t
416+
Vehicle::getDropPosLowLimit(const Vehicle_node &nodeI) const {
417+
invariant();
418+
419+
POS low = 0;
420+
POS high = m_path.size();
421+
POS low_limit = high;
422+
423+
/* J == m_path[low_limit - 1] */
424+
while (low_limit > low
425+
&& m_path[low_limit - 1].is_compatible_IJ(nodeI, speed())
426+
&& !m_path[low_limit - 1].is_pickup()) {
427+
--low_limit;
428+
}
429+
430+
invariant();
431+
return low_limit;
432+
}
394433

395434
/*
396435
* start searching from postition low = pos(E)

src/pickDeliver/vehicle_pickDeliver.cpp

Lines changed: 59 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -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
421425
Vehicle_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\tpickup limits (low, high) = ("
433-
<< pick_pos.first << ", "
434-
<< pick_pos.second << ") "
435-
<< "\n\tdeliver limits (low, high) = ("
436-
<< deliver_pos.first << ", "
437-
<< deliver_pos.second << ") "
438-
<< "\noriginal" << 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\tpickup 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 << "\npickup 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 << "\ndelivery 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 << "\nsuccess" << 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 << "\ndelivery 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 << "\npickup 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\trestoring 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

test/vrp_basic/test.conf

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
'comment' => 'VRP Single depot test for any versions.',
66
'data' => ['../../tools/testers/vrpOneDepot.data'],
77
'tests' => [qw(
8-
doc-pgr_vrpOneDepot
8+
oneDepotWrapper
99
)],
1010
'nottested' => [qw(
11-
oneDepotWrapper
1211
)],
1312
'documentation' => [qw(
1413
doc-pgr_vrpOneDepot

0 commit comments

Comments
 (0)