internal static Population <List <Genome>, Problem, Fitness> InitializePopulation( Problem problem, Second target, int population_size, int round_count) { IRandomGenerator random = new RandomGenerator(); // generate a list of cities to place. List <int> cities = new List <int>(); for (int city_to_place = 0; city_to_place < problem.Cities; city_to_place++) { cities.Add(city_to_place); } // create the population Population <List <Genome>, Problem, Fitness> population = new Population <List <Genome>, Problem, Fitness>( null, false); // create the fitness calculator. FitnessCalculator fitness_calculator = new FitnessCalculator(5); while (population.Count < population_size) { OsmSharp.Logging.Log.TraceEvent("OsmSharp.Math.VRP.MultiSalesman.Facade", System.Diagnostics.TraceEventType.Information, "Initializing population individual {0}/{1}...", population.Count + 1, population_size); // create copy of cities List <int> cities_list = new List <int>(cities); // create new individuals. Individual individual = new Individual(new List <Genome>()); // place one random city in each round. for (int round_idx = 0; round_idx < round_count; round_idx++) { // select a random city to place. int city_idx = random.Generate(cities_list.Count); int city = cities_list[city_idx]; cities_list.RemoveAt(city_idx); // create new genome. Genome genome = new Genome(); genome.Add(city); individual.Genomes.Add(genome); } individual = BestPlacementHelper.Do( problem, fitness_calculator, individual, cities_list); // add inidividual to the population. population.Add(individual); OsmSharp.Logging.Log.TraceEvent("OsmSharp.Math.VRP.MultiSalesman.Facade", System.Diagnostics.TraceEventType.Information, "Done!"); } return(population); }
/// <summary> /// Re-places all the cities again to their own best place. /// </summary> /// <param name="solver"></param> /// <param name="mutating"></param> /// <returns></returns> private Individual <List <int>, GeneticProblem, Fitness> MutateByRePlacement( Solver <List <int>, GeneticProblem, Fitness> solver, Individual <List <int>, GeneticProblem, Fitness> mutating) { List <int> nodes_to_re_place = mutating.Genomes.ToList <int>(); List <int> current_placement = mutating.Genomes.ToList <int>(); foreach (int node_to_place in nodes_to_re_place) { // take the node out. current_placement.Remove(node_to_place); // place the node back in. BestPlacementHelper helper = BestPlacementHelper.Instance(); helper.Do( solver.Problem, solver.FitnessCalculator as FitnessCalculator, current_placement, node_to_place); } Individual individual = new Individual(current_placement); individual.CalculateFitness(solver.Problem, solver.FitnessCalculator); return(individual); }
/// <summary> /// Mutates a given individual. /// </summary> /// <param name="solver"></param> /// <param name="mutating"></param> /// <returns></returns> public Individual <List <int>, GeneticProblem, Fitness> Mutate( Solver <List <int>, GeneticProblem, Fitness> solver, Individual <List <int>, GeneticProblem, Fitness> mutating) { // take a random piece. int idx = solver.Random.Next(mutating.Genomes.Count); List <int> new_genome = new List <int>(mutating.Genomes); int customer = new_genome[idx]; new_genome.RemoveAt(idx); // apply best placement algorithm to place the selected genomes. BestPlacementHelper helper = BestPlacementHelper.Instance(); helper.Do( solver.Problem, solver.FitnessCalculator as FitnessCalculator, new_genome, customer); Individual individual = new Individual(new_genome); individual.CalculateFitness(solver.Problem, solver.FitnessCalculator); return(individual); }
/// <summary> /// Generates one individual. /// </summary> /// <param name="solver"></param> /// <returns></returns> public Individual <List <Genome>, Problem, Fitness> Generate( Solver <List <Genome>, Problem, Fitness> solver) { IRandomGenerator random = new RandomGenerator(); // generate a list of cities to place. List <int> cities = new List <int>(); for (int city_to_place = 0; city_to_place < solver.Problem.Cities; city_to_place++) { cities.Add(city_to_place); } // create new individuals. Individual individual = new Individual(new List <Genome>()); // place one random city in each round. for (int round_idx = 0; round_idx < solver.Problem.InitialVehicles; round_idx++) { // select a random city to place. int city_idx = random.Generate(cities.Count); int city = cities[city_idx]; cities.RemoveAt(city_idx); // create new genome. Genome genome = new Genome(); genome.Add(city); individual.Genomes.Add(genome); } individual = BestPlacementHelper.Do( solver.Problem, (solver.FitnessCalculator as FitnessCalculator), individual, cities); return(individual); }