Beispiel #1
0
 public static CharacterGene Of(CharSeq validCharacters)
 {
     return(new CharacterGene(
                validCharacters,
                RandomRegistry.GetRandom().Next(validCharacters.Length)
                ));
 }
Beispiel #2
0
 public static CharacterGene Of(
     char character,
     CharSeq validCharacters
     )
 {
     return(new CharacterGene(character, validCharacters));
 }
Beispiel #3
0
        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());
        }
        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));
                        });
                    });
                });
            });
        }
Beispiel #5
0
        public static CharacterChromosome Of(string alleles, CharSeq validChars)
        {
            var index = new IntRef();

            var genes = MutableSeq.OfLength <CharacterGene>(alleles.Length).Fill(
                delegate() {
                return(CharacterGene.Of(alleles[index.Value++], validChars));
            }
                ).ToImmutableSeq();

            return(new CharacterChromosome(genes));
        }
Beispiel #6
0
        public void Crossover(string stringA, string stringB, ISeq <int> points, string expectedA, string expectedB)
        {
            var a = CharSeq.ToImmutableSeq(stringA);
            var b = CharSeq.ToImmutableSeq(stringB);

            var ma = a.Copy();
            var mb = b.Copy();

            var intPoints = points.Select(i => i).ToArray();

            MultiPointCrossover.Crossover(ma, mb, intPoints);
            Assert.Equal(ToString(ma), expectedA);
            Assert.Equal(ToString(mb), expectedB);
        }
Beispiel #7
0
        protected CharacterChromosome(SerializationInfo info, StreamingContext context)
        {
            var length = info.GetInt32("_length");

            _validCharacters = (CharSeq)info.GetValue("_validCharacters", typeof(CharSeq));

            var genes = MutableSeq.OfLength <CharacterGene>(length);

            for (var i = 0; i < length; ++i)
            {
                var gene = CharacterGene.Of(
                    info.GetChar("_gene_" + i),
                    _validCharacters
                    );
                genes[i] = gene;
            }

            Genes = genes.ToImmutableSeq();
        }
Beispiel #8
0
        public void SinglePointCrossoverConsistency()
        {
            var a = CharSeq.ToImmutableSeq("1234567890");
            var b = CharSeq.ToImmutableSeq("ABCDEFGHIJ");

            for (var i = 0; i < a.Length + 1; ++i)
            {
                var ma1 = a.Copy();
                var mb1 = b.Copy();
                var ma2 = a.Copy();
                var mb2 = b.Copy();

                MultiPointCrossover.Crossover(ma1, mb1, new[] { i });
                SinglePointCrossover.Crossover(ma2, mb2, i);

                Assert.Equal(ma1, ma2);
                Assert.Equal(mb1, mb2);
            }
        }
Beispiel #9
0
        public void CrossoverAll1()
        {
            var chars = CharSeq.Of("a-zA-Z");
            var g1    = new CharacterChromosome(chars, 20).ToSeq();
            var g2    = new CharacterChromosome(chars, 20).ToSeq();

            var crossover = new MultiPointCrossover <CharacterGene, double>(2000);
            var points    = new int[g1.Length];

            for (var i = 0; i < points.Length; ++i)
            {
                points[i] = i;
            }

            var ms1 = g1.Copy();
            var ms2 = g2.Copy();

            crossover.Crossover(ms1, ms2);
        }
Beispiel #10
0
        public void ReverseCrossover(int npoints)
        {
            for (var i = 1; i < 500; ++i)
            {
                var chars = CharSeq.Of("a-zA-Z");
                var a     = new CharacterChromosome(chars, i).ToSeq().Select(g => g.Allele).ToImmutableSeq();
                var b     = new CharacterChromosome(chars, i).ToSeq().Select(g => g.Allele).ToImmutableSeq();

                var ma1    = a.Copy();
                var mb1    = b.Copy();
                var points = Base.Subset(
                    a.Length + 1,
                    Math.Min(npoints, a.Length + 1),
                    new Random(1234)
                    );

                MultiPointCrossover.Crossover(ma1, mb1, points);
                MultiPointCrossover.Crossover(ma1, mb1, points);

                Assert.Equal(a, ma1);
                Assert.Equal(b, mb1);
            }
        }
Beispiel #11
0
 private CharacterGene(char character, CharSeq validChars)
 {
     Allele           = NonNull(character);
     _validCharacters = NonNull(validChars);
     _valid           = _validCharacters.Contains(Allele);
 }
Beispiel #12
0
 private CharacterGene(CharSeq chars, int index)
 {
     Allele           = chars[index];
     _validCharacters = chars;
     _valid           = true;
 }
Beispiel #13
0
 public CharacterChromosome(CharSeq validCharacters, int length) : this(CharacterGene.Seq(validCharacters,
                                                                                          length))
 {
     Valid = true;
 }
Beispiel #14
0
 public CharacterChromosome(IImmutableSeq <CharacterGene> genes) : base(genes)
 {
     _validCharacters = genes[0].GetValidCharacters();
 }
Beispiel #15
0
 protected override Factory <IChromosome <EnumGene <char> > > Factory()
 {
     return(() => PermutationChromosome.Of(CharSeq.Of("a-zA-Z")));
 }