public void InitialNetwork() { //INPUT NODES -> VALUE = 0 NodeGenes.Add(1, new NodeGene(1, NodeGene.TYPE.INPUT, 0)); NodeGenes.Add(2, new NodeGene(2, NodeGene.TYPE.INPUT, 0)); NodeGenes.Add(3, new NodeGene(3, NodeGene.TYPE.INPUT, 0)); NodeGenes.Add(4, new NodeGene(4, NodeGene.TYPE.INPUT, 0)); NodeGenes.Add(5, new NodeGene(5, NodeGene.TYPE.INPUT, 0)); NodeGenes.Add(6, new NodeGene(6, NodeGene.TYPE.INPUT, 0)); NodeGenes.Add(7, new NodeGene(7, NodeGene.TYPE.INPUT, 0)); NodeGenes.Add(8, new NodeGene(8, NodeGene.TYPE.INPUT, 0)); NodeGenes.Add(9, new NodeGene(9, NodeGene.TYPE.INPUT, 0)); //BIAS NODE -> VALUE = 1 NodeGenes.Add(10, new NodeGene(10, NodeGene.TYPE.BIAS, 1)); //Bias //OUTPUT NODE -> VALUE = 0 NodeGenes.Add(11, new NodeGene(11, NodeGene.TYPE.OUTPUT, 0)); NodeGenes.Add(12, new NodeGene(12, NodeGene.TYPE.OUTPUT, 0)); int j = 1; for (int i = 1; i < 11; i++) { ConnectionGenes.Add(new ConnectionGene(i, 11, random.NextDouble(), true, j)); ConnectionGenes.Add(new ConnectionGene(i, 12, random.NextDouble(), true, j + 1)); j = j + 2; } foreach (ConnectionGene connection in GetConnectionGenes()) { NodeGene node = GetNodeGenes()[connection.GetOutputNode()]; if (!node.GetIncomingConnections().Contains(connection)) { node.AddIncomingConnection(connection); } } }
public void MutateAddNode() { ConnectionGene randomConnection = GetConnectionGenes()[random.Next(GetConnectionGenes().Count)]; NodeGene InNode = GetNodeGenes()[randomConnection.GetInputNode()]; NodeGene OutNode = GetNodeGenes()[randomConnection.GetOutputNode()]; randomConnection.SetEnabled(false); NodeGene MiddleNode = new NodeGene(GetNodeGenes().Count + 1, NodeGene.TYPE.HIDDEN, 0); ConnectionGene InputToMiddle = new ConnectionGene(InNode.GetID(), MiddleNode.GetID(), 1, true, NEAT_CONFIGS.GLOBAL_INNOVATION_NUMBER++); ConnectionGenes.Add(InputToMiddle); MiddleNode.AddIncomingConnection(InputToMiddle); ConnectionGene MiddleToOutput = new ConnectionGene(MiddleNode.GetID(), OutNode.GetID(), randomConnection.GetWeight(), true, NEAT_CONFIGS.GLOBAL_INNOVATION_NUMBER++); ConnectionGenes.Add(MiddleToOutput); OutNode.AddIncomingConnection(MiddleToOutput); //Add to the total current Pool Connections Made in this instance NodeGenes.Add(MiddleNode.GetID(), MiddleNode); }