private NEAT Crossover(NEAT dominant, NEAT submissive) { NEAT child = new NEAT(dominant); List <Connection> newConnections = new List <Connection>(); foreach (var connection in child.GetConnetionGenom()) { Connection c = submissive.GetConnetionGenom().Find(x => x.innovation == connection.innovation); if (c != null && Random.Range(0f, 1f) > 0.5f) { Node inNode = child.GetNodeGenom().Find(n => n.nodeID == c.inNode); Node outNode = child.GetNodeGenom().Find(n => n.nodeID == c.outNode); if (outNode == null && inNode != null) { outNode = new Node(c.outNode, inNode.order + 1, NodeType.Hidden); child.AddNode(outNode); } else if (outNode == null && inNode == null) { outNode = new Node(c.outNode, 1, NodeType.Hidden); child.AddNode(outNode); } if (inNode == null) { inNode = new Node(c.inNode, 0, NodeType.Hidden); child.AddNode(inNode); } Connection cNew = new Connection(inNode.nodeID, outNode.nodeID, c.weight, c.enabled, c.innovation); newConnections.Add(cNew); } } foreach (var connection in newConnections) { if (!CompareConnection(connection, child)) { if (!LoopSearch(connection, child.GetConnetionGenom())) { child.RemoveConnection(child.GetConnetionGenom().Find(n => n.innovation == connection.innovation)); child.AddConnection(connection); child.GetNodeGenom().Find(n => n.nodeID == connection.inNode).AddConnection(connection); } } } return(child); }
public NEAT LoadBrain() { NEAT network = new NEAT(0, 0); network.SetSize(inputs, outputs); //create all nodes for (int i = 0; i < floatNodes.Length; i += 5) { Node current = new Node((int)floatNodes[i + 1], (int)floatNodes[i], (NodeType)(int)floatNodes[i + 2]); current.activation = floatNodes[i + 3]; current.sum = floatNodes[i + 4]; network.AddNode(current); } //create all connections for (int i = 0; i < floatConnections.Length; i += 5) { bool enable = floatConnections[i + 3] == 1 ? true : false; Connection current = new Connection((int)floatConnections[i], (int)floatConnections[i + 1], floatConnections[i + 2], enable, (int)floatConnections[i + 4]); Debug.Log(current.inNode + "Innode id, " + current.outNode + "outnode id, " + current.weight + "weight, " + current.innovation + "innovation"); network.AddConnection(current); } //add all connections to nodes foreach (var connection in network.GetConnetionGenom()) { Node currentNode = network.GetNodeGenom().Find(x => x.nodeID == connection.inNode); if (currentNode != null) { currentNode.AddConnection(connection); } } network.SetInnovation(innovation); return(network); }