Exemple #1
0
        public static DNA <T> CrossOver(DNA <T> a, DNA <T> b, CrossoverStrategy strategy, int partition)
        {
            if (!a.Converter.Equals(b.Converter))
            {
                return(null);
            }

            DNA <T> parent = new DNA <T>(a.Converter);

            for (int i = 0; i < a.Compontents.Count; i++)
            {
                DNA <T> _combined = DNA <T> .Combine(a.Compontents[i], b.Compontents[i], strategy, partition);

                parent.AddDNA(_combined);
            }


            return(parent);
        }
Exemple #2
0
        public void ValidateProperties()
        {
            if (MutationRate < 0 || MutationRate > 1 || ElitismRate < 0 || ElitismRate > 1 || CrossoverRate < 0 || CrossoverRate > 1)
            {
                throw new ArgumentException("GAConfiguration rates must be between 0 and 1");
            }

            if (RetirementStrategy != Factory.Enums.RetirementStrategy.None)
            {
                if (MaxRetirement <= 1)
                {
                    throw new ArgumentException("Retirement maximum must be above 1 for this type of retirement type");
                }
            }

            if (!Enum.IsDefined(RetirementStrategy.GetType(), (int)RetirementStrategy))
            {
                throw new ArgumentException("RetirementType must be defined");
            }
            if (!Enum.IsDefined(CrossoverStrategy.GetType(), (int)CrossoverStrategy))
            {
                throw new ArgumentException("CrossoverType must be defined");
            }
            if (!Enum.IsDefined(ImmigrationStrategy.GetType(), (int)ImmigrationStrategy))
            {
                throw new ArgumentException("ImmigrationType must be defined");
            }
            if (!Enum.IsDefined(MutationStrategy.GetType(), (int)MutationStrategy))
            {
                throw new ArgumentException("MutationType must be defined");
            }
            if (!Enum.IsDefined(ParentSelectionStrategy.GetType(), (int)ParentSelectionStrategy))
            {
                throw new ArgumentException("ParentSelectionType must be defined");
            }
        }
Exemple #3
0
        public static DNA <T> Combine(DNA <T> a, DNA <T> b, CrossoverStrategy strategy, int partition)
        {
            string[] seqA = a.FullSequence.GetParts(partition);
            string[] seqB = b.FullSequence.GetParts(partition);

            if (seqA.Length != seqB.Length)
            {
                return(null);
            }
            if (!a.Converter.Name.Equals(b.Converter.Name))
            {
                return(null);
            }

            string[] newDNA      = new string[seqA.Length];
            var      _currentDNA = seqA;

            switch (strategy)
            {
            case CrossoverStrategy.Duplex:
                int _CIindex0 = Globals.GlobalRandom.Next(0, seqA.Length);
                int _CIindex1 = Globals.GlobalRandom.Next(_CIindex0, seqA.Length);


                for (int i = 0; i < _currentDNA.Length; i++)
                {
                    if (i >= _CIindex0 && i < _CIindex1)
                    {
                        _currentDNA = seqB;
                    }
                    else
                    {
                        _currentDNA = seqA;
                    }

                    newDNA[i] = (_currentDNA[i]);
                }

                break;

            case CrossoverStrategy.Simple:
                int _CIindex = Globals.GlobalRandom.Next(0, seqA.Length);

                for (int i = 0; i < _currentDNA.Length; i++)
                {
                    if (i >= _CIindex)
                    {
                        _currentDNA = seqB;
                    }

                    newDNA[i] = (_currentDNA[i]);
                }

                break;

            case CrossoverStrategy.SimplePlusWhatIsLeft:
                int _CIindex2 = Globals.GlobalRandom.Next(0, seqA.Length);
                int _CILength = Globals.GlobalRandom.Next(0, seqA.Length - _CIindex2);

                List <string> _used = new List <string>();

                for (int i = _CIindex2; i < _CIindex2 + _CILength; i++)
                {
                    newDNA[i] = seqA[i];
                    _used.Add(newDNA[i]);
                }

                int lastIndex = 0;
                for (int i = 0; i < newDNA.Length; i++)
                {
                    string _cur = newDNA[i];
                    if (_cur != null)
                    {
                        continue;
                    }

                    for (int j = lastIndex; j < newDNA.Length; j++)
                    {
                        if (_used.Contains(seqB[j]))
                        {
                            continue;
                        }

                        newDNA[i] = seqB[j];
                        lastIndex++;
                        _used.Add(seqB[j]);
                        break;
                    }
                }



                break;
            }

            string combinedDNA = "";

            for (int i = 0; i < newDNA.Length; i++)
            {
                combinedDNA += newDNA[i];
            }

            DNA <T> _Combined = new DNA <T>(a.Converter)
            {
                FullSequence  = combinedDNA,
                FullLength    = newDNA.Length * partition,
                SegmentLength = a.SegmentLength
            };

            return(_Combined);
        }
Exemple #4
0
 public Crossover GetCrossover(CrossoverStrategy type)
 {
     return((Crossover)Reflection.GetObjectFromType(_crossovers[type]));
 }