コード例 #1
0
ファイル: LineCrossover.cs プロジェクト: lvv88/jenetics.net
        protected internal override int Crossover(IMutableSeq <TGene> v, IMutableSeq <TGene> w)
        {
            var random = RandomRegistry.GetRandom();

            var min = v[0].Min.ToDouble(null);
            var max = v[0].Max.ToDouble(null);

            var a = Internal.Math.random.NextDouble(random, -_p, 1 + _p);
            var b = Internal.Math.random.NextDouble(random, -_p, 1 + _p);

            var changed = false;

            for (int i = 0, n = Math.Min(v.Length, w.Length); i < n; ++i)
            {
                var vi = v[i].DoubleValue();
                var wi = w[i].DoubleValue();

                dynamic t = a * vi + (1 - a) * wi;
                dynamic s = b * wi + (1 - b) * vi;

                if (t >= min && s >= min && t < max && s < max)
                {
                    v[i]    = v[i].NewInstance(t);
                    w[i]    = w[i].NewInstance(s);
                    changed = true;
                }
            }

            return(changed ? 2 : 0);
        }
コード例 #2
0
        public virtual Population <TGene, TAllele> Select(Population <TGene, TAllele> population, int count, Optimize opt)
        {
            if (count < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(count),
                                                      $"Selection count must be greater or equal then zero, but was {count}.");
            }

            var selection = new Population <TGene, TAllele>(count);

            if (count > 0 && !population.IsEmpty)
            {
                var pop = Copy(population);

                var prob = Probabilities(pop, count, opt);

                CheckAndCorrect(prob);

                ProbabilitySelector.Incremental(prob);

                var random = RandomRegistry.GetRandom();
                selection.Fill(() => pop[ProbabilitySelector.IndexOf(prob, random.NextDouble())], count);
            }

            return(selection);
        }
コード例 #3
0
ファイル: CharacterGene.cs プロジェクト: TiZott/jenetics.net
 public static CharacterGene Of()
 {
     return(new CharacterGene(
                DefaultCharacters,
                RandomRegistry.GetRandom().NextInt(DefaultCharacters.Length)
                ));
 }
コード例 #4
0
        public void SelectDistribution(int tournamentSize, Named <double[]> expected, Optimize opt)
        {
            if (!Enum.IsDefined(typeof(Optimize), opt))
            {
                throw new InvalidEnumArgumentException(nameof(opt), (int)opt, typeof(Optimize));
            }
            if (!Enum.IsDefined(typeof(Optimize), opt))
            {
                throw new InvalidEnumArgumentException(nameof(opt), (int)opt, typeof(Optimize));
            }
            Retry <Exception>(3, () =>
            {
                const int loops       = 1;
                const int npopulation = PopulationCount;

                //ThreadLocal<LCG64ShiftRandom> random = new LCG64ShiftRandom.ThreadLocal();
                var random = RandomRegistry.GetRandom();
                RandomRegistry.Using(random, r =>
                {
                    var distribution = Distribution(
                        new TournamentSelector <DoubleGene, double>(tournamentSize),
                        opt,
                        npopulation,
                        loops
                        );

                    StatisticsAssert.AssertDistribution(distribution, expected.Value, 0.001, 20);
                });
            });
        }
コード例 #5
0
        protected internal override int Recombine(Population <TGene, TAllele> population, int[] individuals,
                                                  long generation)
        {
            var random = RandomRegistry.GetRandom();

            var pt1 = population[individuals[0]];
            var pt2 = population[individuals[1]];
            var gt1 = pt1.GetGenotype();
            var gt2 = pt2.GetGenotype();

            var chIndex = random.NextInt(Math.Min(gt1.Length, gt2.Length));

            var c1     = MutableSeq.Of <IChromosome <TGene> >(gt1.ToSeq());
            var c2     = MutableSeq.Of <IChromosome <TGene> >(gt2.ToSeq());
            var genes1 = MutableSeq.Of <TGene>(c1[chIndex].ToSeq());
            var genes2 = MutableSeq.Of <TGene>(c2[chIndex].ToSeq());

            Crossover(genes1, genes2);

            c1[chIndex] = c1[chIndex].NewInstance(genes1.ToImmutableSeq());
            c2[chIndex] = c2[chIndex].NewInstance(genes2.ToImmutableSeq());

            population[individuals[0]] = pt1.NewInstance(gt1.NewInstance(c1.ToImmutableSeq()), generation);
            population[individuals[1]] = pt2.NewInstance(gt1.NewInstance(c2.ToImmutableSeq()), generation);

            return(Order);
        }
コード例 #6
0
        public void IndexOf1()
        {
            var random = RandomRegistry.GetRandom();

            var props   = new double[10];
            var divisor = props.Length * (props.Length + 1) / 2.0;

            for (var i = 0; i < props.Length; ++i)
            {
                props[i] = (i + 1) / divisor;
            }
            Randomize(props, random);

            var incremental = ProbabilitySelector.Incremental((double[])props.Clone());

            const double samples = 1000000;
            var          indices = new double[props.Length];

            Array.Fill(indices, 0);

            for (var i = 0; i < samples; ++i)
            {
                indices[ProbabilitySelector.IndexOf(incremental, random.NextDouble())] += 1;
            }

            for (var i = 0; i < props.Length; ++i)
            {
                indices[i] /= samples;
            }

            for (var i = 0; i < props.Length; ++i)
            {
                Assert.Equal(props[i], indices[i], 1);
            }
        }
コード例 #7
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)
                    );
            });
        }
コード例 #8
0
        public void CrossoverChanges()
        {
            var g1 = CharacterChromosome.Of("1234567890").ToSeq();
            var g2 = CharacterChromosome.Of("abcdefghij").ToSeq();

            RandomRegistry.Using(new Random(10), r =>
            {
                var crossover = new UniformCrossover <CharacterGene, char>(0.5, 0.5);

                var statistics = new DoubleMomentStatistics();

                for (var j = 0; j < 1000; ++j)
                {
                    var g1C     = g1.Copy();
                    var g2C     = g2.Copy();
                    var changed = crossover.Crossover(g1C, g2C);

                    Assert.Equal(Enumerable
                                 .Range(0, g2C.Length)
                                 .Count(i => char.IsDigit(g2C[i].Allele)), changed
                                 );

                    statistics.Accept(changed);
                }

                Assert.Equal(5.0, statistics.Mean, 1);
            });
        }
コード例 #9
0
        public void PopulationRecombine()
        {
            RandomRegistry.Using(new Random(123), r =>
            {
                var pop  = TestUtils.NewDoubleGenePopulation(5, 1, 2);
                var copy = pop.Copy();

                var recombinator = new IntermediateCrossover <DoubleGene, double>(1);

                recombinator.Alter(pop, 10);

                for (var i = 0; i < pop.Count; ++i)
                {
                    ISeq <DoubleGene> genes = pop[i]
                                              .GetGenotype()
                                              .GetChromosome()
                                              .ToSeq();

                    ISeq <DoubleGene> genesCopy = copy[i]
                                                  .GetGenotype()
                                                  .GetChromosome()
                                                  .ToSeq();

                    foreach (var t in genes)
                    {
                        Assert.NotEqual(t, genesCopy[i]);
                    }
                }
            });
        }
コード例 #10
0
ファイル: CharacterGene.cs プロジェクト: TiZott/jenetics.net
 public static CharacterGene Of(CharSeq validCharacters)
 {
     return(new CharacterGene(
                validCharacters,
                RandomRegistry.GetRandom().Next(validCharacters.Length)
                ));
 }
コード例 #11
0
ファイル: EnumGene.cs プロジェクト: TiZott/jenetics.net
 public EnumGene <TAllele> NewInstance()
 {
     return(new EnumGene <TAllele>(
                RandomRegistry.GetRandom().NextInt(_validAlleles.Length),
                _validAlleles
                ));
 }
コード例 #12
0
        protected internal override int Crossover(IMutableSeq <TGene> v, IMutableSeq <TGene> w)
        {
            var random = RandomRegistry.GetRandom();

            var min = v[0].Min;
            var max = v[0].Max;

            for (int i = 0, n = Math.Min(v.Length, w.Length); i < n; ++i)
            {
                var vi = v[i].DoubleValue();
                var wi = w[i].DoubleValue();

                dynamic t, s;
                do
                {
                    var a = NextDouble(random, -_p, 1 + _p);
                    var b = NextDouble(random, -_p, 1 + _p);

                    t = a * vi + (1 - a) * wi;
                    s = b * wi + (1 - b) * vi;
                } while (t < min || s < min || t >= max || s >= max);

                v[i] = v[i].NewInstance(t);
                w[i] = w[i].NewInstance(s);
            }

            return(2);
        }
コード例 #13
0
        protected internal override int Recombine(Population <TGene, TAllele> population, int[] individuals,
                                                  long generation)
        {
            var random = RandomRegistry.GetRandom();

            var pt1 = population[individuals[0]];
            var pt2 = population[individuals[1]];
            var gt1 = pt1.GetGenotype();
            var gt2 = pt2.GetGenotype();

            var cindex = random.NextInt(Math.Min(gt1.Length, gt2.Length));

            var c1 = gt1.ToSeq().Copy();
            var c2 = gt2.ToSeq();

            var mean = Mean(
                c1[cindex].ToSeq().Copy(),
                c2[cindex].ToSeq()
                );

            c1[cindex] = c1[cindex].NewInstance(mean.ToImmutableSeq());

            population[individuals[0]] = pt1.NewInstance(gt1.NewInstance(c1.ToImmutableSeq()), generation);

            return(1);
        }
コード例 #14
0
        public void IndexOf2(int size)
        {
            var random = RandomRegistry.GetRandom();

            var props   = new double[size];
            var divisor = props.Length * (props.Length + 1) / 2.0;

            for (var i = 0; i < props.Length; ++i)
            {
                props[i] = (i + 1) / divisor;
            }
            Randomize(props, random);

            var incremental = ProbabilitySelector.Incremental((double[])props.Clone());

            const int samples = 100000;

            for (var i = 0; i < samples; ++i)
            {
                var value  = random.NextDouble();
                var index1 = ProbabilitySelector.IndexOf(incremental, value);
                var index2 = IndexOf(props, value);

                Assert.Equal(index2, index1);
            }
        }
コード例 #15
0
ファイル: GaussianMutator.cs プロジェクト: lvv88/jenetics.net
        protected override int Mutate(IMutableSeq <TGene> genes, double p)
        {
            var random = RandomRegistry.GetRandom();

            return(Internal.Math.random.Indexes(random, genes.Length, p)
                   .Peek(i => genes[i] = Mutate(genes[i], random))
                   .Count());
        }
コード例 #16
0
ファイル: CharacterGene.cs プロジェクト: TiZott/jenetics.net
        internal static IImmutableSeq <CharacterGene> Seq(CharSeq chars, int length)
        {
            var r = RandomRegistry.GetRandom();

            return(MutableSeq.OfLength <CharacterGene>(length)
                   .Fill(() => new CharacterGene(chars, r.Next(chars.Length)))
                   .ToImmutableSeq());
        }
コード例 #17
0
ファイル: Mutator.cs プロジェクト: lvv88/jenetics.net
        private Genotype <TGene> Mutate(Genotype <TGene> genotype, double p, IntRef alterations)
        {
            var chromosomes = genotype.ToSeq().Copy();

            alterations.Value += Indexes(RandomRegistry.GetRandom(), genotype.Length, p)
                                 .Select(i => Mutate(chromosomes, i, p)).Sum();

            return(genotype.NewInstance(chromosomes.ToImmutableSeq()));
        }
コード例 #18
0
        protected internal override int Crossover(IMutableSeq <TGene> that, IMutableSeq <TGene> other)
        {
            var random = RandomRegistry.GetRandom();

            var index = random.NextInt(Math.Min(that.Length, other.Length));

            SinglePointCrossover.Crossover(that, other, index);
            return(2);
        }
コード例 #19
0
        protected internal override int Crossover(IMutableSeq <TGene> that, IMutableSeq <TGene> other)
        {
            var length = Math.Min(that.Length, other.Length);

            return(random
                   .Indexes(RandomRegistry.GetRandom(), length, _swapProbability)
                   .Peek(i => Swap(i, that, other))
                   .Count());
        }
コード例 #20
0
        public void Crossover()
        {
            var chars = CharSeq.Of("a-zA-Z");

            var g1 = new CharacterChromosome(chars, 20).ToSeq();
            var g2 = new CharacterChromosome(chars, 20).ToSeq();

            const int rv1 = 12;

            RandomRegistry.Using(new ConstRandom(rv1), r =>
            {
                var crossover = new SinglePointCrossover <CharacterGene, double>();

                var g1C = MutableSeq.Of <CharacterGene>(g1);
                var g2C = MutableSeq.Of <CharacterGene>(g2);
                crossover.Crossover(g1C, g2C);

                Assert.Equal(g1C.ToImmutableSeq().SubSeq(0, rv1), g1.SubSeq(0, rv1));
                Assert.Equal(g1C.SubSeq(rv1), g2.SubSeq(rv1));
                Assert.NotEqual(g1C, g2);
                Assert.NotEqual(g2C, g1);

                const int rv2 = 0;
                RandomRegistry.Using(new ConstRandom(rv2), r2 =>
                {
                    var g1C2 = MutableSeq.Of <CharacterGene>(g1);
                    var g2C2 = MutableSeq.Of <CharacterGene>(g2);
                    crossover.Crossover(g1C2, g2C2);
                    Assert.Equal(g1C2, g2);
                    Assert.Equal(g2C2, g1);
                    Assert.Equal(g1C2.SubSeq(0, rv2), g1.SubSeq(0, rv2));
                    Assert.Equal(g1C2.SubSeq(rv2), g2.SubSeq(rv2));

                    const int rv3 = 1;
                    RandomRegistry.Using(new ConstRandom(rv3), r3 =>
                    {
                        var g1C3 = MutableSeq.Of <CharacterGene>(g1);
                        var g2C3 = MutableSeq.Of <CharacterGene>(g2);
                        crossover.Crossover(g1C3, g2C3);
                        Assert.Equal(g1C3.SubSeq(0, rv3), g1.SubSeq(0, rv3));
                        Assert.Equal(g1C3.SubSeq(rv3), g2.SubSeq(rv3));

                        var rv4 = g1.Length;
                        RandomRegistry.Using(new ConstRandom(rv4), r4 =>
                        {
                            var g1C4 = MutableSeq.Of <CharacterGene>(g1);
                            var g2C4 = MutableSeq.Of <CharacterGene>(g2);
                            crossover.Crossover(g1C4, g2C);
                            Assert.Equal(g1C4, g1);
                            Assert.Equal(g2C4, g2);
                            Assert.Equal(g1C4.SubSeq(0, rv4), g1.SubSeq(0, rv4));
                            Assert.Equal(g1C4.SubSeq(rv4), g2.SubSeq(rv4));
                        });
                    });
                });
            });
        }
コード例 #21
0
        public static IImmutableSeq <DoubleGene> Seq(double minimum, double maximum, int length)
        {
            var min = minimum;
            var max = maximum;
            var r   = RandomRegistry.GetRandom();

            return(MutableSeq.OfLength <DoubleGene>(length).Fill(() =>
                                                                 new DoubleGene(random.NextDouble(r, min, max), minimum, maximum)).ToImmutableSeq());
        }
コード例 #22
0
        internal static IImmutableSeq <IntegerGene> Seq(int minimum, int maximum, int length)
        {
            var min = minimum;
            var max = maximum;
            var r   = RandomRegistry.GetRandom();

            return(MutableSeq.OfLength <IntegerGene>(length)
                   .Fill(() => new IntegerGene(r.NextInt(min, max), minimum, maximum))
                   .ToImmutableSeq());
        }
コード例 #23
0
        public void ChromosomeProbability()
        {
            var data = new byte[1234];

            RandomRegistry.GetRandom().NextBytes(data);

            var c = new BitChromosome(data);

            Assert.Equal(Bits.Count(data) / (double)(data.Length * 8), c.GetOneProbability());
        }
コード例 #24
0
        public void ToBigInteger()
        {
            var data = new byte[1056];

            RandomRegistry.GetRandom().NextBytes(data);
            var value      = new BigInteger(data);
            var chromosome = BitChromosome.Of(value);

            Assert.Equal(chromosome.ToBigInteger(), value);
        }
コード例 #25
0
        public static byte[] NewArray(int length, double p)
        {
            var bytes = NewArray(length);

            foreach (var i in random.Indexes(RandomRegistry.GetRandom(), length, p))
            {
                bytes[bit_rol(i, 3)] |= (byte)(1 << (i & 7));
            }

            return(bytes);
        }
コード例 #26
0
        protected internal override int Crossover(IMutableSeq <TGene> that, IMutableSeq <TGene> other)
        {
            var n = Math.Min(that.Length, other.Length);
            var k = Math.Min(n, _n);

            var random = RandomRegistry.GetRandom();
            var points = k > 0 ? Base.Subset(n, k, random) : new int[0];

            MultiPointCrossover.Crossover(that, other, points);
            return(2);
        }
コード例 #27
0
        protected override int Mutate(IMutableSeq <TGene> genes, double p)
        {
            var random = RandomRegistry.GetRandom();

            if (genes.Length > 1)
            {
                return(Internal.Math.random.Indexes(random, genes.Length, p)
                       .Peek(i => genes.Swap(i, random.NextInt(genes.Length)))
                       .Count());
            }
            return(0);
        }
コード例 #28
0
        protected override Factory <ExponentialScaler> Factory()
        {
            return(() =>
            {
                var random = RandomRegistry.GetRandom();
                double a = random.NextInt(100) + 10;
                double b = random.NextInt(100) + 10;
                double c = random.NextInt(100) + 10;

                return new ExponentialScaler(a, b, c);
            });
        }
コード例 #29
0
        public void FromByteArrayBitSet()
        {
            var random = RandomRegistry.GetRandom();
            var bytes  = new byte[234];

            random.NextBytes(bytes);

            var bits = new BitArray(bytes);
            var c    = BitChromosome.Of(bits);

            Assert.Equal(bytes, c.ToByteArray());
            Assert.Equal(bytes, bits.ToByteArray());
        }
コード例 #30
0
        public void ToByteArray()
        {
            var random = RandomRegistry.GetRandom();
            var data   = new byte[16];

            for (var i = 0; i < data.Length; ++i)
            {
                data[i] = (byte)(random.Next() * 256);
            }
            var bc = new BitChromosome(data);

            Assert.Equal(data, bc.ToByteArray());
        }