Optimize::Optimize( int kind, const Solution &old_solution) : Solution(old_solution), best_solution(old_solution) { switch (kind) { case 0: sort_by_duration(); break; case 1: decrease_truck(); break; case 2: move_duration_based(); break; case 3: move_wait_time_based(); break; case 4: inter_swap(); break; } this->fleet = best_solution.fleet; sort_by_duration(); delete_empty_truck(); }
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; }
void Optimize::sort_by_size() { sort_by_duration(); std::stable_sort(fleet.begin(), fleet.end(), [] (const Vehicle_pickDeliver &lhs, const Vehicle_pickDeliver &rhs) -> bool { return lhs.orders_in_vehicle().size() > rhs.orders_in_vehicle().size(); }); }
/* * Optimize decreasing truck * * - Objective: try to remove truck with less duration * * Step 1: Sort the fleet, duration DESC * Step 2: grab an order from the back of the the fleet * Step 3: cycle the fleet & insert in best truck possible */ void Optimize::decrease_truck() { bool decreased(true); while (decreased) { decreased = false; sort_by_duration(); std::reverse(fleet.begin(), fleet.end()); decrease_truck(fleet.size(), decreased); } this->fleet = best_solution.fleet; }
void Optimize::inter_swap() { auto local_limit(fleet.size()); size_t i(0); while (inter_swap(false) && (++i < local_limit)) { } i = 0; while (inter_swap(true) && (++i < local_limit)) { } sort_by_duration(); delete_empty_truck(); this->fleet = best_solution.fleet; }
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; }