private void GenerateInitialNetsAsCopy(NEATNet net)
    {
        generationNumber = 0; //0 since simulaiton has no been started yet
        testCounter      = 0; //none have been tested
        speciesManager   = new Species(this);

        for (int i = 0; i < populationSize; i++)
        {                                       //run through population size
            NEATNet netCopy = new NEATNet(net); //create net with consultor, perceptron information and test time
            netCopy.SetNetFitness(0f);
            netCopy.SetTimeLived(0f);
            netCopy.SetTestTime(testTime);
            netCopy.ClearNodeValues();
            netCopy.GenerateNeuralNetworkFromGenome();  //< NEW LSES ADDITION

            Population population = speciesManager.ClosestSpecies(netCopy);

            if (population == null)
            {
                population = speciesManager.CreateNewSpecie(new Color(UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0f, 1f)));
                population.Add(netCopy);
            }
            else
            {
                population.Add(netCopy);
            }
        }
    }
    /// <summary>
    /// Generate initial neural network, where all inputs perceptrons are connected to all output perceptrons.
    /// Each of these nerual networks is mutated one time for slight change.
    /// And then they are paired up into species.
    /// </summary>
    private void GenerateInitialNets()
    {
        generationNumber = 0; //0 since simulaiton has no been started yet
        testCounter      = 0; //none have been tested
        speciesManager   = new Species(this);
        //species = new List<List<NEATNet>>(); //create an empty population list

        for (int i = 0; i < populationSize; i++)
        {                                                                                                        //run through population size
            NEATNet net = new NEATNet(consultor, numberOfInputPerceptrons, numberOfOutputPerceptrons, testTime); //create net with consultor, perceptron information and test time
            net.Mutate();                                                                                        //mutate once for diversity (must make sure SJW's aren't triggered)
            net.GenerateNeuralNetworkFromGenome();                                                               //< NEW LSES ADDITION

            Population population = speciesManager.ClosestSpecies(net);

            if (population == null)
            {
                population = speciesManager.CreateNewSpecie(new Color(UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0f, 1f)));
                population.Add(net);
            }
            else
            {
                population.Add(net);
            }

            /*if (species.Count == 0) { //if nothing exists yet
             *  List<NEATNet> newSpecies = new List<NEATNet>(); //create a new species
             *  newSpecies.Add(net); //add net to this new species
             *  species.Add(newSpecies); //add new species to species list
             * }
             * else { //if at least one species exists
             *  int numberOfSpecies = species.Count; //save species count
             *  int location = -1; //-1 means no species match found,  0 >= will mean a species match has been found at a given index
             *
             *  for (int j = 0; j < numberOfSpecies; j++) { //run through species count
             *      int numberOfNets = species[j].Count; //number of organisum in species at index j
             *      int randomIndex = UnityEngine.Random.Range(0, numberOfNets); //pick a random network within this species
             *
             *      if (NEATNet.SameSpeciesV2(species[j][randomIndex], net)) { //check if new network and random network belong to the same species
             *          location = j; //new species can be added to index j
             *          break; //break out of loop
             *      }
             *  }
             *
             *  if (location == -1) { //if no species found
             *      //create new species and add to that
             *      List<NEATNet> newSpecies = new List<NEATNet>();
             *      newSpecies.Add(net);
             *      species.Add(newSpecies);
             *  }
             *  else { //found species that match this network
             *      species[location].Add(net); //add net to the matched species list
             *  }
             * }*/
        }
    }
    /// <summary>
    /// Generate initial neural network, where all inputs neurons are connected to all output neurons.
    /// Each of these nerual networks is mutated one time for slight change.
    /// And then they are paired up into species.
    /// </summary>
    private void GenerateInitialNets()
    {
        generationNumber = 0; //0 since simulaiton has no been started yet
        testCounter      = 0; //none have been tested
        speciesManager   = new Species(this);
        //species = new List<List<NEATNet>>(); //create an empty population list

        for (int i = 0; i < populationSize; i++)
        {                                                                                                //run through population size
            NEATNet net = new NEATNet(consultor, numberOfInputNeurons, numberOfOutputNeurons, testTime); //create net with consultor, perceptron information and test time
            net.Mutate();                                                                                //mutate once for diversity (must make sure SJW's aren't triggered)
            net.GenerateNeuralNetworkFromGenome();                                                       //< NEW LSES ADDITION

            Population population = speciesManager.ClosestSpecies(net);

            if (population == null)
            {
                population = speciesManager.CreateNewSpecie(new Color(UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0f, 1f)));
            }
            population.Add(net);
        }
    }
Esempio n. 4
0
    /// <summary>
    /// Create new generation of net's
    /// </summary>
    /// <param name="maxCap"></param>
    public void GenerateNewGeneration(int maxCap)
    {
        float        totalSharedFitness = 0f; //total shared fitness of the whole population
        float        totalNetworks      = 0f; //total number of organisums (used for distribution)
        List <float> distribution       = new List <float>();


        for (int i = 0; i < species.Count; i++)
        {
            float dist = species[i].GetDistribution(manager.beta);
            distribution.Add(dist);
            totalSharedFitness += dist;
            species[i].RemoveWorst(manager.removeWorst);
        }

        for (int i = 0; i < distribution.Count; i++)
        {
            if (totalSharedFitness <= 0f)
            {
                distribution[i] = 0;
            }
            else
            {
                distribution[i] = (int)((distribution[i] / totalSharedFitness) * maxCap);
            }
            totalNetworks += distribution[i];
        }



        if (maxCap > totalNetworks)
        {
            Debug.Log("More added: " + totalNetworks + " " + maxCap + " " + (maxCap - totalNetworks));
            for (int i = 0; i < (maxCap - totalNetworks); i++)
            {
                int highIndex         = species.Count / 2;
                int randomInsertIndex = UnityEngine.Random.Range(highIndex, species.Count);
                distribution[randomInsertIndex] = distribution[randomInsertIndex] + 1;
            }
        }
        else if (maxCap < totalNetworks)
        {
            Debug.Log("Some removed: " + totalNetworks + " " + maxCap + " " + (maxCap - totalNetworks));
            for (int i = 0; i < (totalNetworks - maxCap); i++)
            {
                bool removed = false;
                while (removed == false)
                {
                    int randomInsertIndex = UnityEngine.Random.Range(0, species.Count);
                    if (distribution[randomInsertIndex] > 0)
                    {
                        distribution[randomInsertIndex] = distribution[randomInsertIndex] - 1;
                        removed = true;
                    }
                }
            }
        }

        for (int i = species.Count - 1; i >= 0; i--)
        {
            if (distribution[i] <= 0 || species[i].GetPopulation().Count == 0)
            {
                distribution.RemoveAt(i);
                species.RemoveAt(i);
            }
        }

        totalNetworks = maxCap;


        List <Population> newSpecies = new List <Population>();

        for (int i = 0; i < distribution.Count; i++)
        {
            int        newDist   = (int)distribution[i];
            Population popOldGen = species[i];
            newSpecies.Add(new Population(species[i].GetColor()));

            for (int j = 0; j < newDist; j++)
            {
                NEATNet net = null;

                if (j > newDist * manager.elite)
                {
                    NEATNet organism1 = popOldGen.GetRandom();
                    NEATNet organism2 = popOldGen.GetRandom();

                    net = NEATNet.Corssover(organism1, organism2);
                    net.Mutate();
                }
                else
                {
                    NEATNet netL = popOldGen.GetLast();
                    if (netL == null)
                    {
                        Debug.Log(newDist + " " + popOldGen.GetPopulation().Count);
                    }
                    net = new NEATNet(popOldGen.GetLast());
                }


                //reset copied stats
                net.SetNetFitness(0f);
                net.SetTimeLived(0f);
                net.SetTestTime(manager.testTime);
                net.ClearNodeValues();

                net.GenerateNeuralNetworkFromGenome();  //< NEW LSES ADDITION

                bool added = newSpecies[i].AddIfMatch(net);

                if (added == false)
                {
                    Population foundPopulation = Species.ClosestSpecies(newSpecies, net);
                    if (foundPopulation == null)
                    {
                        Population newSpecie = Species.CreateNewSpecie(newSpecies, new Color(UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0f, 1f)));
                        newSpecie.Add(net);
                    }
                    else
                    {
                        foundPopulation.Add(net);
                    }
                }
            }
        }
        this.species = newSpecies;
    }