Exemple #1
0
bool CVRPSolver::updateFinalSolution(CSolutionInfo& curSolution) {
    bool callUpdate = false;
    if (curSolution.getOrderServed() > m_solutionFinal.getOrderServed()) {
        callUpdate = true;
    } else if (curSolution.getOrderServed() == m_solutionFinal.getOrderServed()) {
        if (curSolution.getTotalCost() < m_solutionFinal.getTotalCost()) {
            callUpdate = true;
        } else if (curSolution.getTotalCost() == m_solutionFinal.getTotalCost()) {
            if (curSolution.getTotalTravelTime() < m_solutionFinal.getTotalTravelTime()) {
                callUpdate = true;
            } else if (curSolution.getTotalTravelTime() == m_solutionFinal.getTotalTravelTime()) {
                if (curSolution.getTotalDistance() < m_solutionFinal.getTotalDistance()) {
                    callUpdate = true;
                }
            }
        }
    }
    if (callUpdate) {
        // m_iStepsSinceLastSolution = 0;
        m_solutionFinal = curSolution;

        // clear map and delete objects
        // m_mpTabuCount.clear();
        // for (std::map< CVRPTWMove*, int >::iterator it = m_mpMoveFrequency.begin();it!= m_mpMoveFrequency.end();++it)
        // {
        //  delete (*it).first;
        // }
        // m_mpMoveFrequency.clear();
        return true;
    }
    return false;
}
Exemple #2
0
void CVRPSolver::insertUnservedOrders(CSolutionInfo& curSolution) {
    ++m_iGeneratedSolutionCount;
    ++m_iStepsSinceLastSolution;
    bool insertAvailable = true;
    CMoveInfo curMove;
    int totalUnservedOrder = static_cast<int>(m_vOrderInfos.size() - curSolution.getOrderServed());

    while (insertAvailable &&  totalUnservedOrder > 0) {
        int insertTourId = -1;
        insertAvailable = false;
        int totalTour = static_cast<int>(curSolution.getTourInfoVector().size());
        std::pair<int, int> PotentialInsert;  //  first = insert_index, second = removed_customer_index;
        std::pair<int, double> bestInsert = std::make_pair(-1, DOUBLE_MAX);  // first = customer_insert_index, second = cost;

        for (int j = 0; j < totalTour; ++j) {
            CTourInfo curTour = curSolution.getTour(j);
            curMove.setInitialTour(curTour);

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

                insertOrder(curTour, i, curInsert.first);
                curMove.setModifiedTour(curTour);
                curMove.getInitialTour(curTour);

                // check if current move is tabu.
                if (isTabuMove(curMove)) {
                    continue;
                }

                if (curInsert.second < bestInsert.second) {
                    insertTourId = j;
                    insertAvailable = true;
                    bestInsert = curInsert;
                    PotentialInsert = std::make_pair(curInsert.first, i);
                }
            }
        }
        if (insertAvailable) {
            totalUnservedOrder--;
            curMove.setInitialTour(curSolution.getTour(insertTourId));

            addOrderAtTour(curSolution, insertTourId,
                    PotentialInsert.first,
                    PotentialInsert.second);

            curMove.setModifiedTour(curSolution.getTour(insertTourId));
            this->updateTabuCount(curMove);
            this->updateFinalSolution(curSolution);  // this->evaluateCurrentSolution();
        }
    }
}