public NeatGenome(NeatGenome copyFromGenome, bool init = false) { nodeGenes = new NodeGeneSequence(); connectionGenes = new ConnectionGeneSequence(); foreach (NodeGene gene in copyFromGenome.nodeGenes) { if (gene.type == NodeType.Sensor) { nodeGenes.Add(new SensorNodeGene(((SensorNodeGene)gene))); } else if (gene.type == NodeType.Hidden) { nodeGenes.Add(new HiddenNodeGene(((HiddenNodeGene)gene))); } else if (gene.type == NodeType.Output) { nodeGenes.Add(new OutputNodeGene(((OutputNodeGene)gene))); } } foreach (ConnectionGene gene in copyFromGenome.connectionGenes) { if (init) { connectionGenes.Add(new ConnectionGene(gene, newWeight: true)); } else { connectionGenes.Add(new ConnectionGene(gene)); } } hasMutated = false; }
private static void HandleExcessGenes(ConnectionGeneSequence connsLong, List <int> InvolvedNodes, int geneIndex, NeatGenome childGenome) { for (int i = geneIndex; i < connsLong.Count; i++) { InvolvedNodes = AddInvolvedConnNodes(InvolvedNodes, connsLong[i]); childGenome.connectionGenes.Add(connsLong[i]); } }
public static bool Contains(this ConnectionGeneSequence connGenes, int fromID, int toID) { foreach (var gene in connGenes) { if (gene.fromNodeID == fromID && gene.toNodeID == toID) { return(true); } } return(false); }
private static List <int> AddExcessGenes(NeatGenome childGenome, ConnectionGeneSequence conns1, ConnectionGeneSequence conns2, List <int> InvolvedNodes, int geneIndex) { if (geneIndex == conns1.Count) { HandleExcessGenes(conns2, InvolvedNodes, geneIndex, childGenome); } else if (geneIndex == conns2.Count) { HandleExcessGenes(conns1, InvolvedNodes, geneIndex, childGenome); } else { throw new Exception("genIndex did not catch up to either parent genome!"); } return(InvolvedNodes); }
private void SetupConnections(ConnectionGeneSequence connectionGenes) { foreach (ConnectionGene gene in connectionGenes) { if (gene.isEnabled) { bool contains = hiddenNodes.ContainsKey(gene.toNodeID); var toDict = contains ? hiddenNodes : outputNodes; var toNode = toDict[gene.toNodeID]; toNode.AddInputConnection(gene.fromNodeID, gene.connectionWeight); if (inputNodes.ContainsKey(gene.fromNodeID)) { inputNodes[gene.fromNodeID].AddOutConnection(toDict[gene.toNodeID]); } else if (hiddenNodes.ContainsKey(gene.fromNodeID)) { ((InternalNetworkNode)hiddenNodes[gene.fromNodeID]).AddOutConnection(toDict[gene.toNodeID]); } } } }
private static List <int> HandleMatchingAndDisjointConnectionGenes(NeatGenome childGenome, NeatGenome mostFitGenome, ConnectionGeneSequence conns1, ConnectionGeneSequence conns2, bool equalFitness, List <int> InvolvedNodes, int geneIndex) { ConnectionGene gene1, gene2; gene1 = conns1[geneIndex]; gene2 = conns2[geneIndex]; bool equalID = gene1.geneID == gene2.geneID; if (equalID) { var gene = Neat.random.NextBoolean() ? gene1 : gene2; InvolvedNodes = AddInvolvedConnNodes(InvolvedNodes, gene); childGenome.connectionGenes.Add(gene); } else { if (equalFitness) { var gene = Neat.random.NextBoolean() ? gene1 : gene2; InvolvedNodes = AddInvolvedConnNodes(InvolvedNodes, gene); childGenome.connectionGenes.Add(gene); } else { var gene = mostFitGenome.connectionGenes[geneIndex]; InvolvedNodes = AddInvolvedConnNodes(InvolvedNodes, gene); childGenome.connectionGenes.Add(gene); } } InvolvedNodes.Sort(); return(InvolvedNodes); }
public NeatGenome() { nodeGenes = new NodeGeneSequence(); connectionGenes = new ConnectionGeneSequence(); hasMutated = false; }