private static NeatGenome AddNode(NeatGenome genome, Population population) { var connectionToSplitt = Neat.random.ConnectionGene(genome); int fromGeneID = -1; int newNodeGeneID = -1; int newNodeID = -1; int toGeneID = -1; if (population.PreviouslySplitConnectionGeneIDs.Contains(connectionToSplitt.geneID)) { var IDs = population.PreviouslySplitConnections[connectionToSplitt.geneID]; fromGeneID = IDs.Item1; newNodeGeneID = IDs.Item2; newNodeID = IDs.Item3; toGeneID = IDs.Item4; if (genome.nodeGenes.Contains(newNodeGeneID)) { Console.WriteLine(); foreach (var n in genome.nodeGenes) { Console.Write("nID:{0} ", n.nodeID); } Console.WriteLine(); throw new Exception("already this generation same nodeID in network!"); } } else { population.PreviouslySplitConnectionGeneIDs.Add(connectionToSplitt.geneID); fromGeneID = population.IDs.ConnectionGeneID; newNodeGeneID = population.IDs.NodeGeneID; newNodeID = genome.nodeGenes.Count + 1; //not ok! toGeneID = population.IDs.ConnectionGeneID; population.PreviouslySplitConnections.Add(connectionToSplitt.geneID, Tuple.Create(fromGeneID, newNodeGeneID, newNodeID, toGeneID)); var seeneBefore = new List <int>(); if (genome.nodeGenes.Contains(newNodeGeneID)) { Console.WriteLine(); foreach (var n in genome.nodeGenes) { Console.Write("nID:{0} ", n.nodeID); } Console.WriteLine(); throw new Exception("new this generation same nodeID in network!"); } } connectionToSplitt.isEnabled = false; var newNode = new HiddenNodeGene(newNodeGeneID, newNodeID, Neat.random.ActivationFunctionType()); var firstHalfGene = new ConnectionGene(fromGeneID, connectionToSplitt.fromNodeID, newNode.nodeID, true, 1.0f); var secondHalfGene = new ConnectionGene(toGeneID, newNode.nodeID, connectionToSplitt.toNodeID, true, (float)Neat.random.NextRangedDouble(0.0, CPPNParameters.InitialMaxConnectionWeight)); if (genome.nodeGenes.Contains(newNode.nodeID)) { Console.WriteLine(); foreach (var n in genome.nodeGenes) { Console.Write("nID:{0} ", n.nodeID); } Console.WriteLine("newID:{0} - newNodeID:{1}", newNode.nodeID, newNodeGeneID); Console.WriteLine(); throw new Exception("addNode NewNode same nodeID in network!"); } genome.nodeGenes.Add(newNode); genome.connectionGenes.Add(firstHalfGene); genome.connectionGenes.Add(secondHalfGene); var seenBefore = new List <int>(); foreach (var node in genome.nodeGenes) { if (!seenBefore.Contains(node.nodeID)) { seenBefore.Add(node.nodeID); } else { Console.WriteLine(); foreach (var n in genome.nodeGenes) { Console.Write("nID:{0} ", n.nodeID); } Console.WriteLine(); throw new Exception("addNode same nodeID in network!"); } } return(genome); }
public HiddenNodeGene(HiddenNodeGene gene) : base(gene) { type = NodeType.Hidden; }