Exemple #1
0
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();
    }
Exemple #2
0
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;
}
Exemple #3
0
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();
            });
}
Exemple #4
0
/*
 * 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;
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}