private void Start() { int seed = Random.Range(0, 10000); Random.InitState(seed); Debug.Log("Seed: " + seed); CPPN cppn1 = new CPPN(3, 2, neuronIA, connectionIA); cppn1.printGenome(); CPPN cppn2 = new CPPN(3, 2, neuronIA, connectionIA); cppn2.printGenome(); CPPN.Genome genome = CPPNLib.Crossover(cppn1.genome, cppn2.genome); genome.mutate(neuronIA, connectionIA); cppn = new CPPN(genome, neuronIA, connectionIA); cppn.printGenome(); Debug.Log("fitness: " + Fitness(cppn, 100)); rb = GetComponent <Rigidbody>(); }
private CPPN createFromWinnerAndGetWinner(CPPN cppn, int amount, int evaluationIterations) { CPPN winner = cppn; float winnerScore = fitness(cppn, evaluationIterations); for (int i = 0; i < amount; i++) { CPPN.Genome genome = cppn.genome.copy(); genome.mutate(neuronIA, connectionIA); CPPN newCppn = new CPPN(genome, neuronIA, connectionIA); float score = fitness(newCppn, evaluationIterations); if (score > winnerScore) { winner = newCppn; winnerScore = score; } } Debug.Log("Won with " + winnerScore); return(winner); }
public static CPPN.Genome Crossover(CPPN.Genome p0, CPPN.Genome p1) { CPPN.Genome outputGenome = new CPPN.Genome(); // Combine neurons //Debug.Log("Keys1: " + p0.neuronGenes.Keys.Count); foreach (var n in p0.neuronGenes.Keys) { //Debug.Log(" - " + n); if (p1.neuronGenes.ContainsKey(n)) // Contained in both { if (MyMath.randomBool()) { outputGenome.neuronGenes.Add(n, p0.neuronGenes[n]); } else { outputGenome.neuronGenes.Add(n, p1.neuronGenes[n]); } } else { outputGenome.neuronGenes.Add(n, p0.neuronGenes[n]); // Unique for p0 } } //Debug.Log("Keys2: " + p1.neuronGenes.Keys.Count); foreach (var n in p1.neuronGenes.Keys) { //Debug.Log(" - " + n); if (!outputGenome.neuronGenes.ContainsKey(n)) { outputGenome.neuronGenes.Add(n, p1.neuronGenes[n]); // Unique for p1 } } // Combine connections foreach (var n in p0.connectionGenes.Keys) { if (p1.connectionGenes.ContainsKey(n)) // Contained in both { if (MyMath.randomBool()) { outputGenome.connectionGenes.Add(n, p0.connectionGenes[n]); } else { outputGenome.connectionGenes.Add(n, p1.connectionGenes[n]); } } else { outputGenome.connectionGenes.Add(n, p0.connectionGenes[n]); // Unique for p0 } } foreach (var n in p1.neuronGenes.Keys) { if (!outputGenome.neuronGenes.ContainsKey(n)) { outputGenome.connectionGenes.Add(n, p1.connectionGenes[n]); // Unique for p1 } } return(outputGenome); }