public Solution ImproveSolution(Solution initialSolution, List<Customer> selected, List<Route> routes) { if (selected == null) return initialSolution; var oldDist = initialSolution.TotalDistance(); Solution bestSolution = initialSolution; foreach (var c in selected) { foreach (var r in routes) { var transfer = BestInsertionPlaceCzech2001(initialSolution, c, r); if(transfer.Value < oldDist) { bestSolution = transfer.Key; oldDist = transfer.Value; } } } return bestSolution; }
public static List<double> ComputeGains(ref Solution p1, ref Solution p2, ref Solution p3, ref Solution p12, ref Solution p23, ref Solution p31, ref Solution p123, int max_iters = 30, Update update = null, VrpSolver solver = null) { if (solver == null) solver = DefaultSolver; ///// for (var i = 0; i < max_iters; ++i) { p1 = solver.Solve(p1.Problem, p1); p2 = solver.Solve(p2.Problem, p2); p3 = solver.Solve(p3.Problem, p3); p12 = solver.Solve(p12.Problem, p12); p23 = solver.Solve(p23.Problem, p23); p31 = solver.Solve(p31.Problem, p31); p123 = solver.Solve(p123.Problem, p123); var v1 = p1.TotalDistance(); var v2 = p2.TotalDistance(); var v3 = p3.TotalDistance(); var v12 = p12.TotalDistance(); var v23 = p23.TotalDistance(); var v31 = p31.TotalDistance(); var v123 = p123.TotalDistance(); var phi1 = 1.0 * 3.0 / v1 + 1.0 / 6.0 * (v12 - v2) + 1.0 / 6.0 * (v31 - v3) + 1.0 / 3.0 * (v123 - v23); var phi2 = 1.0 * 3.0 / v2 + 1.0 / 6.0 * (v23 - v3) + 1.0 / 6.0 * (v12 - v1) + 1.0 / 3.0 * (v123 - v31); var phi3 = 1.0 * 3.0 / v3 + 1.0 / 6.0 * (v31 - v1) + 1.0 / 6.0 * (v23 - v2) + 1.0 / 3.0 * (v123 - v12); p1.Phi = v1 - phi1; p2.Phi = v2 - phi2; p3.Phi = v3 - phi3; update(max_iters, i); } return null; }
public KeyValuePair<Solution, double> BestInsertionPlaceCzech2001(Solution solution, Customer customer, Route route) { // Route customerRoute = solution.Routes[customerRouteIndex]; // Customer customer = (Customer)customerRoute.RouteList[cusotomerIndex]; // Route targetRoute = solution.Routes[targetRouteIndex]; //int bestSolution = -1; double bestCost = solution.TotalDistance(); //solution.Routes[cusotomerIndex] = customerRoute.Copy(); //solution.Routes[cusotomerIndex].RouteList.RemoveAt(cusotomerIndex); var routeIndex = route.Index(); var newSolution = solution.Copy(); var oldRouteIdx = customer.Route.Index(); var oldRoute = newSolution.Routes[oldRouteIdx].Copy(); oldRoute.RemoveAt(customer.Index()); newSolution.Routes[oldRouteIdx] = oldRoute; Solution bestSolutionCopy = null; for (int i = 1; i < route.RouteList.Count; ++i) { var newRoute = solution.Routes[routeIndex].Copy(); newRoute.InsertCustomer(customer, i); newSolution.Routes[routeIndex] = newRoute; double newCost = newSolution.TotalDistance(); if (newRoute.IsFeasible() && newCost < bestCost) { bestSolutionCopy = newSolution.Copy(); bestCost = newCost; } } return new KeyValuePair<Solution, double>(bestSolutionCopy, bestCost); }