Example #1
0
        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);
        }
Example #3
0
        /// <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);
        }