예제 #1
0
        public static Chromosome Cross(Tuple <Chromosome, Chromosome> pair, Random random)
        {
            IList <double>              values;
            UniformDistribution         uniform  = new UniformDistribution(Interval.FromEndpoints(0, 1));
            DiscreteUniformDistribution discrete = new DiscreteUniformDistribution(0, 1);
            double randomNumber = uniform.GetRandomValue(random);

            if (randomNumber <= SELECTION_1_PROBABILITY) // whole arithmetic recombination
            {
                values = pair.Item1.Values.Zip(pair.Item2.Values, (x, y) => (x + y) / 2).ToList();
            }
            else if (randomNumber <= SELECTION_1_PROBABILITY + SELECTION_2_PROBABILITY) // discrete recombination
            {
                values = pair.Item1.Values.Zip(pair.Item2.Values, (x, y) => discrete.GetRandomValue(random) == 0 ? x : y).ToList();
            }
            else // simple arithmetic recombination
            {
                values = pair.Item1.Values.Zip(pair.Item2.Values, (x, y) => pair.Item1.Values.IndexOf(x) < pair.Item1.Values.Count / 2 ? x : (x + y) / 2).ToList();
            }
            return(new Chromosome(values));
        }
        public static Tuple <Chromosome, Chromosome> Select(IList <Chromosome> population, Random random, out Chromosome worst)
        {
            SortedSet <Chromosome>      tournament = new SortedSet <Chromosome>();
            DiscreteUniformDistribution discrete   = new DiscreteUniformDistribution(0, population.Count - 1);

            while (tournament.Count < K)
            {
                int index = discrete.GetRandomValue(random);
                tournament.Add(population[index]);
            }
            worst = tournament.Max;
            tournament.Remove(worst);
            double sumFitness;

            CalculateFitness(tournament, out sumFitness);
            Chromosome parent1 = SelectParent(tournament, sumFitness, random);

            tournament.Remove(parent1);
            CalculateFitness(tournament, out sumFitness);
            Chromosome parent2 = SelectParent(tournament, sumFitness, random);

            return(new Tuple <Chromosome, Chromosome>(parent1, parent2));
        }