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; }