void Optimize::move_duration_based() { auto local_limit(fleet.size()); size_t i(0); sort_by_duration(); problem->log << tau("\nmove duration based"); while (move_reduce_cost() && (++i < local_limit)) { } delete_empty_truck(); i = 0; sort_by_duration(); std::reverse(fleet.begin(), fleet.end()); problem->log << tau("\nmove duration based"); while (move_reduce_cost() && (++i < local_limit)) { } sort_by_duration(); delete_empty_truck(); this->fleet = best_solution.fleet; }
bool Optimize::move_reduce_cost() { if (fleet.size() < 2) return false; bool moved = false; size_t from_pos(fleet.size() - 1); while (from_pos > 1) { for (size_t to_pos = 0; to_pos < from_pos; ++to_pos) { moved = move_reduce_cost(from_pos, to_pos) || moved; } --from_pos; } return moved; }
bool Optimize::move_reduce_cost() { if (fleet.size() < 2) return false; size_t from_pos(fleet.size() - 1); while (from_pos > 1) { for (size_t to_pos = 0; to_pos < from_pos; ++to_pos) { // problem->log << "\nmove_reduce_cost (" << fleet[from_pos].id() << ", " << fleet[to_pos].id() << ")"; if (move_reduce_cost(from_pos, to_pos)) { if (fleet[from_pos].empty()) { fleet.erase(fleet.begin() + from_pos); save_if_best(); } return true; } } --from_pos; } return false; }
bool Optimize::inter_swap(bool reversed) { // problem->log << tau("before sort"); sort_by_duration(); delete_empty_truck(); save_if_best(); if (reversed) { std::reverse(fleet.begin(), fleet.end()); } // problem->log << tau("after sort"); auto swapped = false; size_t from_pos(fleet.size()-1); while (from_pos > 1) { for (size_t to_pos = 0; to_pos < from_pos; ++to_pos) { swapped = swap_worse(from_pos, to_pos)? true : swapped; swapped = move_reduce_cost(from_pos, to_pos)? true : swapped; } delete_empty_truck(); --from_pos; } return swapped; }
/* * ordering the trucks by number of orders it has * - the truck with more orders wants to: * - make less time * - do more orders * The inter_swap objective is to make the trucks with more orders * - less time consuming */ bool Optimize::inter_swap() { msg.log << "\n" <<tau("before inter swap"); delete_empty_truck(); auto swapped_f = false; /* * .. to ... from .... */ for (auto &from : fleet) { for (auto &to : fleet) { if (&from == &to) break; #if 0 msg.log << "\n to " << to.id() << "from " << from.id(); auto swapped = false; #endif swap_worse(to, from); swapped_f = swap_order() || swapped_f; move_reduce_cost(from, to); #if 0 msg.log << "++++++++" << p_swaps; #endif } } while (!p_swaps.empty()) { swapped_f = swap_order() || swapped_f; } msg.log << "\n" <<tau("after"); delete_empty_truck(); return swapped_f; }