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); }
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"); } }
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); }
public Crossover GetCrossover(CrossoverStrategy type) { return((Crossover)Reflection.GetObjectFromType(_crossovers[type])); }