Exemplo n.º 1
0
    private GNNSpiecies GetRandomSpiecieByFitness()
    {
        GNNSpiecies famTree = spiecies[0];
        float       num     = Random.Range(0, 1.0f);

        if (fullSpieciesScore == 0)
        {
            foreach (GNNSpiecies sp in spiecies)
            {
                fullSpieciesScore += sp.score;
            }
        }

        double cumulative = 0;

        foreach (GNNSpiecies sp in spiecies)
        {
            cumulative += sp.score / fullSpieciesScore;
            if (num < cumulative)
            {
                famTree = sp;
                break;
            }
        }
        return(famTree);
    }
Exemplo n.º 2
0
    private void PopulateSimulations()
    {
        unisignedNet = new List <GNNNet>();
        foreach (GNNSpiecies spiecie in spiecies)
        {
            int keep = (int)(spiecie.family.Count * 0.2f);
            if (keep == 0)
            {
                keep = 1;
            }

            for (int i = 0; i < keep; i++)
            {
                unisignedNet.Add(spiecie.family[i]);
            }
        }

        GNNNet[] parents = new GNNNet[2];
        GNNNet   child;

        int freeSpaces = CONFIG.POPULATION - unisignedNet.Count;

        for (int i = 0; i < freeSpaces; i++)
        {
            GNNSpiecies spiecie = GetRandomSpiecieByFitness();

            parents[0] = spiecie.GetRandomNetByFitness();
            parents[1] = spiecie.GetRandomNetByFitness();

            if (parents[0].fitnessScore < parents[1].fitnessScore)
            {
                GNNNet tmp = parents[0];
                parents[0] = parents[1];
                parents[1] = tmp;
            }

            child = parents[0].Breed(parents[1]);

            if (Random.Range(0, 101) < 50)
            {
                child.Mutation();
            }
            if (Random.Range(0, 101) < 10)
            {
                child.SafeMutation("node");
            }
            if (Random.Range(0, 101) < 10)
            {
                child.SafeMutation("link");
            }

            child.connections = child.connections.OrderBy(x => x.innov).ToList();
            unisignedNet.Add(child);
        }
    }