Example #1
0
    private void Start()
    {
        int seed = Random.Range(0, 10000);

        Random.InitState(seed);
        Debug.Log("Seed: " + seed);
        CPPN cppn1 = new CPPN(3, 2, neuronIA, connectionIA);

        cppn1.printGenome();
        CPPN cppn2 = new CPPN(3, 2, neuronIA, connectionIA);

        cppn2.printGenome();
        CPPN.Genome genome = CPPNLib.Crossover(cppn1.genome, cppn2.genome);
        genome.mutate(neuronIA, connectionIA);
        cppn = new CPPN(genome, neuronIA, connectionIA);
        cppn.printGenome();
        Debug.Log("fitness: " + Fitness(cppn, 100));
        rb = GetComponent <Rigidbody>();
    }
Example #2
0
    private CPPN createFromWinnerAndGetWinner(CPPN cppn, int amount, int evaluationIterations)
    {
        CPPN  winner      = cppn;
        float winnerScore = fitness(cppn, evaluationIterations);

        for (int i = 0; i < amount; i++)
        {
            CPPN.Genome genome = cppn.genome.copy();
            genome.mutate(neuronIA, connectionIA);
            CPPN  newCppn = new CPPN(genome, neuronIA, connectionIA);
            float score   = fitness(newCppn, evaluationIterations);
            if (score > winnerScore)
            {
                winner      = newCppn;
                winnerScore = score;
            }
        }
        Debug.Log("Won with " + winnerScore);
        return(winner);
    }
Example #3
0
    public static CPPN.Genome Crossover(CPPN.Genome p0, CPPN.Genome p1)
    {
        CPPN.Genome outputGenome = new CPPN.Genome();

        // Combine neurons
        //Debug.Log("Keys1: " + p0.neuronGenes.Keys.Count);
        foreach (var n in p0.neuronGenes.Keys)
        {
            //Debug.Log(" - " + n);
            if (p1.neuronGenes.ContainsKey(n))   // Contained in both
            {
                if (MyMath.randomBool())
                {
                    outputGenome.neuronGenes.Add(n, p0.neuronGenes[n]);
                }
                else
                {
                    outputGenome.neuronGenes.Add(n, p1.neuronGenes[n]);
                }
            }
            else
            {
                outputGenome.neuronGenes.Add(n, p0.neuronGenes[n]); // Unique for p0
            }
        }
        //Debug.Log("Keys2: " + p1.neuronGenes.Keys.Count);
        foreach (var n in p1.neuronGenes.Keys)
        {
            //Debug.Log(" - " + n);
            if (!outputGenome.neuronGenes.ContainsKey(n))
            {
                outputGenome.neuronGenes.Add(n, p1.neuronGenes[n]); // Unique for p1
            }
        }

        // Combine connections
        foreach (var n in p0.connectionGenes.Keys)
        {
            if (p1.connectionGenes.ContainsKey(n))   // Contained in both
            {
                if (MyMath.randomBool())
                {
                    outputGenome.connectionGenes.Add(n, p0.connectionGenes[n]);
                }
                else
                {
                    outputGenome.connectionGenes.Add(n, p1.connectionGenes[n]);
                }
            }
            else
            {
                outputGenome.connectionGenes.Add(n, p0.connectionGenes[n]); // Unique for p0
            }
        }
        foreach (var n in p1.neuronGenes.Keys)
        {
            if (!outputGenome.neuronGenes.ContainsKey(n))
            {
                outputGenome.connectionGenes.Add(n, p1.connectionGenes[n]); // Unique for p1
            }
        }

        return(outputGenome);
    }