Exemple #1
0
        /// <summary>
        /// Mutates the genome by creating a new connection.
        /// </summary>
        public void Mutate_Link()
        {
            for (int i = 0; i < NEAT.LINK_ATTEMPTS; ++i)
            {
                NodeGene nodeGene_a = Nodes.GetRandomElement();
                NodeGene nodeGene_b = Nodes.GetRandomElement();

                if (nodeGene_a.X == nodeGene_b.X)
                {
                    continue;
                }


                ConnectionGene connectionGene;

                if (nodeGene_a.X < nodeGene_b.X)
                {
                    connectionGene = new ConnectionGene(nodeGene_a, nodeGene_b, 0); //Temp innovation number.
                }
                else
                {
                    connectionGene = new ConnectionGene(nodeGene_b, nodeGene_a, 0); //Temp innovation number.
                }

                if (Connections.Contains(connectionGene))
                {
                    continue;
                }


                connectionGene        = NEAT.CreateConnection(connectionGene.From, connectionGene.To);
                connectionGene.Weight = NEAT.WEIGHT_RANDOM + (random.NextDouble() * 2 - 1);

                Connections.Add_Sorted_Gene(connectionGene);    //This needs to be sorted otherwise something breaks.

                return;
            }
        }