private void AddNodes(ConnectGenes checkGenes, Genome p2) { NodeGenes inNode = p2.nodeGenes.Find(x => x.node == checkGenes.inn); NodeGenes outNode = p2.nodeGenes.Find(x => x.node == checkGenes.outt); if (nodeGenes.FindAll(x => x.node == inNode.node).Count == 0) { nodeGenes.Add(new NodeGenes(inNode.node, inNode.nodeType)); } if (nodeGenes.FindAll(x => x.node == outNode.node).Count == 0) { nodeGenes.Add(new NodeGenes(outNode.node, outNode.nodeType)); } }
public static Genome Mate(Genome p1, Genome p2, ref Genome allInovations) { Genome newGenome = new Genome(p1.numSensors, p1.numOutput); newGenome.connectGenes = new List <ConnectGenes>(); newGenome.nodeGenes = new List <NodeGenes>(); if (Random.value < crossOverRate) { int p1L = 0; int p2L = 0; bool p1End = false; bool p2End = false; while (true) { if (p1L >= p1.connectGenes.Count) { p1End = true; } if (p2L >= p2.connectGenes.Count) { p2End = true; } if (p1End && p2End) { break; } ConnectGenes p2Connect = null; ConnectGenes p1Connect = null; if (!p2End) { p2Connect = new ConnectGenes(p2.connectGenes[p2L].inn, p2.connectGenes[p2L].outt, p2.connectGenes[p2L].weight, p2.connectGenes[p2L].enabled, p2.connectGenes[p2L].innov); } if (!p1End) { p1Connect = new ConnectGenes(p1.connectGenes[p1L].inn, p1.connectGenes[p1L].outt, p1.connectGenes[p1L].weight, p1.connectGenes[p1L].enabled, p1.connectGenes[p1L].innov); } if (p1End) { if (p1.fitness < p2.fitness) { newGenome.connectGenes.Add(p2Connect); newGenome.AddNodes(p2.connectGenes[p2L], p2); } else if (p1.fitness > p2.fitness) { } else { if (Random.value > .5f) { newGenome.connectGenes.Add(p2Connect); newGenome.AddNodes(p2.connectGenes[p2L], p2); } } p2L++; } else if (p2End) { if (p1.fitness > p2.fitness) { newGenome.connectGenes.Add(p1Connect); newGenome.AddNodes(p1.connectGenes[p1L], p1); } else if (p1.fitness < p2.fitness) { } else { if (Random.value > .5f) { newGenome.connectGenes.Add(p1Connect); newGenome.AddNodes(p1.connectGenes[p1L], p1); } } p1L++; } else if ((p1.connectGenes[p1L].innov > p2.connectGenes[p2L].innov)) { if (p1.fitness < p2.fitness) { newGenome.connectGenes.Add(p2Connect); newGenome.AddNodes(p2.connectGenes[p2L], p2); } else if (p1.fitness > p2.fitness) { } else { if (Random.value > .5f) { newGenome.connectGenes.Add(p2Connect); newGenome.AddNodes(p2.connectGenes[p2L], p2); } } p2L++; } else if ((p1.connectGenes[p1L].innov < p2.connectGenes[p2L].innov)) { if (p1.fitness > p2.fitness) { newGenome.connectGenes.Add(p1Connect); newGenome.AddNodes(p1.connectGenes[p1L], p1); } else if (p1.fitness < p2.fitness) { } else { if (Random.value > .5f) { newGenome.connectGenes.Add(p1Connect); newGenome.AddNodes(p1.connectGenes[p1L], p1); } } p1L++; } else if (p1.connectGenes[p1L].innov == p2.connectGenes[p2L].innov) { if (Random.value > .5f) { newGenome.connectGenes.Add(p1Connect); newGenome.AddNodes(p1.connectGenes[p1L], p1); } else { newGenome.connectGenes.Add(p2Connect); newGenome.AddNodes(p2.connectGenes[p2L], p2); } if ((!p1.connectGenes[p1L].enabled || !p2.connectGenes[p2L].enabled) && Random.value > .25f) { newGenome.connectGenes[newGenome.connectGenes.Count - 1].setEnabled(false); } p1L++; p2L++; } } newGenome.nodeGenes.Sort((x, y) => x.node.CompareTo(y.node)); newGenome.connectGenes.Sort((x, y) => x.innov.CompareTo(y.innov)); newGenome.innov = newGenome.connectGenes[newGenome.connectGenes.Count - 1].innov; } else if (Random.value < .5) { newGenome.connectGenes = new List <ConnectGenes>(p1.connectGenes); newGenome.nodeGenes = new List <NodeGenes>(p1.nodeGenes); newGenome.innov = p1.innov; } else { newGenome.connectGenes = new List <ConnectGenes>(p2.connectGenes); newGenome.nodeGenes = new List <NodeGenes>(p2.nodeGenes); newGenome.innov = p2.innov; } if (Random.value < mutationChance) { newGenome.Mutate(ref allInovations); } return(newGenome); }