private void UpdateIndividual(int index, short[] child)
        {
            var childGenotype = Individuals[index].Genotype.EmptyCopy <CombinatoryGenotype>();

            childGenotype.Value = child;
            var childIndividual = IndividualFactory.CreateFromGenotype(childGenotype);

            Individuals[index] = CompareCriteria.GetBetter(Individuals[index], childIndividual);
        }
Beispiel #2
0
        public override void NextGeneration()
        {
            var nextGenSize    = ResizePolicy.NextGenSize(this);
            var nextGeneration = new IIndividual[nextGenSize];

            for (var i = 0; i < nextGenSize / Crossover.ChildrenCount; i++)
            {
                var parentalGenotypes = SelectParentalGenotypes();
                var genotypes         = Crossover.Cross(parentalGenotypes);
                for (var j = 0; j < genotypes.Length; j++)
                {
                    var child = IndividualFactory.CreateFromGenotype(genotypes[j]);
                    Mutation.Mutate(child.Genotype, MutationPolicy, this);
                    if (!IncompatibilityPolicy.IsCompatible(this, child))
                    {
                        child = IncompatibilityPolicy.GetReplacement(this, child, parentalGenotypes);
                    }

                    nextGeneration[i * Crossover.ChildrenCount + j] = child;
                }
            }

            var childrenCountDifference = nextGenSize % Crossover.ChildrenCount;

            if (childrenCountDifference > 0)
            {
                var parentalGenotypes = SelectParentalGenotypes();
                var genotypes         = Crossover.Cross(parentalGenotypes);
                var start             = nextGenSize - childrenCountDifference;
                for (var j = 0; j < childrenCountDifference; j++)
                {
                    var child = IndividualFactory.CreateFromGenotype(genotypes[j]);
                    Mutation.Mutate(child.Genotype, MutationPolicy, this);
                    if (!IncompatibilityPolicy.IsCompatible(this, child))
                    {
                        child = IncompatibilityPolicy.GetReplacement(this, child, parentalGenotypes);
                    }

                    nextGeneration[start + j] = child;
                }
            }


            Individuals = nextGeneration;
            DeprecateData();
            UpdatePerGenerationData();
            if (Generation % 1000 == 0)
            {
                GC.Collect();
            }
        }