private static List<Chromosome> Inversion(ChromosomePair pair) { List<Chromosome> rezult = new List<Chromosome>(1); Chromosome chr = pair.Chr1.CloneByGenes(); for (int i = 3; i < 11; i++) { chr[i] = !chr[i]; } rezult.Add(chr); return rezult; }
private static List<Chromosome> Crossing(ChromosomePair pair, int GenNumber) { List<Chromosome> rezult = new List<Chromosome>(1); Chromosome chr1 = pair.Chr1.CloneByGenes(); Chromosome chr2 = pair.Chr2.CloneByGenes(); for (int i = GenNumber; i < chr1.Length; i++) { chr1[i] = pair.Chr2[i]; chr2[i] = pair.Chr1[i]; } rezult.Add(chr1); rezult.Add(chr2); return rezult; }
public static List<Chromosome> DoCrossing(ChromosomePair pair, int GenNumber, double mutationChance = 0.07) { List<Chromosome> rezult = null; if (pair.Chr1.EqualByGenes(pair.Chr2)) rezult = Inversion(pair); else rezult = Crossing(pair, GenNumber); for (int i = 0; i < rezult.Count; i++) { rezult[i] = rezult[i].Mutate(mutationChance); } return rezult; }
private static ChromosomePair GetPairRandom(List<Chromosome> chromosomes) { ChromosomePair pair = new ChromosomePair(); if (chromosomes.Count < 2) throw new ArgumentException("chromosomes count must be >= 2"); else if (chromosomes.Count == 2) { pair.Chr1 = chromosomes[0]; pair.Chr2 = chromosomes[1]; } else { int i1 = Randomizer.Rnd.Next(chromosomes.Count - 1); int i2 = Randomizer.Rnd.Next(chromosomes.Count - 1); pair.Chr1 = chromosomes[i1]; pair.Chr2 = chromosomes[i2]; } return pair; }
private static ChromosomePair GetPairRoulette(List<Chromosome> chromosomes) { Chromosome ch1 = chromosomes[0]; Chromosome ch2 = chromosomes[1]; double[] range = new double[chromosomes.Count + 1]; double min = chromosomes.Min(ch => ch.F); for (int i = 0; i < chromosomes.Count; i++) { range[i + 1] = range[i] + chromosomes[i].F - min; } double A = range[chromosomes.Count]; double r1 = Randomizer.Rnd.NextDouble() * A; double r2 = Randomizer.Rnd.NextDouble() * A; for (int i = 0; i < chromosomes.Count; i++) { if ((range[i] <= r1) && (r1 <= range[i + 1])) ch1 = chromosomes[i]; if ((range[i] <= r2) && (r2 <= range[i + 1])) ch2 = chromosomes[i]; } ChromosomePair pair = new ChromosomePair() { Chr1 = ch1, Chr2 = ch2 }; return pair; }