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