示例#1
0
    public Genome(int ID, int inputs, int outputs, MutParameters mutPar)
    {
        network         = null;
        this.ID         = ID;
        fitness         = 0;
        adjustedFitness = 0;
        this.inputs     = inputs;
        this.outputs    = outputs;
        amountToSpawn   = 0;
        species         = 0;

        perceptrons = new List <NodeGene>();
        connections = new List <ConnectionGene>();

        for (int i = 0; i < inputs; i++)
        {
            perceptrons.Add(new NodeGene(NodeType.Sensor, i, new Vector2(0, (float)i / inputs)));
        }
        perceptrons.Add(new NodeGene(NodeType.Bias, inputs, new Vector2(0, 1), false));
        for (int i = 0; i < outputs; i++)
        {
            perceptrons.Add(new NodeGene(NodeType.Output, i + inputs + 1, new Vector2(1, (float)i / (outputs - 1))));
        }

        for (int i = 0; i < inputs + 1; i++)
        {
            for (int j = 0; j < outputs; j++)
            {
                connections.Add(new ConnectionGene(perceptrons[i].ID, perceptrons[inputs + j + 1].ID, true, inputs + outputs + 1 + NumGenes(), Random.Range(-1f, 1f)));
            }
        }

        this.mutPar = mutPar;
    }
示例#2
0
    public void SetGenome(int ID, List <NodeGene> perceptrons, List <ConnectionGene> connections, int inputs, int outputs, MutParameters mutPar)
    {
        nodeGeneIndex       = 0;
        connectionGeneIndex = 0;
        this.ID             = ID;
        for (int i = 0; i < perceptrons.Count; i++)
        {
            NodeGene curGene = perceptrons[i];
            AddNodeGene(curGene);
        }

        for (int i = 0; i < connections.Count; i++)
        {
            ConnectionGene curGene = connections[i];
            AddConnectionGeneGene(curGene);
        }

        FinishGenome();

        this.inputs     = inputs;
        this.outputs    = outputs;
        fitness         = 0;
        adjustedFitness = 0;
        amountToSpawn   = 0;
        species         = 0;

        this.mutPar = mutPar;
    }
示例#3
0
    public void SetGenome(Genome genome)
    {
        nodeGeneIndex       = 0;
        connectionGeneIndex = 0;
        ID = genome.ID;
        for (int i = 0; i < genome.perceptrons.Count; i++)
        {
            NodeGene curGene = genome.perceptrons[i];
            AddNodeGene(curGene);
        }

        for (int i = 0; i < genome.connections.Count; i++)
        {
            ConnectionGene curGene = genome.connections[i];
            AddConnectionGeneGene(curGene);
        }

        FinishGenome();

        inputs          = genome.inputs;
        outputs         = genome.outputs;
        fitness         = 0;
        adjustedFitness = 0;
        amountToSpawn   = 0;
        species         = 0;

        mutPar = genome.mutPar;
    }
示例#4
0
    public Genome(Genome genome)
    {
        ID          = genome.ID;
        perceptrons = new List <NodeGene>();
        for (int i = 0; i < genome.perceptrons.Count; i++)
        {
            NodeGene curGene = genome.perceptrons[i];
            perceptrons.Add(new NodeGene(curGene.type, curGene.ID, curGene.splitValues, curGene.actResponse, curGene.recurrent));
        }

        connections = new List <ConnectionGene>();
        for (int i = 0; i < genome.connections.Count; i++)
        {
            ConnectionGene curGene = genome.connections[i];
            connections.Add(new ConnectionGene(curGene.from, curGene.to, curGene.enabled, curGene.innovNum, curGene.weight, curGene.recurrent));
        }

        inputs          = genome.inputs;
        outputs         = genome.outputs;
        fitness         = genome.fitness;
        adjustedFitness = genome.adjustedFitness;
        amountToSpawn   = genome.amountToSpawn;
        species         = genome.species;

        mutPar = genome.mutPar;
    }
示例#5
0
    public static Genome RecycledGenome(int ID, int inputs, int outputs, MutParameters mutPar)
    {
        Genome recycledGenome = genomePool[0];

        genomePool.RemoveAt(0);

        recycledGenome.SetGenome(ID, inputs, outputs, mutPar);
        return(recycledGenome);
        //return new Genome(ID, inputs, outputs, mutPar);
    }
示例#6
0
    public Genome(int ID, List <NodeGene> perceptrons, List <ConnectionGene> connections, int inputs, int outputs, MutParameters mutPar)
    {
        network          = null;
        this.connections = connections;
        this.perceptrons = perceptrons;
        amountToSpawn    = 0;
        fitness          = 0;
        adjustedFitness  = 0;
        this.inputs      = inputs;
        this.outputs     = outputs;

        this.mutPar = mutPar;
    }
示例#7
0
    public Genome()
    {
        network         = null;
        ID              = 0;
        fitness         = 0;
        adjustedFitness = 0;
        inputs          = 0;
        outputs         = 0;
        amountToSpawn   = 0;

        perceptrons = new List <NodeGene>();
        connections = new List <ConnectionGene>();

        mutPar = new MutParameters();

        //Random.InitState((int)System.DateTime.Now.Ticks);
    }
示例#8
0
    public static Genome Crossover(ref Genome mum, ref Genome dad, GeneticAlgorithm ga)
    {
        BestParent bestParent = GetBestParent(ref mum, ref dad);

        List <int> newPerceptrons = new List <int>();

        int curMum = 0;
        int curDad = 0;

        ConnectionGene selectedGene = null;

        Genome newGenome = RecycledGenome();

        while (!(curMum == mum.connections.Count && curDad == dad.connections.Count))
        {
            // Dad has more genes
            if (curMum == mum.connections.Count && curDad != dad.connections.Count)
            {
                if (bestParent == BestParent.dad)
                {
                    selectedGene = dad.GetConnectionGenes()[curDad];
                }

                curDad++;


                if (selectedGene == null)
                {
                    continue;
                }
            }
            // Mum has more genes
            else if (curMum != mum.connections.Count && curDad == dad.connections.Count)
            {
                if (bestParent == BestParent.mum)
                {
                    selectedGene = mum.GetConnectionGenes()[curMum];
                }

                curMum++;


                if (selectedGene == null)
                {
                    continue;
                }
            }
            // Mum gene innovation number is lower
            else if (mum.GetConnectionGenes()[curMum].innovNum < dad.GetConnectionGenes()[curDad].innovNum)
            {
                if (bestParent == BestParent.mum)
                {
                    selectedGene = mum.GetConnectionGenes()[curMum];
                }

                curMum++;


                if (selectedGene == null)
                {
                    continue;
                }
            }
            // Dad gene innovation number is lower
            else if (mum.GetConnectionGenes()[curMum].innovNum > dad.GetConnectionGenes()[curDad].innovNum)
            {
                if (bestParent == BestParent.dad)
                {
                    selectedGene = dad.GetConnectionGenes()[curDad];
                }

                curDad++;


                if (selectedGene == null)
                {
                    continue;
                }
            }
            // Both innovation numbers are equal
            else if (mum.GetConnectionGenes()[curMum].innovNum == dad.GetConnectionGenes()[curDad].innovNum)
            {
                if (Random.Range(0f, 1f) > 0.5f)
                {
                    selectedGene = mum.GetConnectionGenes()[curMum];
                }
                else
                {
                    selectedGene = dad.GetConnectionGenes()[curDad];
                }

                curDad++;
                curMum++;
            }
            else
            {
                Debug.Log("wtf");
            }

            if (selectedGene == null)
            {
                Debug.Log("Weird");
                continue;
            }
            if (newGenome.connectionGeneIndex == 0)
            {
                newGenome.AddConnectionGeneGene(new ConnectionGene(selectedGene));
            }
            else
            {
                if (newGenome.connections[newGenome.connectionGeneIndex - 1].innovNum != selectedGene.innovNum)
                {
                    newGenome.AddConnectionGeneGene(new ConnectionGene(selectedGene));
                }
            }

            newPerceptrons = AddPercepID(selectedGene.from, newPerceptrons);
            newPerceptrons = AddPercepID(selectedGene.to, newPerceptrons);
        }

        newPerceptrons.Sort();

        for (int i = 0; i < GA_Parameters.inputs + 1; i++)
        {
            newGenome = ga.innovations.CreateNeuronFromID(i, newGenome);
        }

        for (int i = 0; i < GA_Parameters.outputs; i++)
        {
            newGenome = ga.innovations.CreateNeuronFromID(GA_Parameters.inputs + 1 + i, newGenome);
        }

        for (int i = 0; i < newPerceptrons.Count; i++)
        {
            newGenome = ga.innovations.CreateNeuronFromID(newPerceptrons[i], newGenome);
        }

        MutParameters mutPar = new MutParameters(mum, dad);

        newGenome.ID      = ga.nextGenomeID;
        newGenome.inputs  = mum.inputs;
        newGenome.outputs = mum.outputs;
        newGenome.mutPar  = mutPar;

        ga.nextGenomeID++;

        newGenome.FinishGenome();

        return(newGenome);
    }
示例#9
0
    public Genome(int ID, int inputs, int hidden, int[] hiddenNodes, int outputs, MutParameters mutPar)
    {
        network         = null;
        this.ID         = ID;
        fitness         = 0;
        adjustedFitness = 0;
        this.inputs     = inputs;
        this.outputs    = outputs;
        amountToSpawn   = 0;
        species         = 0;
        //Random.InitState((int)System.DateTime.Now.Ticks);

        perceptrons = new List <NodeGene>();
        connections = new List <ConnectionGene>();
        int count = 0;

        for (int i = 0; i < inputs; i++)
        {
            perceptrons.Add(new NodeGene(NodeType.Sensor, count, new Vector2(0, (float)i / inputs)));
            count++;
        }

        perceptrons.Add(new NodeGene(NodeType.Bias, count, new Vector2(0, 1), false));
        count++;
        inputs++;
        for (int i = 0; i < hidden; i++)
        {
            for (int j = 0; j < hiddenNodes[i]; j++)
            {
                perceptrons.Add(new NodeGene(NodeType.Hidden, count, new Vector2((float)(i + 1) / (hidden + 1), (float)j / hiddenNodes[i])));
                count++;
            }
        }

        for (int i = 0; i < outputs; i++)
        {
            perceptrons.Add(new NodeGene(NodeType.Output, count, new Vector2(1, (float)i / (outputs - 1))));
            count++;
        }

        int percepCount = 0;

        for (int layer = 0; layer < hidden + 1; layer++)
        {
            int numInCurLayer  = 0;
            int numInNextLayer = 0;

            if (layer == 0)
            {
                numInCurLayer  = inputs;
                numInNextLayer = hiddenNodes[0];
            }
            else if (layer - 1 == hidden)
            {
                numInCurLayer  = hiddenNodes[hidden - 1];
                numInNextLayer = outputs;
            }
            else
            {
                numInCurLayer = hiddenNodes[layer - 1];

                if (hiddenNodes.Length - 1 >= layer)
                {
                    numInNextLayer = hiddenNodes[layer];
                }
                else
                {
                    numInNextLayer = outputs;
                }
            }
            int startPercep = percepCount;

            for (int j = 0; j < numInCurLayer; j++)
            {
                for (int z = 0; z < numInNextLayer; z++)
                {
                    int connec = startPercep + numInCurLayer + z;
                    connections.Add(new ConnectionGene(perceptrons[percepCount].ID, perceptrons[connec].ID, true, count + NumGenes(), Random.Range(-1f, 1f)));
                }
                percepCount++;
            }
        }

        this.mutPar = mutPar;
    }
示例#10
0
    public static Genome RecycledGenome(int ID, List <NodeGene> perceptrons, List <ConnectionGene> connections, int inputs, int outputs, MutParameters mutPar)
    {
        Genome recycledGenome = genomePool[0];

        genomePool.RemoveAt(0);

        recycledGenome.SetGenome(ID, perceptrons, connections, inputs, outputs, mutPar);
        return(recycledGenome);
        //return new Genome(ID, perceptrons, connections, inputs, outputs, mutPar);
    }