Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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);
    }