/// <summary> /// Passes the reset on to the list of cells /// </summary> /// <summary> /// Implements the following table for affinities: /// Affinity table- Affinity A, B, result (new affinity, Chromosome, conj. Chromosome) /// 00 00 00 A and[not] B /// 00 01 01 A and[not] B /// 00 10 10 B and[not] A /// 00 11 Chromosomes laid out vertically /// 01 00 01 B and[not] A /// 01 01 Chromosomes laid out vertically /// 01 10 11 B and[not] A /// 01 11 Chromosomes laid out vertically /// 10 00 10 A and[not] B /// 10 01 11 A and[not] B /// 10 10 Chromosomes laid out vertically /// 10 11 Chromosomes laid out vertically /// 11 00 Chromosomes laid out vertically /// 11 01 Chromosomes laid out vertically /// 11 10 Chromosomes laid out vertically /// 11 11 Chromosomes laid out vertically /// </summary> /// <param name="a">Chromosome A(above)</param> /// <param name="b">Chromosome B(above)</param> /// <returns></returns> public static Chromosome[] Merge(Chromosome a, Chromosome b) { Affinities aAffinity = (Affinities)a.affinityBits.BitsToString().BinaryStringToInt(); Affinities bAffinity = (Affinities)b.affinityBits.BitsToString().BinaryStringToInt(); BitArray result = AffinityBitsFromAffinity(aAffinity | bAffinity); Affinities order = aAffinity | bAffinity; Chromosome[] ret; if (aAffinity == Affinities.complete || bAffinity == Affinities.complete || (aAffinity == bAffinity && bAffinity != Affinities.dontCare)) {//if both are competing for the same position, vertical ret = new Chromosome[2]; ret[0] = a.deepCopy(); ret[1] = b.deepCopy(); } else if (bAffinity == Affinities.first || aAffinity == Affinities.last) { //B and [not] A ret = new Chromosome[1]; ret[0] = new Chromosome(b.cells); ret[0] = JoinCells(ret[0], a); ret[0].affinityBits = AffinityBitsFromAffinity(bAffinity); ret[0].classBits = b.classBits; ret[0].updateCellNum(); } else { ret = new Chromosome[1]; ret[0] = new Chromosome(a.cells); ret[0] = JoinCells(ret[0], b); ret[0].affinityBits = AffinityBitsFromAffinity(aAffinity); ret[0].classBits = a.classBits; ret[0].updateCellNum(); //A and [not] B } return(ret); }
public void AddChromosome(Chromosome x) { x.updateCellNum(); myChromosomes.Add(x.deepCopy()); }