private RouteFound AfterSelectt2(IProblem problem, RouteFound route, EdgeSet X, EdgeSet Y, EdgeList x) { int t_2 = x[0].To; // try and find a better route with t_1. RouteFound new_route = new RouteFound() { RouteWeight = float.MaxValue, Route = null }; // step 4 and step 10. HashSet <int> t_3_exceptions = new HashSet <int>(); EdgeList y = new EdgeList(); int? result = this.SelectY(problem, route.Route, X, Y, x, y, t_3_exceptions); while (result != null) { // select t_3. int t_3 = result.Value; t_3_exceptions.Add(t_3); // add y_1 to the edge list. Edge y_edge = new Edge() { From = t_2, To = t_3, Weight = problem.Weight(t_2, t_3) }; y.Add(y_edge); Y.Add(y_edge); // search route with t_3. new_route = this.AfterSelectt3(problem, route, X, Y, x, y); if (new_route.Route != null && new_route.RouteWeight < route.RouteWeight) { // trackback to t_1 if a better route is found. break; } // remove y_1 again and backtrack. y.RemoveLast(); result = this.SelectY(problem, route.Route, X, Y, x, y, t_3_exceptions); } return(new_route); }
private RouteFound AfterSelectt4(IProblem problem, RouteFound route, EdgeSet X, EdgeSet Y, EdgeList x, EdgeList y) { int t_1 = x[0].From; int t_3 = y[0].To; int t_4 = x[1].To; // try and find a better route with t_1. RouteFound new_route = new RouteFound() { RouteWeight = float.MaxValue, Route = null }; // choose t_5 for backtracking later. HashSet <int> t_5_exceptions = new HashSet <int>(); int? result = this.SelectY(problem, route.Route, X, Y, x, y, t_5_exceptions); while (result != null) { // choose t_5. int t_5 = result.Value; t_5_exceptions.Add(t_5); Edge y_2 = new Edge() { From = t_4, To = t_5, Weight = problem.Weight(t_4, t_5) }; y.Add(y_2); Y.Add(y_2); // try and find a better route by selecting more customer. new_route = this.AfterSelectt5(problem, route, X, Y, x, y); if (new_route.Route != null && new_route.RouteWeight < route.RouteWeight) { // trackback to t_1 if a better route is found. break; } // remove and backtrack y_2. y.RemoveLast(); result = this.SelectY(problem, route.Route, X, Y, x, y, t_5_exceptions); } // choose t_5 return(new_route); }
private RouteFound AfterSelectt1(IProblem problem, RouteFound route, EdgeSet X, EdgeSet Y, int t_1) { // try and find a better route with t_1. RouteFound new_route = new RouteFound() { RouteWeight = float.MaxValue, Route = null }; // step 3 and step 11. HashSet <int> t_2_exceptions = new HashSet <int>(); EdgeList x = new EdgeList(); int? result = this.SelectX(problem, route.Route, X, Y, x, t_1, t_2_exceptions); while (result != null) { // select t_2. int t_2 = result.Value; t_2_exceptions.Add(t_2); // add x_1 to the edge list. Edge x_edge = new Edge() { From = t_1, To = t_2, Weight = problem.Weight(t_1, t_2) }; x.Add(x_edge); X.Add(x_edge); // search route with t_2. new_route = this.AfterSelectt2(problem, route, X, Y, x); if (new_route.Route != null && new_route.RouteWeight < route.RouteWeight) { // trackback to t_1 if a better route is found. break; } // remove x_1 again and backtrack. x.RemoveLast(); result = this.SelectX(problem, route.Route, X, Y, x, t_1, t_2_exceptions); } // step 3 and step 11. return(new_route); }
private RouteFound AfterSelectt5(IProblem problem, RouteFound route, EdgeSet X, EdgeSet Y, EdgeList x, EdgeList y) { int t_1 = x[0].From; int t_2i_min_1 = y[y.Count - 1].To; // try and find a better route with t_1. RouteFound new_route = new RouteFound() { RouteWeight = float.MaxValue, Route = null }; HashSet<int> exceptions = new HashSet<int>(); int? result = this.SelectX(problem, route.Route, X, Y, x, t_2i_min_1, exceptions); while (result != null) // do backtacking over x: TODO: improve this and immidiately find the correct tour. { int t_2i = result.Value; exceptions.Add(t_2i); // step 6. t_2i = result.Value; Edge x_edge = new Edge() { From = t_2i_min_1, To = t_2i, Weight = problem.Weight(t_2i_min_1, t_2i) }; x.Add(x_edge); X.Add(x_edge); // Test the route T' for feasability and weight. y.Add(new Edge() { From = t_2i, To = t_1, Weight = problem.Weight(t_2i, t_2i) }); new_route.Route = this.Replace(route.Route, x, y); y.RemoveLast(); // remove the perliminary y. if (new_route.Route.IsValid()) { // stop the search for now if the route is already better. new_route.RouteWeight = LinKernighanSolver.Weight(problem, new_route.Route); if (new_route.RouteWeight < route.RouteWeight) { // break. OsmSharp.Logging.Log.TraceEvent("LinKernighanSolver", Logging.TraceEventType.Information, "Route {0}:{1}", new_route.Route.ToString(), new_route.RouteWeight); return new_route; } // choose next y. result = this.SelectY(problem, route.Route, X, Y, x, y, null); if (result != null) { int t_2_plus_1 = result.Value; Edge y_edge = new Edge() { From = t_2i, To = t_2_plus_1, Weight = problem.Weight(t_2i, t_2_plus_1) }; y.Add(y_edge); Y.Add(y_edge); // choose next. new_route = this.AfterSelectt5(problem, route, X, Y, x, y); if (new_route.RouteWeight < route.RouteWeight) { // break. OsmSharp.Logging.Log.TraceEvent("LinKernighanSolver", Logging.TraceEventType.Information, "Route {0}:{1}", new_route.Route.ToString(), new_route.RouteWeight); return new_route; } // remove y again. y.RemoveLast(); } x.RemoveLast(); break; // the other x cannot be valid! } // backtrack over x. x.RemoveLast(); result = this.SelectX(problem, route.Route, X, Y, x, t_2i_min_1, exceptions); } return new_route; }
private RouteFound AfterSelectt4(IProblem problem, RouteFound route, EdgeSet X, EdgeSet Y, EdgeList x, EdgeList y) { int t_1 = x[0].From; int t_3 = y[0].To; int t_4 = x[1].To; // try and find a better route with t_1. RouteFound new_route = new RouteFound() { RouteWeight = float.MaxValue, Route = null }; // choose t_5 for backtracking later. HashSet<int> t_5_exceptions = new HashSet<int>(); int? result = this.SelectY(problem, route.Route, X, Y, x, y, t_5_exceptions); while (result != null) { // choose t_5. int t_5 = result.Value; t_5_exceptions.Add(t_5); Edge y_2 = new Edge() { From = t_4, To = t_5, Weight = problem.Weight(t_4, t_5) }; y.Add(y_2); Y.Add(y_2); // try and find a better route by selecting more customer. new_route = this.AfterSelectt5(problem, route, X, Y, x, y); if (new_route.Route != null && new_route.RouteWeight < route.RouteWeight) { // trackback to t_1 if a better route is found. break; } // remove and backtrack y_2. y.RemoveLast(); result = this.SelectY(problem, route.Route, X, Y, x, y, t_5_exceptions); } // choose t_5 return new_route; }
private RouteFound AfterSelectt3(IProblem problem, RouteFound route, EdgeSet X, EdgeSet Y, EdgeList x, EdgeList y) { int t_1 = x[0].From; int t_3 = y[0].To; // try and find a better route with t_1. RouteFound new_route = new RouteFound() { RouteWeight = float.MaxValue, Route = null }; // choose t_4 for backtracking later. HashSet<int> t_4_exceptions = new HashSet<int>(); int? result = this.SelectX(problem, route.Route, X, Y, x, t_3, t_4_exceptions); while (result != null) { // select t_4. int t_4 = result.Value; t_4_exceptions.Add(t_4); // add to x and test with perliminary y. Edge x_edge = new Edge() { From = t_3, To = t_4, Weight = problem.Weight(t_3, t_4) }; x.Add(x_edge); X.Add(x_edge); // Test the route T' for feasability and weight. y.Add(new Edge() { From = t_4, To = t_1, Weight = problem.Weight(t_4, t_1) }); new_route.Route = this.Replace(route.Route, x, y); y.RemoveLast(); // remove the perliminary y. if (new_route.Route.IsValid()) { // stop the search for now if the route is already better. new_route.RouteWeight = LinKernighanSolver.Weight(problem, new_route.Route); if (new_route.RouteWeight < route.RouteWeight) { // break. OsmSharp.Logging.Log.TraceEvent("LinKernighanSolver", Logging.TraceEventType.Information, "Route {0}:{1}", new_route.Route.ToString(), new_route.RouteWeight); x.RemoveLast(); // remove the latest x here! break; } } // choose t_5 here. new_route = this.AfterSelectt4(problem, route, X, Y, x, y); if (new_route.Route != null && new_route.RouteWeight < route.RouteWeight) { // trackback to t_1 if a better route is found. break; } // reset the new route. new_route.Route = null; new_route.RouteWeight = float.MaxValue; // remove and backtrack x_2. x.RemoveLast(); result = this.SelectX(problem, route.Route, X, Y, x, t_3, t_4_exceptions); } // choose t_4 return new_route; }
private RouteFound AfterSelectt2(IProblem problem, RouteFound route, EdgeSet X, EdgeSet Y, EdgeList x) { int t_2 = x[0].To; // try and find a better route with t_1. RouteFound new_route = new RouteFound() { RouteWeight = float.MaxValue, Route = null }; // step 4 and step 10. HashSet<int> t_3_exceptions = new HashSet<int>(); EdgeList y = new EdgeList(); int? result = this.SelectY(problem, route.Route, X, Y, x, y, t_3_exceptions); while (result != null) { // select t_3. int t_3 = result.Value; t_3_exceptions.Add(t_3); // add y_1 to the edge list. Edge y_edge = new Edge() { From = t_2, To = t_3, Weight = problem.Weight(t_2, t_3) }; y.Add(y_edge); Y.Add(y_edge); // search route with t_3. new_route = this.AfterSelectt3(problem, route, X, Y, x, y); if (new_route.Route != null && new_route.RouteWeight < route.RouteWeight) { // trackback to t_1 if a better route is found. break; } // remove y_1 again and backtrack. y.RemoveLast(); result = this.SelectY(problem, route.Route, X, Y, x, y, t_3_exceptions); } return new_route; }
private RouteFound AfterSelectt1(IProblem problem, RouteFound route, EdgeSet X, EdgeSet Y, int t_1) { // try and find a better route with t_1. RouteFound new_route = new RouteFound() { RouteWeight = float.MaxValue, Route = null }; // step 3 and step 11. HashSet<int> t_2_exceptions = new HashSet<int>(); EdgeList x = new EdgeList(); int? result = this.SelectX(problem, route.Route, X, Y, x, t_1, t_2_exceptions); while (result != null) { // select t_2. int t_2 = result.Value; t_2_exceptions.Add(t_2); // add x_1 to the edge list. Edge x_edge = new Edge() { From = t_1, To = t_2, Weight = problem.Weight(t_1, t_2) }; x.Add(x_edge); X.Add(x_edge); // search route with t_2. new_route = this.AfterSelectt2(problem, route, X, Y, x); if (new_route.Route != null && new_route.RouteWeight < route.RouteWeight) { // trackback to t_1 if a better route is found. break; } // remove x_1 again and backtrack. x.RemoveLast(); result = this.SelectX(problem, route.Route, X, Y, x, t_1, t_2_exceptions); } // step 3 and step 11. return new_route; }
private RouteFound AfterSelectt5(IProblem problem, RouteFound route, EdgeSet X, EdgeSet Y, EdgeList x, EdgeList y) { int t_1 = x[0].From; int t_2i_min_1 = y[y.Count - 1].To; // try and find a better route with t_1. RouteFound new_route = new RouteFound() { RouteWeight = float.MaxValue, Route = null }; HashSet <int> exceptions = new HashSet <int>(); int? result = this.SelectX(problem, route.Route, X, Y, x, t_2i_min_1, exceptions); while (result != null) // do backtacking over x: TODO: improve this and immidiately find the correct tour. { int t_2i = result.Value; exceptions.Add(t_2i); // step 6. t_2i = result.Value; Edge x_edge = new Edge() { From = t_2i_min_1, To = t_2i, Weight = problem.Weight(t_2i_min_1, t_2i) }; x.Add(x_edge); X.Add(x_edge); // Test the route T' for feasability and weight. y.Add(new Edge() { From = t_2i, To = t_1, Weight = problem.Weight(t_2i, t_2i) }); new_route.Route = this.Replace(route.Route, x, y); y.RemoveLast(); // remove the perliminary y. if (new_route.Route.IsValid()) { // stop the search for now if the route is already better. new_route.RouteWeight = LinKernighanSolver.Weight(problem, new_route.Route); if (new_route.RouteWeight < route.RouteWeight) { // break. Console.WriteLine("Route {0}:{1}", new_route.Route.ToString(), new_route.RouteWeight); return(new_route); } // choose next y. result = this.SelectY(problem, route.Route, X, Y, x, y, null); if (result != null) { int t_2_plus_1 = result.Value; Edge y_edge = new Edge() { From = t_2i, To = t_2_plus_1, Weight = problem.Weight(t_2i, t_2_plus_1) }; y.Add(y_edge); Y.Add(y_edge); // choose next. new_route = this.AfterSelectt5(problem, route, X, Y, x, y); if (new_route.RouteWeight < route.RouteWeight) { // break. Console.WriteLine("Route {0}:{1}", new_route.Route.ToString(), new_route.RouteWeight); return(new_route); } // remove y again. y.RemoveLast(); } x.RemoveLast(); break; // the other x cannot be valid! } // backtrack over x. x.RemoveLast(); result = this.SelectX(problem, route.Route, X, Y, x, t_2i_min_1, exceptions); } return(new_route); }
private RouteFound AfterSelectt3(IProblem problem, RouteFound route, EdgeSet X, EdgeSet Y, EdgeList x, EdgeList y) { int t_1 = x[0].From; int t_3 = y[0].To; // try and find a better route with t_1. RouteFound new_route = new RouteFound() { RouteWeight = float.MaxValue, Route = null }; // choose t_4 for backtracking later. HashSet <int> t_4_exceptions = new HashSet <int>(); int? result = this.SelectX(problem, route.Route, X, Y, x, t_3, t_4_exceptions); while (result != null) { // select t_4. int t_4 = result.Value; t_4_exceptions.Add(t_4); // add to x and test with perliminary y. Edge x_edge = new Edge() { From = t_3, To = t_4, Weight = problem.Weight(t_3, t_4) }; x.Add(x_edge); X.Add(x_edge); // Test the route T' for feasability and weight. y.Add(new Edge() { From = t_4, To = t_1, Weight = problem.Weight(t_4, t_1) }); new_route.Route = this.Replace(route.Route, x, y); y.RemoveLast(); // remove the perliminary y. if (new_route.Route.IsValid()) { // stop the search for now if the route is already better. new_route.RouteWeight = LinKernighanSolver.Weight(problem, new_route.Route); if (new_route.RouteWeight < route.RouteWeight) { // break. Console.WriteLine("Route {0}:{1}", new_route.Route.ToString(), new_route.RouteWeight); x.RemoveLast(); // remove the latest x here! break; } } // choose t_5 here. new_route = this.AfterSelectt4(problem, route, X, Y, x, y); if (new_route.Route != null && new_route.RouteWeight < route.RouteWeight) { // trackback to t_1 if a better route is found. break; } // reset the new route. new_route.Route = null; new_route.RouteWeight = float.MaxValue; // remove and backtrack x_2. x.RemoveLast(); result = this.SelectX(problem, route.Route, X, Y, x, t_3, t_4_exceptions); } // choose t_4 return(new_route); }