コード例 #1
0
        public bool Test <T>(EvolutionResult <T, TAllele> result)
            where T : IGene <T>
        {
            if (!_proceed)
            {
                return(false);
            }

            if (_fitness == null)
            {
                _fitness = result.GetBestFitness();
                _stable  = 1;
            }
            else
            {
                var opt = result.GetOptimize();
                if (opt.Compare(_fitness, result.GetBestFitness()) >= 0)
                {
                    _proceed = ++_stable <= _generations;
                }
                else
                {
                    _fitness = result.GetBestFitness();
                    _stable  = 1;
                }
            }

            return(_proceed);
        }
コード例 #2
0
        protected override Factory <EvolutionResult <DoubleGene, double> > Factory()
        {
            return(() =>
            {
                var random = RandomRegistry.GetRandom();

                return EvolutionResult.Of(
                    random.NextBoolean() ? Optimize.Maximum : Optimize.Minimum,
                    new Population <DoubleGene, double>(100)
                    .Fill(() => Phenotype.Of(
                              Genotype.Of(DoubleChromosome.Of(0, 1)), 1,
                              a => a.Gene.Allele),
                          100
                          ),
                    random.NextInt(1000),
                    random.NextInt(1000),
                    EvolutionDurations.Of(
                        TimeSpan.FromMilliseconds(random.NextInt(1000000)),
                        TimeSpan.FromMilliseconds(random.NextInt(1000000)),
                        TimeSpan.FromMilliseconds(random.NextInt(1000000)),
                        TimeSpan.FromMilliseconds(random.NextInt(1000000)),
                        TimeSpan.FromMilliseconds(random.NextInt(1000000)),
                        TimeSpan.FromMilliseconds(random.NextInt(1000000)),
                        TimeSpan.FromMilliseconds(random.NextInt(1000000))
                        ),
                    random.NextInt(100),
                    random.NextInt(100),
                    random.NextInt(100)
                    );
            });
        }
コード例 #3
0
        public static EvolutionResult <TGene, TAllele> ToBestEvolutionResult <TGene, TAllele>(
            this IEnumerable <EvolutionResult <TGene, TAllele> > source)
            where TGene : IGene <TGene>
            where TAllele : IComparable <TAllele>, IConvertible
        {
            var count = 0;
            EvolutionResult <TGene, TAllele> bestResult = null;

            foreach (var result in source)
            {
                if (Interlocked.CompareExchange(ref bestResult, result, null) != null)
                {
                    var oldValue = bestResult;
                    EvolutionResult <TGene, TAllele> newValue;
                    do
                    {
                        if (result.GetOptimize().Compare(result.GetBestPhenotype(), oldValue.GetBestPhenotype()) > 0)
                        {
                            newValue = result;
                        }
                        else
                        {
                            break;
                        }
                    } while (ReferenceEquals(Interlocked.CompareExchange(ref bestResult, newValue, oldValue), oldValue));
                }
                Interlocked.Increment(ref count);
            }
            return(bestResult?.WithTotalGenerations(count));
        }
コード例 #4
0
        public bool MoveNext()
        {
            if (_start == null)
            {
                _start = _initial();
            }

            Current = _evolution(_start, _cancellationToken);
            _start  = Current.Next();

            return(true);
        }
コード例 #5
0
        public void Accept <TGene>(EvolutionResult <TGene, T> result)
            where TGene : IGene <TGene>
        {
            Accept(result.GetDurations());

            Killed.Accept(result.GetKillCount());
            Invalids.Accept(result.GetInvalidCount());
            Altered.Accept(result.GetAlterCount());

            foreach (var pt in result.GetPopulation())
            {
                Accept(pt, result.GetGeneration());
            }
        }
コード例 #6
0
        private static EvolutionResult <IntegerGene, int> NewResult(Optimize opt, int value)
        {
            const int length = 1000;

            Func <Genotype <IntegerGene>, int> F = delegate(Genotype <IntegerGene> gt)
            {
                return(gt.Gene.Allele);
            };

            var pop = new Population <IntegerGene, int>(length);

            for (var i = 0; i < length; ++i)
            {
                var gt = Genotype.Of(IntegerChromosome.Of(
                                         IntegerGene.Of(value, 0, length)
                                         ));
                pop.Add(Phenotype.Of(gt, 1, F));
            }

            Shuffle(pop, RandomRegistry.GetRandom());

            return(EvolutionResult.Of(opt, pop, 0, 0, EvolutionDurations.Zero, 0, 0, 0));
        }
コード例 #7
0
        public void BestWorstPhenotype()
        {
            const int length = 100;

            Func <Genotype <IntegerGene>, int> F = delegate(Genotype <IntegerGene> gt)
            {
                return(gt.Gene.Allele);
            };

            var population = new Population <IntegerGene, int>(length);

            for (var i = 0; i < length; ++i)
            {
                var gt = Genotype.Of(IntegerChromosome.Of(
                                         IntegerGene.Of(i, 0, length)
                                         ));
                population.Add(Phenotype.Of(gt, 1, F));
            }

            Shuffle(population, RandomRegistry.GetRandom());

            var maxResult = EvolutionResult.Of(
                Optimize.Maximum, population,
                0, 0, EvolutionDurations.Zero, 0, 0, 0
                );

            Assert.Equal(length - 1, maxResult.GetBestFitness());
            Assert.Equal(0, maxResult.GetWorstFitness());

            var minResult = EvolutionResult.Of(
                Optimize.Minimum, population,
                0, 0, EvolutionDurations.Zero, 0, 0, 0
                );

            Assert.Equal(0, minResult.GetBestFitness());
            Assert.Equal(length - 1, minResult.GetWorstFitness());
        }
コード例 #8
0
        public void CompareTo()
        {
            const int length = 100;

            Func <Genotype <IntegerGene>, int> F = delegate(Genotype <IntegerGene> gt)
            {
                return(gt.Gene.Allele);
            };

            var small = new Population <IntegerGene, int>(length);

            for (var i = 0; i < length; ++i)
            {
                var gt = Genotype.Of(IntegerChromosome.Of(
                                         IntegerGene.Of(i, 0, length)
                                         ));
                small.Add(Phenotype.Of(gt, 1, F));
            }
            Shuffle(small, RandomRegistry.GetRandom());

            var big = new Population <IntegerGene, int>(length);

            for (var i = 0; i < length; ++i)
            {
                var gt = Genotype.Of(IntegerChromosome.Of(
                                         IntegerGene.Of(i + length, 0, length)
                                         ));
                big.Add(Phenotype.Of(gt, 1, F));
            }
            Shuffle(big, RandomRegistry.GetRandom());


            var smallMaxResult = EvolutionResult.Of(
                Optimize.Maximum, small,
                0, 0, EvolutionDurations.Zero, 0, 0, 0
                );
            var bigMaxResult = EvolutionResult.Of(
                Optimize.Maximum, big,
                0, 0, EvolutionDurations.Zero, 0, 0, 0
                );

            Assert.True(smallMaxResult.CompareTo(bigMaxResult) < 0);
            Assert.True(bigMaxResult.CompareTo(smallMaxResult) > 0);
            Assert.True(smallMaxResult.CompareTo(smallMaxResult) == 0);
            Assert.True(bigMaxResult.CompareTo(bigMaxResult) == 0);


            var smallMinResult = EvolutionResult.Of(
                Optimize.Minimum, small,
                0, 0, EvolutionDurations.Zero, 0, 0, 0
                );
            var bigMinResult = EvolutionResult.Of(
                Optimize.Minimum, big,
                0, 0, EvolutionDurations.Zero, 0, 0, 0
                );

            Assert.True(smallMinResult.CompareTo(bigMinResult) > 0);
            Assert.True(bigMinResult.CompareTo(smallMinResult) < 0);
            Assert.True(smallMinResult.CompareTo(smallMinResult) == 0);
            Assert.True(bigMinResult.CompareTo(bigMinResult) == 0);
        }