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