public void AddRoute(Route route) { Route newRoute = route.Copy(); newRoute.Solution = this; Routes.Add(newRoute); }
public override Solution Solve(Problem problem, Solution initialSolution = null) { var solution = new Solution(problem); var unroutedCustomers = new List<Customer>(problem.Customers); int seedId = SelectSeedCustomer(unroutedCustomers, problem.Depot); Customer seed = unroutedCustomers[seedId]; unroutedCustomers.RemoveAt(seedId); var partialRoute = new Route(problem, seed); while (unroutedCustomers.Count > 0) { Route newRoute = partialRoute.Copy(); var bestU = new List<int>(); var c1Vals = new List<double>(); foreach (Customer cust in unroutedCustomers) { double minC1 = double.MaxValue; int optimalU = 1; for (int i = 1; i < newRoute.RouteList.Count - 1; ++i) { double c1 = CriterionC1(i, cust, i + 1, newRoute); if (c1 < minC1) { minC1 = c1; optimalU = i; } } bestU.Add(optimalU); c1Vals.Add(minC1); } int bestCust = 0; double minC2 = double.MaxValue; for (int i = 0; i < unroutedCustomers.Count; ++i) { double c2 = CriterionC2(unroutedCustomers[i], c1Vals[i], newRoute); if (c2 < minC2) { minC2 = c2; bestCust = i; } } Customer newCustomer = unroutedCustomers[bestCust]; newRoute.InsertCustomer(newCustomer, bestU[bestCust]); if (newRoute.IsFeasible()) { unroutedCustomers.RemoveAt(bestCust); partialRoute = newRoute; } else { solution.AddRoute(partialRoute); seedId = SelectSeedCustomer(unroutedCustomers, problem.Depot); seed = unroutedCustomers[seedId]; unroutedCustomers.RemoveAt(seedId); partialRoute = new Route(problem, seed); } if (unroutedCustomers.Count == 0) solution.AddRoute(partialRoute); } return solution; }
public void AddRoute(Route route) { Route newRoute = route.Copy(); newRoute.Solution = this; Routes.Add(newRoute); }