void list_note(list_t * list) { int i, move; ASSERT(list_is_ok(list)); for (i = 0; i < list->size; i++) { move = list->move[i]; ASSERT(move_is_ok(move)); list->value[i] = -move_order(move); } }
/* * from_truck trying to make from_truck's duration smaller * - maybe all orders can be moved * - if that is the case, the from_truck could be removed * * Deleting an order on the from_truck * - number of truck remains the same * - from_truk duration() can not get larger * - the overall duration can get larger * */ bool Optimize::move_reduce_cost(size_t from_pos, size_t to_pos) { pgassert(to_pos < from_pos); auto from_truck = fleet[from_pos]; auto to_truck = fleet[to_pos]; auto moved(false); auto orders(from_truck.orders_in_vehicle); while (!orders.empty()) { /* * get the order that decreases the duration the most * (there is always a worse) */ auto order = from_truck.get_worse_order(orders); orders.erase(order.id()); /* * insert it in the next truck */ to_truck.insert(order); if (to_truck.is_feasable()) { problem->log << "\n Move order " << order.id() << " from truck " << from_truck.id() << " to truck " << to_truck.id(); #ifndef NDEBUG problem->dbg_log << "\nMove before:"; problem->dbg_log << "\n" << fleet[to_pos].tau(); problem->dbg_log << "\n" << fleet[from_pos].tau(); #endif from_truck.erase(order); move_order(order, fleet[from_pos], fleet[to_pos]); moved = true; save_if_best(); #ifndef NDEBUG problem->dbg_log << "\nMove after:"; problem->dbg_log << "\n" << fleet[to_pos].tau(); problem->dbg_log << "\n" << fleet[from_pos].tau(); #endif } } return moved; }
/* * from_truck trying to make from_truck's duration smaller * - maybe all orders can be moved * - if that is the case, the from_truck could be removed * * Deleting an order on the from_truck * - number of truck remains the same * - from_truk duration() can not get larger * - the overall duration can get larger * */ bool Optimize::move_reduce_cost( Vehicle_pickDeliver &from, Vehicle_pickDeliver &to) { auto from_truck = from; auto to_truck = to; /* * don't move from a real truck to a phoney truck */ if (!from_truck.is_phony() && to_truck.is_phony()) { return false; } #if 0 from.id() > to.id() ? to : from; #endif size_t from_pos = 0; size_t to_pos = 0; for (; from_pos < fleet.size() && fleet[from_pos].idx() != from_truck.idx() ; ++from_pos) { } pgassert(from_pos < fleet.size()); for (; to_pos < fleet.size() && fleet[to_pos].idx() != to_truck.idx() ; ++to_pos) { } pgassert(to_pos < fleet.size()); auto moved = false; auto from_orders = from_truck.orders_in_vehicle(); while (!from_orders.empty()) { /* * removing an order decreases the duration */ auto order = from_truck.orders()[from_orders.front()]; from_orders -= order.idx(); /* * insert it in the "to" truck */ to_truck.insert(order); if (to_truck.is_feasable()) { msg.log << "\n Move order " << order.pickup().id() << " from truck " << from_truck.idx() << " to truck " << to_truck.idx(); #ifndef NDEBUG msg.dbg_log << "\nMove before:"; msg.dbg_log << "\n" << fleet[to_pos].tau(); msg.dbg_log << "\n" << fleet[from_pos].tau(); #endif #if 1 from_truck.erase(order); #else to_truck.insert(order); move_order(order, fleet[from_pos], fleet[to_pos]); #endif moved = true; save_if_best(); #ifndef NDEBUG msg.dbg_log << "\nMove after:"; msg.dbg_log << "\n" << fleet[to_pos].tau(); msg.dbg_log << "\n" << fleet[from_pos].tau(); #endif } else { to_truck.erase(order); } } return moved; }