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