/// <summary> /// Creates a new solver. /// </summary> /// <param name="problem"></param> /// <param name="customers"></param> public EdgeAssemblyCrossOverSolver(OsmSharp.Math.TSP.Problems.IProblem problem, IList <int> customers) { //_stopped = false; //_customers = customers; }
/// <summary> /// Returns a solution found using best-placement. /// </summary> /// <returns></returns> protected override IRoute DoSolve(OsmSharp.Math.TSP.Problems.IProblem problem) { // create the settings. SolverSettings settings = new SolverSettings( -1, -1, 1000000000, -1, -1, -1); Solver <List <int>, GeneticProblem, Fitness> solver = new Solver <List <int>, GeneticProblem, Fitness>( new GeneticProblem(problem), settings, null, null, null, _generation_operation, new FitnessCalculator(), true, false); Population <List <int>, GeneticProblem, Fitness> population = new Population <List <int>, GeneticProblem, Fitness>(true); while (population.Count < _population_size) { // generate new. Individual <List <int>, GeneticProblem, Fitness> new_individual = _generation_operation.Generate(solver); // add to population. population.Add(new_individual); } // select each individual once. Population <List <int>, GeneticProblem, Fitness> new_population = new Population <List <int>, GeneticProblem, Fitness>(true); Individual <List <int>, GeneticProblem, Fitness> best = null; int stagnation = 0; while (stagnation < _stagnation) { while (new_population.Count < _population_size) { // select an individual and the next one. int idx = OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(population.Count); Individual <List <int>, GeneticProblem, Fitness> individual1 = population[idx]; Individual <List <int>, GeneticProblem, Fitness> individual2 = null; if (idx == population.Count - 1) { individual2 = population[0]; } else { individual2 = population[idx + 1]; } population.RemoveAt(idx); Individual <List <int>, GeneticProblem, Fitness> new_individual = _cross_over_operation.CrossOver(solver, individual1, individual2); new_individual.CalculateFitness(solver.Problem, solver.FitnessCalculator); if (new_individual.Fitness.CompareTo( individual1.Fitness) < 0) { new_population.Add(new_individual); } else { new_population.Add(individual1); } } population = new_population; population.Sort(solver, solver.FitnessCalculator); new_population = new Population <List <int>, GeneticProblem, Fitness>(true); if (best == null || best.Fitness.CompareTo(population[0].Fitness) > 0) { stagnation = 0; best = population[0]; } else { stagnation++; } // report progress. OsmSharp.Logging.Log.TraceEvent("EdgeAssemblyCrossOverSolver", Logging.TraceEventType.Information, string.Format("Solving using EAX: Stagnation {0}.", stagnation)); } var result = new List <int>(best.Genomes); result.Insert(0, 0); return(DynamicAsymmetricRoute.CreateFrom(result)); }