public Genome(int ID, int inputs, int outputs, MutParameters mutPar) { network = null; this.ID = ID; fitness = 0; adjustedFitness = 0; this.inputs = inputs; this.outputs = outputs; amountToSpawn = 0; species = 0; perceptrons = new List <NodeGene>(); connections = new List <ConnectionGene>(); for (int i = 0; i < inputs; i++) { perceptrons.Add(new NodeGene(NodeType.Sensor, i, new Vector2(0, (float)i / inputs))); } perceptrons.Add(new NodeGene(NodeType.Bias, inputs, new Vector2(0, 1), false)); for (int i = 0; i < outputs; i++) { perceptrons.Add(new NodeGene(NodeType.Output, i + inputs + 1, new Vector2(1, (float)i / (outputs - 1)))); } for (int i = 0; i < inputs + 1; i++) { for (int j = 0; j < outputs; j++) { connections.Add(new ConnectionGene(perceptrons[i].ID, perceptrons[inputs + j + 1].ID, true, inputs + outputs + 1 + NumGenes(), Random.Range(-1f, 1f))); } } this.mutPar = mutPar; }
public void SetGenome(int ID, List <NodeGene> perceptrons, List <ConnectionGene> connections, int inputs, int outputs, MutParameters mutPar) { nodeGeneIndex = 0; connectionGeneIndex = 0; this.ID = ID; for (int i = 0; i < perceptrons.Count; i++) { NodeGene curGene = perceptrons[i]; AddNodeGene(curGene); } for (int i = 0; i < connections.Count; i++) { ConnectionGene curGene = connections[i]; AddConnectionGeneGene(curGene); } FinishGenome(); this.inputs = inputs; this.outputs = outputs; fitness = 0; adjustedFitness = 0; amountToSpawn = 0; species = 0; this.mutPar = mutPar; }
public void SetGenome(Genome genome) { nodeGeneIndex = 0; connectionGeneIndex = 0; ID = genome.ID; for (int i = 0; i < genome.perceptrons.Count; i++) { NodeGene curGene = genome.perceptrons[i]; AddNodeGene(curGene); } for (int i = 0; i < genome.connections.Count; i++) { ConnectionGene curGene = genome.connections[i]; AddConnectionGeneGene(curGene); } FinishGenome(); inputs = genome.inputs; outputs = genome.outputs; fitness = 0; adjustedFitness = 0; amountToSpawn = 0; species = 0; mutPar = genome.mutPar; }
public Genome(Genome genome) { ID = genome.ID; perceptrons = new List <NodeGene>(); for (int i = 0; i < genome.perceptrons.Count; i++) { NodeGene curGene = genome.perceptrons[i]; perceptrons.Add(new NodeGene(curGene.type, curGene.ID, curGene.splitValues, curGene.actResponse, curGene.recurrent)); } connections = new List <ConnectionGene>(); for (int i = 0; i < genome.connections.Count; i++) { ConnectionGene curGene = genome.connections[i]; connections.Add(new ConnectionGene(curGene.from, curGene.to, curGene.enabled, curGene.innovNum, curGene.weight, curGene.recurrent)); } inputs = genome.inputs; outputs = genome.outputs; fitness = genome.fitness; adjustedFitness = genome.adjustedFitness; amountToSpawn = genome.amountToSpawn; species = genome.species; mutPar = genome.mutPar; }
public static Genome RecycledGenome(int ID, int inputs, int outputs, MutParameters mutPar) { Genome recycledGenome = genomePool[0]; genomePool.RemoveAt(0); recycledGenome.SetGenome(ID, inputs, outputs, mutPar); return(recycledGenome); //return new Genome(ID, inputs, outputs, mutPar); }
public Genome(int ID, List <NodeGene> perceptrons, List <ConnectionGene> connections, int inputs, int outputs, MutParameters mutPar) { network = null; this.connections = connections; this.perceptrons = perceptrons; amountToSpawn = 0; fitness = 0; adjustedFitness = 0; this.inputs = inputs; this.outputs = outputs; this.mutPar = mutPar; }
public Genome() { network = null; ID = 0; fitness = 0; adjustedFitness = 0; inputs = 0; outputs = 0; amountToSpawn = 0; perceptrons = new List <NodeGene>(); connections = new List <ConnectionGene>(); mutPar = new MutParameters(); //Random.InitState((int)System.DateTime.Now.Ticks); }
public static Genome Crossover(ref Genome mum, ref Genome dad, GeneticAlgorithm ga) { BestParent bestParent = GetBestParent(ref mum, ref dad); List <int> newPerceptrons = new List <int>(); int curMum = 0; int curDad = 0; ConnectionGene selectedGene = null; Genome newGenome = RecycledGenome(); while (!(curMum == mum.connections.Count && curDad == dad.connections.Count)) { // Dad has more genes if (curMum == mum.connections.Count && curDad != dad.connections.Count) { if (bestParent == BestParent.dad) { selectedGene = dad.GetConnectionGenes()[curDad]; } curDad++; if (selectedGene == null) { continue; } } // Mum has more genes else if (curMum != mum.connections.Count && curDad == dad.connections.Count) { if (bestParent == BestParent.mum) { selectedGene = mum.GetConnectionGenes()[curMum]; } curMum++; if (selectedGene == null) { continue; } } // Mum gene innovation number is lower else if (mum.GetConnectionGenes()[curMum].innovNum < dad.GetConnectionGenes()[curDad].innovNum) { if (bestParent == BestParent.mum) { selectedGene = mum.GetConnectionGenes()[curMum]; } curMum++; if (selectedGene == null) { continue; } } // Dad gene innovation number is lower else if (mum.GetConnectionGenes()[curMum].innovNum > dad.GetConnectionGenes()[curDad].innovNum) { if (bestParent == BestParent.dad) { selectedGene = dad.GetConnectionGenes()[curDad]; } curDad++; if (selectedGene == null) { continue; } } // Both innovation numbers are equal else if (mum.GetConnectionGenes()[curMum].innovNum == dad.GetConnectionGenes()[curDad].innovNum) { if (Random.Range(0f, 1f) > 0.5f) { selectedGene = mum.GetConnectionGenes()[curMum]; } else { selectedGene = dad.GetConnectionGenes()[curDad]; } curDad++; curMum++; } else { Debug.Log("wtf"); } if (selectedGene == null) { Debug.Log("Weird"); continue; } if (newGenome.connectionGeneIndex == 0) { newGenome.AddConnectionGeneGene(new ConnectionGene(selectedGene)); } else { if (newGenome.connections[newGenome.connectionGeneIndex - 1].innovNum != selectedGene.innovNum) { newGenome.AddConnectionGeneGene(new ConnectionGene(selectedGene)); } } newPerceptrons = AddPercepID(selectedGene.from, newPerceptrons); newPerceptrons = AddPercepID(selectedGene.to, newPerceptrons); } newPerceptrons.Sort(); for (int i = 0; i < GA_Parameters.inputs + 1; i++) { newGenome = ga.innovations.CreateNeuronFromID(i, newGenome); } for (int i = 0; i < GA_Parameters.outputs; i++) { newGenome = ga.innovations.CreateNeuronFromID(GA_Parameters.inputs + 1 + i, newGenome); } for (int i = 0; i < newPerceptrons.Count; i++) { newGenome = ga.innovations.CreateNeuronFromID(newPerceptrons[i], newGenome); } MutParameters mutPar = new MutParameters(mum, dad); newGenome.ID = ga.nextGenomeID; newGenome.inputs = mum.inputs; newGenome.outputs = mum.outputs; newGenome.mutPar = mutPar; ga.nextGenomeID++; newGenome.FinishGenome(); return(newGenome); }
public Genome(int ID, int inputs, int hidden, int[] hiddenNodes, int outputs, MutParameters mutPar) { network = null; this.ID = ID; fitness = 0; adjustedFitness = 0; this.inputs = inputs; this.outputs = outputs; amountToSpawn = 0; species = 0; //Random.InitState((int)System.DateTime.Now.Ticks); perceptrons = new List <NodeGene>(); connections = new List <ConnectionGene>(); int count = 0; for (int i = 0; i < inputs; i++) { perceptrons.Add(new NodeGene(NodeType.Sensor, count, new Vector2(0, (float)i / inputs))); count++; } perceptrons.Add(new NodeGene(NodeType.Bias, count, new Vector2(0, 1), false)); count++; inputs++; for (int i = 0; i < hidden; i++) { for (int j = 0; j < hiddenNodes[i]; j++) { perceptrons.Add(new NodeGene(NodeType.Hidden, count, new Vector2((float)(i + 1) / (hidden + 1), (float)j / hiddenNodes[i]))); count++; } } for (int i = 0; i < outputs; i++) { perceptrons.Add(new NodeGene(NodeType.Output, count, new Vector2(1, (float)i / (outputs - 1)))); count++; } int percepCount = 0; for (int layer = 0; layer < hidden + 1; layer++) { int numInCurLayer = 0; int numInNextLayer = 0; if (layer == 0) { numInCurLayer = inputs; numInNextLayer = hiddenNodes[0]; } else if (layer - 1 == hidden) { numInCurLayer = hiddenNodes[hidden - 1]; numInNextLayer = outputs; } else { numInCurLayer = hiddenNodes[layer - 1]; if (hiddenNodes.Length - 1 >= layer) { numInNextLayer = hiddenNodes[layer]; } else { numInNextLayer = outputs; } } int startPercep = percepCount; for (int j = 0; j < numInCurLayer; j++) { for (int z = 0; z < numInNextLayer; z++) { int connec = startPercep + numInCurLayer + z; connections.Add(new ConnectionGene(perceptrons[percepCount].ID, perceptrons[connec].ID, true, count + NumGenes(), Random.Range(-1f, 1f))); } percepCount++; } } this.mutPar = mutPar; }
public static Genome RecycledGenome(int ID, List <NodeGene> perceptrons, List <ConnectionGene> connections, int inputs, int outputs, MutParameters mutPar) { Genome recycledGenome = genomePool[0]; genomePool.RemoveAt(0); recycledGenome.SetGenome(ID, perceptrons, connections, inputs, outputs, mutPar); return(recycledGenome); //return new Genome(ID, perceptrons, connections, inputs, outputs, mutPar); }