Research Article

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

Pseudocode 4

Route elimination.
while(num_of_iterations --){
vector<int> randPermutation = RandomPermutation (currentSolution.size());
for(int i = 0; i < randPermutation.size(); i++){
  vector<Route> routeCopy = currentSolution;
  for(int j = 0; j < routeCopy.size(); j++){
   routeCopy[j] = new Route(currentSolution[j]->customers, currentSolution[j]->routeVehicle, true);
  }
  double totalConsumption = 0;
  bool possible = true;
  for(int k = 0; k < routeCopy[randPermutation[i]]->customers.size(); k++){
   double minConsumption = CONSTANT;
   int route_number = −1, place = −1;
   for(int u = 0; u < routeCopy.size(); u++){
    if(u ! = randPermutation[i]){
     for(int = −1; =  = −1 || < routeCopy[u]->customers.size();++){
      if(routeCopy[u]->IsItpossibleToAddCustomer(routeCopy[randPermutation[i]]->customers[k],)
       && minConsumption > routeCopy[u]->AdditionalConsumptionWithCustomerAtPlace
       (routeCopy[randPermutation[i]]->customers[k],)){
        minConsumption = routeCopy[u]->AdditionalConsumptionWithCustomerAtPlace
        (routeCopy[randPermutation[i]]->customers[k],);
        route_number = u;
        place = ;
      }
     }
    }
   }
   if(route_number =  = −1){
    possible = false;
    break;
   }
   routeCopy[route_number]->
    InsertRouteToThePlace(new Route(routeCopy[randPermutation[i]]->customers[k]), place);
   totalConsumption += minConsumption;
  }
  double savings = currentSolution[randPermutation[i]]->RouteCost();
  if(possible && (savings-totalConsumption > 0)){
   routeCopy.erase(routeCopy.begin() + randPermutation[i]);
   currentSolution = routeCopy;
   break;
  }
}
}