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