Ejemplo n.º 1
0
    private void CalculateNodeInputs(NeuronNEAT currentNeuron)    // recursive function
    {
        numNodesVisited++;
        if (numNodesVisited >= 100)
        {
            Debug.Log("CalculateNodeInputs() HIT MAX NODE COUNT!");
            return;
        }

        visitedNodes.Add(currentNeuron);  // to avoid infinite recursion

        for (int i = 0; i < currentNeuron.incomingConnectionsList.Count; i++)
        {
            //Debug.Log("CalculateNodeInputs! [" + currentNeuron.id.ToString() + "] incoming: " + currentNeuron.incomingConnectionsList[i].fromNodeID.ToString() + " -> " + currentNeuron.incomingConnectionsList[i].toNodeID.ToString());
            //if (outputNeuronList.Contains(currentNeuron)) {
            //Debug.Log("CalculateNodeInputs! visitedNodes.Clear();");
            //}
            currentNeuron.currentValue[0] += neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID].previousValue * currentNeuron.incomingConnectionsList[i].weight[0];
            if (neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID].nodeType != GeneNodeNEAT.GeneNodeType.In)   // if incoming connection isn't an Input Neuron
            {
                if (visitedNodes.Contains(neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID]))
                {
                    if (completedNodes.Contains(neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID]))
                    {
                        // done
                    }
                    else
                    {
                        Debug.Log("Incoming connection has already been visited!  RECURSION?? nodeID: " + currentNeuron.id.ToString() + ", fromNode: " + neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID].id.ToString());
                    }
                }
                else
                {
                    CalculateNodeInputs(neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID]);
                }
            }
            else
            {
                // if it IS an input neuron:
                visitedNodes.Clear();
            }
        }
        if (currentNeuron.nodeType == GeneNodeNEAT.GeneNodeType.Out)
        {
            currentNeuron.currentValue[0] = TransferFunctions.Evaluate(TransferFunctions.TransferFunction.RationalSigmoid, currentNeuron.currentValue[0]);
        }
        else
        {
            currentNeuron.currentValue[0] = TransferFunctions.Evaluate(TransferFunctions.TransferFunction.Linear, currentNeuron.currentValue[0]);
        }
        completedNodes.Add(currentNeuron);

        //processedNodes.Add(currentNeuron);
        //return allInputsProcessed;
    }
Ejemplo n.º 2
0
    private Color GetColorFromNeuron(NeuronNEAT neuron)
    {
        //black = -1, white = 1
        float val01    = neuron.currentValue[0] * neuronRadiusMaxValue + 0.5f;
        Color newColor = new Color(val01, val01, val01);

        if (neuron.nodeType == GeneNodeNEAT.GeneNodeType.In)
        {
            newColor = Color.Lerp(newColor, new Color(0f, 1f, 0f), 0.25f);
        }
        if (neuron.nodeType == GeneNodeNEAT.GeneNodeType.Hid)
        {
            newColor = Color.Lerp(newColor, new Color(1f, 1f, 0f), 0.25f);
        }
        if (neuron.nodeType == GeneNodeNEAT.GeneNodeType.Out)
        {
            newColor = Color.Lerp(newColor, new Color(1f, 0f, 0f), 0.25f);
        }

        return(newColor);
    }
    private Color GetColorFromNeuron(NeuronNEAT neuron) {
        //black = -1, white = 1
        float val01 = neuron.currentValue[0] * neuronRadiusMaxValue + 0.5f;
        Color newColor = new Color(val01, val01, val01);
        if (neuron.nodeType == GeneNodeNEAT.GeneNodeType.In) {
            newColor = Color.Lerp(newColor, new Color(0f, 1f, 0f), 0.25f);
        }
        if (neuron.nodeType == GeneNodeNEAT.GeneNodeType.Hid) {
            newColor = Color.Lerp(newColor, new Color(1f, 1f, 0f), 0.25f);
        }
        if (neuron.nodeType == GeneNodeNEAT.GeneNodeType.Out) {
            newColor = Color.Lerp(newColor, new Color(1f, 0f, 0f), 0.25f);
        }

        return newColor;
    }
Ejemplo n.º 4
0
 public void BuildBrainNetwork() {
     if(neuronList == null) {
         neuronList = new List<NeuronNEAT>();
     }
     else {
         neuronList.Clear();
     }
     if(connectionList == null) {
         connectionList = new List<ConnectionNEAT>();
     }
     else {
         connectionList.Clear();
     }
     if (inputNeuronList == null) {
         inputNeuronList = new List<NeuronNEAT>();
     }
     else {
         inputNeuronList.Clear();
     }
     if (outputNeuronList == null) {
         outputNeuronList = new List<NeuronNEAT>();
     }
     else {
         outputNeuronList.Clear();
     }
     int numActiveNodes = 0;
     int numActiveLinks = 0;
     // Create nodes:
     string nodesString = "BuildBrainNetwork() nodes: \n";
     //Debug.Log("BuildBrainNetwork sourceGenome.nodeNEATList: " + sourceGenome.nodeNEATList.Count.ToString() + ", #sourceGenome.linkNEATList: " + sourceGenome.linkNEATList.Count.ToString());
     for (int i = 0; i < sourceGenome.nodeNEATList.Count; i++) {
         NeuronNEAT newNeuron = new NeuronNEAT(sourceGenome.nodeNEATList[i].id, sourceGenome.nodeNEATList[i].nodeType, sourceGenome.nodeNEATList[i].activationFunction);
         neuronList.Add(newNeuron);
         if(newNeuron.nodeType == GeneNodeNEAT.GeneNodeType.In) {
             inputNeuronList.Add(newNeuron);  // save reference to node 
         }
         if (newNeuron.nodeType == GeneNodeNEAT.GeneNodeType.Out) {
             outputNeuronList.Add(newNeuron);
         }
         nodesString += "[" + i.ToString() + "]: " + newNeuron.nodeType.ToString() + ", (" + sourceGenome.nodeNEATList[i].id.ToString() + ", " + sourceGenome.nodeNEATList[i].sourceAddonInno.ToString() + ", " + sourceGenome.nodeNEATList[i].sourceAddonRecursionNum.ToString() + ", " + sourceGenome.nodeNEATList[i].sourceAddonChannelNum.ToString() + ")\n";
         numActiveNodes++;
     }
     //Debug.Log(nodesString);
     // Create connections:
     string connectionsString = "BuildBrainNetwork() connections: ";
     for (int o = 0; o < sourceGenome.linkNEATList.Count; o++) {
         if(sourceGenome.linkNEATList[o].enabled) {
             numActiveLinks++;
             ConnectionNEAT newConnection = new ConnectionNEAT(sourceGenome.GetNodeIndexFromInt3(sourceGenome.linkNEATList[o].fromNodeID), sourceGenome.GetNodeIndexFromInt3(sourceGenome.linkNEATList[o].toNodeID), sourceGenome.linkNEATList[o].weight);
             connectionList.Add(newConnection);
             neuronList[newConnection.toNodeID].incomingConnectionsList.Add(newConnection); // add this connection to its destination neuron's list
                                                                                            //Debug.Log("linkNEATList[" + o.ToString() + "], from: " + newConnection.fromNodeID.ToString() + ", to: " + newConnection.toNodeID.ToString() + ", weight: " + newConnection.weight[0]);
             connectionsString += "[" + o.ToString() + "] " + newConnection.fromNodeID.ToString() + "->" + newConnection.toNodeID.ToString() + ", w: " + newConnection.weight[0].ToString() + ", ";
         }            
     }
     //Debug.Log("BuildBrainNetwork #nodes: " + numActiveNodes.ToString() + ", #links: " + numActiveLinks.ToString());
     //Debug.Log(connectionsString);
 }
Ejemplo n.º 5
0
    private void CalculateNodeInputs(NeuronNEAT currentNeuron) {  // recursive function
        numNodesVisited++;
        if (numNodesVisited >= 100) {
            Debug.Log("CalculateNodeInputs() HIT MAX NODE COUNT!");
            return;
        }

        visitedNodes.Add(currentNeuron);  // to avoid infinite recursion
        
        for (int i = 0; i < currentNeuron.incomingConnectionsList.Count; i++) {
            //Debug.Log("CalculateNodeInputs! [" + currentNeuron.id.ToString() + "] incoming: " + currentNeuron.incomingConnectionsList[i].fromNodeID.ToString() + " -> " + currentNeuron.incomingConnectionsList[i].toNodeID.ToString());
            //if (outputNeuronList.Contains(currentNeuron)) {
                //Debug.Log("CalculateNodeInputs! visitedNodes.Clear();");                
            //}
            currentNeuron.currentValue[0] += neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID].previousValue * currentNeuron.incomingConnectionsList[i].weight[0];
            if (neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID].nodeType != GeneNodeNEAT.GeneNodeType.In) { // if incoming connection isn't an Input Neuron   
                if(visitedNodes.Contains(neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID])) {
                    if(completedNodes.Contains(neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID])) {
                        // done
                    }
                    else {
                        Debug.Log("Incoming connection has already been visited!  RECURSION?? nodeID: " + currentNeuron.id.ToString() + ", fromNode: " + neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID].id.ToString());
                    }                    
                } 
                else {                    
                    CalculateNodeInputs(neuronList[currentNeuron.incomingConnectionsList[i].fromNodeID]);
                }           
                
            }
            else {
                // if it IS an input neuron:
                visitedNodes.Clear();
            }
            
        }
        if(currentNeuron.nodeType == GeneNodeNEAT.GeneNodeType.Out) {
            currentNeuron.currentValue[0] = TransferFunctions.Evaluate(TransferFunctions.TransferFunction.RationalSigmoid, currentNeuron.currentValue[0]);
        }
        else {
            currentNeuron.currentValue[0] = TransferFunctions.Evaluate(TransferFunctions.TransferFunction.Linear, currentNeuron.currentValue[0]);
        }
        completedNodes.Add(currentNeuron);

        //processedNodes.Add(currentNeuron);
        //return allInputsProcessed;
    }
Ejemplo n.º 6
0
    public void BuildBrainNetwork()
    {
        if (neuronList == null)
        {
            neuronList = new List <NeuronNEAT>();
        }
        else
        {
            neuronList.Clear();
        }
        if (connectionList == null)
        {
            connectionList = new List <ConnectionNEAT>();
        }
        else
        {
            connectionList.Clear();
        }
        if (inputNeuronList == null)
        {
            inputNeuronList = new List <NeuronNEAT>();
        }
        else
        {
            inputNeuronList.Clear();
        }
        if (outputNeuronList == null)
        {
            outputNeuronList = new List <NeuronNEAT>();
        }
        else
        {
            outputNeuronList.Clear();
        }
        int numActiveNodes = 0;
        int numActiveLinks = 0;
        // Create nodes:
        string nodesString = "BuildBrainNetwork() nodes: \n";

        //Debug.Log("BuildBrainNetwork sourceGenome.nodeNEATList: " + sourceGenome.nodeNEATList.Count.ToString() + ", #sourceGenome.linkNEATList: " + sourceGenome.linkNEATList.Count.ToString());
        for (int i = 0; i < sourceGenome.nodeNEATList.Count; i++)
        {
            NeuronNEAT newNeuron = new NeuronNEAT(sourceGenome.nodeNEATList[i].id, sourceGenome.nodeNEATList[i].nodeType, sourceGenome.nodeNEATList[i].activationFunction);
            neuronList.Add(newNeuron);
            if (newNeuron.nodeType == GeneNodeNEAT.GeneNodeType.In)
            {
                inputNeuronList.Add(newNeuron);  // save reference to node
            }
            if (newNeuron.nodeType == GeneNodeNEAT.GeneNodeType.Out)
            {
                outputNeuronList.Add(newNeuron);
            }
            nodesString += "[" + i.ToString() + "]: " + newNeuron.nodeType.ToString() + ", (" + sourceGenome.nodeNEATList[i].id.ToString() + ", " + sourceGenome.nodeNEATList[i].sourceAddonInno.ToString() + ", " + sourceGenome.nodeNEATList[i].sourceAddonRecursionNum.ToString() + ", " + sourceGenome.nodeNEATList[i].sourceAddonChannelNum.ToString() + ")\n";
            numActiveNodes++;
        }
        //Debug.Log(nodesString);
        // Create connections:
        string connectionsString = "BuildBrainNetwork() connections: ";

        for (int o = 0; o < sourceGenome.linkNEATList.Count; o++)
        {
            if (sourceGenome.linkNEATList[o].enabled)
            {
                numActiveLinks++;
                ConnectionNEAT newConnection = new ConnectionNEAT(sourceGenome.GetNodeIndexFromInt3(sourceGenome.linkNEATList[o].fromNodeID), sourceGenome.GetNodeIndexFromInt3(sourceGenome.linkNEATList[o].toNodeID), sourceGenome.linkNEATList[o].weight);
                connectionList.Add(newConnection);
                neuronList[newConnection.toNodeID].incomingConnectionsList.Add(newConnection); // add this connection to its destination neuron's list
                                                                                               //Debug.Log("linkNEATList[" + o.ToString() + "], from: " + newConnection.fromNodeID.ToString() + ", to: " + newConnection.toNodeID.ToString() + ", weight: " + newConnection.weight[0]);
                connectionsString += "[" + o.ToString() + "] " + newConnection.fromNodeID.ToString() + "->" + newConnection.toNodeID.ToString() + ", w: " + newConnection.weight[0].ToString() + ", ";
            }
        }
        //Debug.Log("BuildBrainNetwork #nodes: " + numActiveNodes.ToString() + ", #links: " + numActiveLinks.ToString());
        //Debug.Log(connectionsString);
    }