コード例 #1
0
        public bool MutateByInsertNodeBetweenConnection()
        {
            for (int i = 0; i < m_originGenome.connectionGenes.Length; i++)
            {
                // The inbetween node
                int middleNodeIndex          = m_originGenome.nodeGenes.Length;
                Genometype.NodeGenes newNode = new Genometype.NodeGenes(Genometype.NodeGenes.Types.Hidden);

                // The replacement connection
                Genometype.ConnectionGenens firstHalfConnection = new Genometype.ConnectionGenens(
                    m_originGenome.connectionGenes[i].inputNodeIndex, middleNodeIndex, 1);

                Genometype.ConnectionGenens secondHalfConnection = new Genometype.ConnectionGenens(
                    middleNodeIndex, m_originGenome.connectionGenes[i].outputNodeIndex,
                    m_originGenome.connectionGenes[i].weight);

                // Create the new genome, and disabled the original connection
                Genometype newGenome = MutateGenome(newNode, new Genometype.ConnectionGenens[] {
                    firstHalfConnection,
                    secondHalfConnection,
                });
                newGenome.connectionGenes[i].enabled = false;

                mutations.Add(newGenome);
            }

            return(false);
        }
コード例 #2
0
        /// <summary>
        /// Similar to clone, except add new connection while cloning
        /// </summary>
        /// <param name="newConnections">The new connections</param>
        /// <returns>The new genome</returns>
        private Genometype MutateGenome(Genometype.ConnectionGenens newConnection)
        {
            // Copy the nodes
            Genometype.NodeGenes[] newNodeGenes = new Genometype.NodeGenes[m_originGenome.nodeGenes.Length];
            for (int i = 0; i < m_originGenome.nodeGenes.Length; i++)
            {
                newNodeGenes[i] = m_originGenome.nodeGenes[i];
            }

            // Copy the connection
            Genometype.ConnectionGenens[] newConnectionGenes = new Genometype.ConnectionGenens[m_originGenome.connectionGenes.Length + 1];
            for (int i = 0; i < m_originGenome.connectionGenes.Length; i++)
            {
                newConnectionGenes[i] = m_originGenome.connectionGenes[i];
            }
            // Add new connection at the end
            newConnectionGenes[m_originGenome.connectionGenes.Length] = newConnection;

            return(new Genometype(newNodeGenes, newConnectionGenes));
        }
コード例 #3
0
        /// <summary>
        /// Similar to clone, except add new connection and new node while cloning
        /// </summary>
        /// <param name="newNode">The new node</param>
        /// <param name="newConnections">Array of the new connections</param>
        /// <returns>The new genome</returns>
        private Genometype MutateGenome(Genometype.NodeGenes newNode, Genometype.ConnectionGenens[] newConnections)
        {
            // Copy the nodes
            Genometype.NodeGenes[] newNodeGenes = new Genometype.NodeGenes[m_originGenome.nodeGenes.Length + 1];
            for (int i = 0; i < m_originGenome.nodeGenes.Length; i++)
            {
                newNodeGenes[i] = m_originGenome.nodeGenes[i];
            }
            newNodeGenes[m_originGenome.nodeGenes.Length] = newNode;

            // Copy the connection
            Genometype.ConnectionGenens[] newConnectionGenes = new Genometype.ConnectionGenens[m_originGenome.connectionGenes.Length + newConnections.Length];
            for (int i = 0; i < m_originGenome.connectionGenes.Length; i++)
            {
                newConnectionGenes[i] = m_originGenome.connectionGenes[i];
            }
            for (int i = 0; i < newConnections.Length; i++)
            {
                newConnectionGenes[i + m_originGenome.connectionGenes.Length] = newConnections[i];
            }

            return(new Genometype(newNodeGenes, newConnectionGenes));
        }