/// <summary> /// Executes a solver procedure. /// </summary> /// <param name="problem"></param> /// <returns></returns> internal override MaxTimeSolution Solve(MaxTimeProblem problem) { _customers = problem.Customers; //float[] solutions = OsmSharp.Math.VRP.Core.BestPlacement.CheapestInsertionHelper.CalculateBestValues( // problem, _customers); generations = 0; _max_generations = 10000000; // calculate one tsp solution. //Tools.Math.TSP.ISolver tsp_solver = new OsmSharp.Math.TSP.EdgeAssemblyGenetic.EdgeAssemblyCrossOverSolver(_population, _stagnation, // new OsmSharp.Math.TSP.Genetic.Solver.Operations.Generation._3OptGenerationOperation(), // new OsmSharp.Math.TSP.Genetic.Solver.Operations.CrossOver.EdgeAssemblyCrossover(30, // OsmSharp.Math.TSP.Genetic.Solver.Operations.CrossOver.EdgeAssemblyCrossover.EdgeAssemblyCrossoverSelectionStrategyEnum.SingleRandom, // true)); //IRoute tsp_solution = tsp_solver.Solve(new OsmSharp.Routing.VRP.NoDepot.MaxTime.TSPPlacement.TSPProblem( // problem)); // initialize the generation. IGenerationOperation <MaxTimeSolution, MaxTimeProblem, Fitness> generation = //new SolverGenerationOperation(new TSPPlacement.TSPPlacementSolver<ResolvedType>( // this.Router, this.Max, this.DeliveryTime, tsp_solution)); new OsmSharp.Routing.VRP.NoDepot.MaxTime.Genetic.Generation.RandomBestPlacement(); //new SolverGenerationOperation(new CheapestInsertionSolverWithImprovements<ResolvedType>( // this.Router, this.Max, this.DeliveryTime, 5, 0.1f, true, 0.1f, false, 1f, null, null)); //new SolverGenerationOperation(new CheapestInsertionSolverWithImprovements<ResolvedType>( // this.Router, this.Max, this.DeliveryTime, 5, 0.1f, true, 0.1f, true, 1f)); // initialize the crossover. ICrossOverOperation <MaxTimeSolution, MaxTimeProblem, Fitness> cross_over = new OsmSharp.Routing.VRP.NoDepot.MaxTime.Genetic.CrossOver.RouteExchangeOperation(); // initialize the mutation. //IMutationOperation<MaxTimeSolution, MaxTimeProblem, Fitness> mutation = // new VehicleMutation(); List <IMutationOperation <MaxTimeSolution, MaxTimeProblem, Fitness> > mutators = new List <IMutationOperation <MaxTimeSolution, MaxTimeProblem, Fitness> >(); mutators.Add(new VehicleMutation()); //mutators.Add(new ThreeOptMutation()); //mutators.Add(new RedivideRouteMutation()); mutators.Add(new RoutePartExchangeMutation()); if (_probabilities == null) { _probabilities = new List <double>(); _probabilities.Add(0.2); _probabilities.Add(0.6); _probabilities.Add(0.2); } CombinedMutation <MaxTimeSolution, MaxTimeProblem, Fitness> mutation = new CombinedMutation <MaxTimeSolution, MaxTimeProblem, Fitness>( StaticRandomGenerator.Get(), mutators, _probabilities); SolverSettings settings = new SolverSettings(_stagnation, _population, _max_generations, _elitism_percentage, _cross_percentage, _mutation_percentage); MaxTimeProblem genetic_problem = problem;// new MaxTimeProblem(max, problem, solutions); Solver <MaxTimeSolution, MaxTimeProblem, Fitness> solver = new Solver <MaxTimeSolution, MaxTimeProblem, Fitness>(genetic_problem, settings, new TournamentBasedSelector <MaxTimeSolution, MaxTimeProblem, Fitness>(5, 0.5), mutation, //new ThreeOptMutation(), cross_over, // new RouteExchangeOperation(), //new RouteExchangeOperation(), //new RouteExchangeAndVehicleOperation(), // Order1CrossoverOperation() generation, //new RandomBestPlacement(),//new RandomGeneration(), //new RandomBestPlacement(), new FitnessCalculator()); solver.NewFittest += new Solver <MaxTimeSolution, MaxTimeProblem, Fitness> .NewFittestDelegate(solver_NewFittest); //solver.NewGeneration += new Solver<MaxTimeSolution, Problem, Fitness>.NewGenerationDelegate(solver_NewGeneration); Individual <MaxTimeSolution, MaxTimeProblem, Fitness> solution = solver.Start(null); //this.solver_NewFittest(solution); MaxTimeSolution routes = solution.Genomes; long ticks_after = DateTime.Now.Ticks; StringBuilder sizes = new StringBuilder(); foreach (int size in routes.Sizes) { sizes.Append(size); sizes.Append(" "); } StringBuilder weights = new StringBuilder(); foreach (double weight in solution.Fitness.Weights) { weights.Append(weight.ToString(CultureInfo.InvariantCulture)); weights.Append(" "); } return(routes); }
/// <summary> /// Executes a solver procedure. /// </summary> /// <param name="problem"></param> /// <returns></returns> internal override MaxTimeSolution Solve(MaxTimeProblem problem) { // _customers = problem.Customers; //float[] solutions = OsmSharp.Math.VRP.Core.BestPlacement.CheapestInsertionHelper.CalculateBestValues( // problem, _customers); generations = 0; _max_generations = 10000000; // calculate one tsp solution. //Tools.Math.TSP.ISolver tsp_solver = new OsmSharp.Math.TSP.EdgeAssemblyGenetic.EdgeAssemblyCrossOverSolver(_population, _stagnation, // new OsmSharp.Math.TSP.Genetic.Solver.Operations.Generation._3OptGenerationOperation(), // new OsmSharp.Math.TSP.Genetic.Solver.Operations.CrossOver.EdgeAssemblyCrossover(30, // OsmSharp.Math.TSP.Genetic.Solver.Operations.CrossOver.EdgeAssemblyCrossover.EdgeAssemblyCrossoverSelectionStrategyEnum.SingleRandom, // true)); //IRoute tsp_solution = tsp_solver.Solve(new OsmSharp.Routing.VRP.NoDepot.MaxTime.TSPPlacement.TSPProblem( // problem)); // initialize the generation. IGenerationOperation<MaxTimeSolution, MaxTimeProblem, Fitness> generation = //new SolverGenerationOperation(new TSPPlacement.TSPPlacementSolver<ResolvedType>( // this.Router, this.Max, this.DeliveryTime, tsp_solution)); new OsmSharp.Routing.VRP.NoDepot.MaxTime.Genetic.Generation.RandomBestPlacement(); //new SolverGenerationOperation(new CheapestInsertionSolverWithImprovements<ResolvedType>( // this.Router, this.Max, this.DeliveryTime, 5, 0.1f, true, 0.1f, false, 1f, null, null)); //new SolverGenerationOperation(new CheapestInsertionSolverWithImprovements<ResolvedType>( // this.Router, this.Max, this.DeliveryTime, 5, 0.1f, true, 0.1f, true, 1f)); // initialize the crossover. ICrossOverOperation<MaxTimeSolution, MaxTimeProblem, Fitness> cross_over = new OsmSharp.Routing.VRP.NoDepot.MaxTime.Genetic.CrossOver.RouteExchangeOperation(); // initialize the mutation. //IMutationOperation<MaxTimeSolution, MaxTimeProblem, Fitness> mutation = // new VehicleMutation(); List<IMutationOperation<MaxTimeSolution, MaxTimeProblem, Fitness>> mutators = new List<IMutationOperation<MaxTimeSolution, MaxTimeProblem, Fitness>>(); mutators.Add(new VehicleMutation()); //mutators.Add(new ThreeOptMutation()); //mutators.Add(new RedivideRouteMutation()); mutators.Add(new RoutePartExchangeMutation()); if (_probabilities == null) { _probabilities = new List<double>(); _probabilities.Add(0.2); _probabilities.Add(0.6); _probabilities.Add(0.2); } CombinedMutation<MaxTimeSolution, MaxTimeProblem, Fitness> mutation = new CombinedMutation<MaxTimeSolution, MaxTimeProblem, Fitness>( StaticRandomGenerator.Get(), mutators, _probabilities); SolverSettings settings = new SolverSettings(_stagnation, _population, _max_generations, _elitism_percentage, _cross_percentage, _mutation_percentage); MaxTimeProblem genetic_problem = problem;// new MaxTimeProblem(max, problem, solutions); Solver<MaxTimeSolution, MaxTimeProblem, Fitness> solver = new Solver<MaxTimeSolution, MaxTimeProblem, Fitness>(genetic_problem, settings, new TournamentBasedSelector<MaxTimeSolution, MaxTimeProblem, Fitness>(5, 0.5), mutation, //new ThreeOptMutation(), cross_over, // new RouteExchangeOperation(), //new RouteExchangeOperation(), //new RouteExchangeAndVehicleOperation(), // Order1CrossoverOperation() generation, //new RandomBestPlacement(),//new RandomGeneration(), //new RandomBestPlacement(), new FitnessCalculator()); solver.NewFittest += new Solver<MaxTimeSolution, MaxTimeProblem, Fitness>.NewFittestDelegate(solver_NewFittest); //solver.NewGeneration += new Solver<MaxTimeSolution, Problem, Fitness>.NewGenerationDelegate(solver_NewGeneration); Individual<MaxTimeSolution, MaxTimeProblem, Fitness> solution = solver.Start(null); //this.solver_NewFittest(solution); MaxTimeSolution routes = solution.Genomes; long ticks_after = DateTime.Now.Ticks; StringBuilder sizes = new StringBuilder(); foreach (int size in routes.Sizes) { sizes.Append(size); sizes.Append(" "); } StringBuilder weights = new StringBuilder(); foreach (double weight in solution.Fitness.Weights) { weights.Append(weight.ToString(CultureInfo.InvariantCulture)); weights.Append(" "); } return routes; }