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); }
/// <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)); }
/// <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)); }