Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
 public HiddenNodeGene(HiddenNodeGene gene) : base(gene)
 {
     type = NodeType.Hidden;
 }