示例#1
0
int main () {
    PGR_LOG("message 1");
    PGR_LOGF("%s at epoch %d\n", "message 2", (int)time(NULL));
    PGR_LOG("message 3");

    return 0;
}
示例#2
0
void loadOrders(vrp_orders_t *orders, int order_count, int depotId) {
    int i;
    PGR_LOGF("%s: %d\n", "Depot ID", id);
    for (i = 0; i < order_count; i++) {
        int id = orders[i].id;
        PGR_LOGF("%s: %d\n", "Order ID", id);
        if (id == depotId) {
            PGR_LOG("Got depot");
            // This order represents Deopot
            CDepotInfo depot;

            depot.setDepotId(id);

            Point pt;

            pt.X = orders[i].x;
            pt.Y = orders[i].y;

            depot.setDepotLocation(pt);

            int openTime = orders[i].open_time;
            depot.setOpenTime(openTime);

            int closeTime = orders[i].close_time;
            depot.setCloseTime(closeTime);

            solver.addDepot(depot);

        } else {
            // This is an order
            COrderInfo order;

            order.setOrderId(id);

            Point pt;

            pt.X = orders[i].x;
            pt.Y = orders[i].y;

            order.setOrderLocation(pt);

            int demand = orders[i].order_unit;
            order.setOrderUnit(demand);

            int openTime = orders[i].open_time;
            order.setOpenTime(openTime);

            int closeTime = orders[i].close_time;
            order.setCloseTime(closeTime);

            int serviceTime = orders[i].service_time;
            order.setServiceTime(serviceTime);

            solver.addOrder(order);
        }
    }
}
示例#3
0
bool CVRPSolver::solveVRP(std::string& strError) {
    // if (!m_bIsReadyToSolve)
    // {
    //      strError = "Scenario is not ready to solve. Configure all parameter";
    //      return false;
    // }
    PGR_LOG("Inside Solve VRP");
    std::vector<int> vecOrders, vecVehicles;

    for(auto &rule:m_vOrderInfos)
    {
      vecOrders.push_back(rule.getOrderId());
    }

    for (auto &rule:m_vVehicleInfos) {
        vecVehicles.push_back(rule.getId());
    }

    m_solutionFinal.init(vecOrders, static_cast<int>(vecOrders.size()), vecVehicles);
    PGR_LOG("After init solution");
    int iAttemptCount = 0;
    while (iAttemptCount < MAXIMUM_TRY) {
        bool bUpdateFound = false;
        CSolutionInfo initialSolution = generateInitialSolution();
        PGR_LOG("After Generate initial Solution");
        iAttemptCount++;
        bUpdateFound = updateFinalSolution(initialSolution);
        PGR_LOG("After update final Solution");
        bool bUpdateFound2 = tabuSearch(initialSolution);
        PGR_LOG("After Tabu Search");
        if ((bUpdateFound == true) ||  (bUpdateFound2 == true)) {
            iAttemptCount = 0;
        }
    }
    m_bIsSolutionReady = true;
    strError += " ";
    return true;
}
示例#4
0
int find_vrp_solution(vrp_vehicles_t *vehicles, size_t vehicle_count,
                      vrp_orders_t *orders, size_t order_count,
                      vrp_cost_element_t *costmatrix, size_t cost_count,
                      int depot_id,
                      vrp_result_element_t **results, size_t *result_count, char **err_msg) {
    int res;

    std::string strError;
    try {
        PGR_LOG("Before load order");
        loadOrders(orders, static_cast<int>(order_count), depot_id);
        PGR_LOG("After load order");
        loadVehicles(vehicles, static_cast<int>(vehicle_count));
        PGR_LOG("After load vehicles");
        loadDistanceMatrix(costmatrix, static_cast<int>(cost_count), depot_id);
        PGR_LOG("After load distance matrix");
        res = solver.solveVRP(strError);
        PGR_LOG("After VRP Solve");
    }
    catch(std::exception& e) {
        *err_msg = (char *) e.what();
        return -1;
    }
    catch(...) {
        *err_msg = (char *) "Caught unknown exception!";
        return -1;
    }


    if (res < 0) {
        return res;
    } else {
        try {
        CSolutionInfo solution;
        CTourInfo ctour;
        // bool bOK =
                solver.getSolution(solution, strError);
        auto totalRoute = solution.getTourInfoVector().size();
        size_t totRows = 0;
        for (size_t i = 0; i < totalRoute; i++) {
            totRows += (solution.getTour(static_cast<int>(i)).getServedOrderCount() + 2);
        }
        *results = (vrp_result_element_t *) malloc(totRows * sizeof(vrp_result_element_t));
        *result_count = totRows;
        int cnt = 0;
        for (size_t i = 0; i < totalRoute; i++) {
            ctour = solution.getTour(static_cast<int>(i));
            std::vector<int> vecOrder = ctour.getOrderVector();
            auto totalOrder = vecOrder.size();

            // For start depot
            (*results)[cnt].order_id = ctour.getStartDepot();
            (*results)[cnt].order_pos = 0;
            (*results)[cnt].vehicle_id = ctour.getVehicleId();
            (*results)[cnt].arrival_time = -1;
            (*results)[cnt].depart_time = ctour.getStartTime(0);
            cnt++;

            // For each order
            for (size_t j = 0; j < totalOrder; j++) {
                (*results)[cnt].order_id = vecOrder[j];
                (*results)[cnt].order_pos = static_cast<int>(j) + 1;
                (*results)[cnt].vehicle_id = ctour.getVehicleId();
                (*results)[cnt].depart_time = ctour.getStartTime(static_cast<int>(j) + 1);
                (*results)[cnt].arrival_time = ctour.getStartTime(static_cast<int>(j) + 1) - solver.getServiceTime(vecOrder[j]);
                cnt++;
            }

            // For return depot
            (*results)[cnt].order_id = ctour.getEndDepot();
            (*results)[cnt].order_pos = static_cast<int>(totalOrder) + 1;
            (*results)[cnt].vehicle_id = ctour.getVehicleId();
            (*results)[cnt].arrival_time = ctour.getStartTime(static_cast<int>(totalOrder) + 1);
            (*results)[cnt].depart_time = -1;
            cnt++;
        }
        }
        catch(std::exception& e) {
        *err_msg = (char *) e.what();
        return -1;
        }
        catch(...) {
        *err_msg = (char *) "Caught unknown exception!";
        return -1;
        }
    }
    return EXIT_SUCCESS;
}
示例#5
0
CSolutionInfo CVRPSolver::generateInitialSolution() {
    CSolutionInfo initialSolution;
    PGR_LOG("Inside gen ini sol");
    std::vector<int> vecOrders, vecVehicles;
    for (unsigned int i = 0; i < m_vOrderInfos.size(); i++) {
        vecOrders.push_back(m_vOrderInfos[i].getOrderId());
    }

    for (unsigned int i = 0; i < m_vVehicleInfos.size(); i++) {
        vecVehicles.push_back(m_vVehicleInfos[i].getId());
    }

    initialSolution.init(vecOrders, static_cast<int>(vecOrders.size()), vecVehicles);

    int iUnusedVehicles = static_cast<int>(initialSolution.getUnusedVehicleCount());
    int iUnservedOrders = static_cast<int>(initialSolution.getUnservedOrderCount());  // m_viUnservedOrderIndex.size();
    PGR_LOG("before while");
    while (iUnusedVehicles &&  iUnservedOrders) {
        CTourInfo curTour;

        int vehicleIndex = rand() % iUnusedVehicles--;
        int vehicleInd = m_mapVehicleIdToIndex[initialSolution.getUnusedVehicleAt(vehicleIndex)];
        curTour.setVehicleInfo(m_vVehicleInfos[vehicleInd]);  // m_viUnusedVehicleIndex[vehicleIndex]
        initialSolution.removeVehicle(vehicleIndex);

        curTour.setStartDepot(m_vDepotInfos[0].getDepotId());
        curTour.setEndDepot(m_vDepotInfos[0].getDepotId());

        // use a random seed to start to tour. (we can use better approach in future)

        bool insertAvailable = true;

        while (insertAvailable) {
            insertAvailable = false;
            std::pair<int, int> PotentialInsert;  //  first = insert_index, second = removed_order_index;
            std::pair<int, double> bestInsert = std::make_pair(-1, DOUBLE_MAX);  // first = order_insert_index, second = cost;

            for (int i = 0; i < iUnservedOrders; ++i) {
                int orderInd = m_mapOrderIdToIndex[initialSolution.getUnservedOrderAt(i)];
                COrderInfo curOrder = m_vOrderInfos[orderInd];
                std::pair<int, double> curInsert = getPotentialInsert(curTour, curOrder);

                if (curInsert.second < bestInsert.second) {
                    insertAvailable = true;
                    bestInsert = curInsert;
                    PotentialInsert = std::make_pair(curInsert.first, i);
                }
            }
            if (insertAvailable) {
                if (insertOrder(curTour, initialSolution.getUnservedOrderAt(PotentialInsert.second), PotentialInsert.first)) {
                    iUnservedOrders--;
                    initialSolution.removeOrder(PotentialInsert.second);
                }
            }
        }

        initialSolution.addTour(curTour);
    }

    return initialSolution;
}