From bf8c843e93242748d363b3bc43ffb878fedc63f1 Mon Sep 17 00:00:00 2001 From: Romain BERNARD <romain.bernard@uca.fr> Date: Thu, 20 Jun 2024 17:07:03 +0200 Subject: [PATCH] add best insertions function with neighbour feasibility check function (TODO: test perfs wrt no feasibility checks) --- src/routes/vehicle/SAEVRoute.cpp | 35 +++++++++++++++++++++++++++++++- src/routes/vehicle/SAEVRoute.h | 1 + 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/routes/vehicle/SAEVRoute.cpp b/src/routes/vehicle/SAEVRoute.cpp index 7d15347..d7f10ad 100644 --- a/src/routes/vehicle/SAEVRoute.cpp +++ b/src/routes/vehicle/SAEVRoute.cpp @@ -358,7 +358,7 @@ bool SAEVRoute::checkRouteTimeWindows(size_t vehicleId) { return true; } -/** +/** TODO: move to BestInsertionQueue class with a route parameter ? * Initializes a BestInsertionQueue to guide the best insertion heuristic * @param requestId * @param vehicleId @@ -388,6 +388,39 @@ BestInsertionQueue SAEVRoute::getBestInsertionsQueue(size_t requestId, size_t ve return bestInsertionQueue; } +/** TODO: move to BestInsertionQueue class with a route parameter ? + * Initializes a BestInsertionQueue to guide the best insertion heuristic while checking neighbouring TW checks + * @param requestId + * @param vehicleId + * @return + */ + BestInsertionQueue SAEVRoute::getBestFeasibleInsertionsQueue(size_t requestId, size_t vehicleId) { + BestInsertionQueue bestInsertionQueue(requestId, vehicleId, _nbRequest^2); + + //Init variables used during iteration + double score; + SAEVKeyPoint * originInsertionKeyPoint = &getOriginDepot(vehicleId); + SAEVKeyPoint * destinationInsertionKeyPoint = originInsertionKeyPoint; + + //iterate over possible origin/destination pairs for the given vehicle + while(originInsertionKeyPoint->getSuccessor() != nullptr) { + while(destinationInsertionKeyPoint->getSuccessor() != nullptr) { + if(doNeighbouringTWChecks(requestId, getRequestOriginIdx(requestId), getRequestDestinationIdx(requestId), + originInsertionKeyPoint, destinationInsertionKeyPoint)) { + score = getDetourScore(requestId, *originInsertionKeyPoint, *destinationInsertionKeyPoint); + bestInsertionQueue.emplace(originInsertionKeyPoint, destinationInsertionKeyPoint, score); + destinationInsertionKeyPoint = destinationInsertionKeyPoint->getSuccessor(); + } + } + + //Iterate over possible origins and reset destination to being the same point as the origin + originInsertionKeyPoint = originInsertionKeyPoint->getSuccessor(); + destinationInsertionKeyPoint = originInsertionKeyPoint; + } + + return bestInsertionQueue; +} + void SAEVRoute::addRequestWeightToRoute(size_t requestId) { SAEVKeyPoint* currentKP = &getOrigin(requestId); int requestWeight = currentKP->getRequest()->getWeight(); diff --git a/src/routes/vehicle/SAEVRoute.h b/src/routes/vehicle/SAEVRoute.h index 64be3c1..59232e5 100644 --- a/src/routes/vehicle/SAEVRoute.h +++ b/src/routes/vehicle/SAEVRoute.h @@ -109,6 +109,7 @@ public: double getDetourScore(const size_t requestId, const SAEVKeyPoint &originRequestPredecessorKP, const SAEVKeyPoint &destinationRequestPredecessorKP); BestInsertionQueue getBestInsertionsQueue(size_t requestId, size_t vehicleId); + BestInsertionQueue getBestFeasibleInsertionsQueue(size_t requestId, size_t vehicleId); SAEVKeyPoint& getOrigin(const size_t requestId) { return _route.at(requestId * 2);} SAEVKeyPoint& getDestination(const size_t requestId) { return _route.at(requestId * 2 + 1);} -- GitLab