Research Article

An Adaptive Data-Driven Approach to Solve Real-World Vehicle Routing Problems in Logistics

Pseudocode 2

Generation of initial routes using Clarke and Wright savings algorithm.
while(num_of_iterations--){
double maxSavings = −CONSTANT; int maxI, maxJ, maxK; bool inverted;
for(int i = 0; i < routes.size() − 1; i++){
  Route r2 = routes[i]->GetInvertedRoute();
  for(int j = i + 1; j < routes.size(); j++){
   for(int k = −1; k < 0 || k < (routes[i]->customers.size()); k++){
    if(routes[i]->IsItPossibleToInsertRouteToThePlace (routes[j], k) &&
     maxSavings < routes[i]->ModifiedSavings (routes[j], k) –
     TotalDifferencConstraintsPerVehicles (routes[i], routes[j], vehicles.size())){
      maxI = i; maxJ = j; maxK = k; inverted = false;
      maxSavings = routes[i]->ModifiedSavings(routes[j], k);
    }
   }
   for(int k = −1; k < 0 || k < (routes[j]->customers.size()); k++){
    if(routes[j]->IsItPossibleToInsertRouteToThePlace (routes[i], k) &&
     maxSavings < routes[j]->ModifiedSavings(routes[i], k) –
     TotalDifferencConstraintsPerVehicles (routes[i], routes[j], vehicles.size())){
     maxI = j; maxJ = i; maxK = k; inverted = false;
     maxSavings = routes[j]->ModifiedSavings(routes[i], k);
    }
   }
   Route r = routes[j]->GetInvertedRoute();
   for(int k = −1; k < 0 || k < (routes[i]->customers.size()); k++){
    if(rute[i]->IsItPossibleToInsertRouteToThePlace(r, k) &&
     maxSavings < routes[i]->ModifiedSavings(r, k) –
     TotalDifferencConstraintsPerVehicles (routes[i], routes[j], vehicles.size())){
      maxI = i; maxJ = j; maxK = k; inverted = true;
      maxSavings = routes[i]->ModifiedSavings(r, k);
    }
   }
   for(int k = −1; k < 0 || k < (routes[j]->customers.size()); k++){
    if(routes[j]->IsItPossibleToInsertRouteToThePlace(r2, k) &&
     maxSavings < routes[j]->ModifiedSavings(r2, k) –
     TotalDifferencConstraintsPerVehicles (routes[i], routes[j], vehicles.size())){
      maxI = j; maxJ = i; maxK = k; inverted = true;
      maxSavings = routes[j]->ModifiedSavings(r2, k);
    }
   }
  }
}
if(maxSavings < 0.01) break;
if(!inverted)
routes[maxI]->InsertRouteToThePlace(routes[maxJ], maxK);
else
routes[maxI]->InsertRouteToThePlace(routes [maxJ]->GetInvertedRoute(), maxK);
routes.erase (routes.begin() + maxJ);
}