Пример #1
0
    public void cruzamento(IndividuoAG[] pais)
    {
        // Cruzamento com média ponderada usando peso aleatório
        // http://www2.peq.coppe.ufrj.br/Pessoal/Professores/Arge/COQ897/Naturais/aulas_piloto/aula4.pdf

        int   geracaoAtual = pais[0].getGeracao(), count = 0, par, i;
        float mediaPonderada;

        float[] filho1, filho2;

        IndividuoAG[] novaGeracao = new IndividuoAG[pais.Length * 2];
        do
        {
            par = UnityEngine.Random.Range(0, pais.Length);

            if (par != count)
            {
                mediaPonderada = UnityEngine.Random.Range(1, 100) / 100f;
                filho1         = new float[pais[0].getCromossomos().Length];
                filho2         = new float[pais[0].getCromossomos().Length];

                for (i = 0; i < pais[0].getCromossomos().Length; i++)
                {
                    filho1[i] = ((1 - mediaPonderada) * pais[count].getCromossomos()[i]) + (mediaPonderada * pais[par].getCromossomos()[i]);
                    filho2[i] = (mediaPonderada * pais[count].getCromossomos()[i]) + ((1 - mediaPonderada) * pais[par].getCromossomos()[i]);
                }

                //cria filho 1
                novaGeracao[(count * 2)] = new IndividuoAG();
                novaGeracao[(count * 2)].setGeracao(geracaoAtual + 1);
                novaGeracao[(count * 2)].setCromossomo(filho1);

                //e filho 2
                novaGeracao[(count * 2) + 1] = new IndividuoAG();
                novaGeracao[(count * 2) + 1].setGeracao(geracaoAtual + 1);
                novaGeracao[(count * 2) + 1].setCromossomo(filho2);
                count++;
            }
        } while (count < pais.Length);

        AG.populacao = novaGeracao;

        Debug.Log("Proxima Geração = true");
        AG.proxGeracao = true;

        mutacao();
    }
Пример #2
0
    public IEnumerator CriaGeracoes(int numeroGeracoes)
    {
        //IndividuoAG[] Npopulacao = new IndividuoAG[populacao.Length];

        int i, p;

        for (i = this.geracaoIni; i < numeroGeracoes; i++)
        {
            this.salvarGeracao(i);

            AG.numGeracao++;
            AG.divideJogagas = true;
            AG.fazCruzamento = false;
            AG.proxGeracao   = false;

            IndividuoAG[] pais = new IndividuoAG[AG.populacao.Length / 2];
            Debug.Log("selecaoPais");
            StartCoroutine(selecaoPais(pais));

            while (!AG.fazCruzamento)
            {
                yield return(null);
            }

            Dictionary <int, float> aptidao = new Dictionary <int, float>();

            for (p = 0; p < AG.populacao.Length; p++)
            {
                aptidao.Add(p, AG.populacao[p].getPontuacao());
            }

            File.WriteAllText(Application.dataPath + "/StreamingAssets/game" + PlayerPrefs.GetInt("GameCount") + "/geracao" + AG.numGeracao + "_resultado.json", Json.SerializeToString <Dictionary <int, float> >(aptidao));

            Debug.Log("Cruzamento");
            cruzamento(pais);

            Debug.Log("Volta do cruzamento");

            while (!AG.proxGeracao)
            {
                yield return(null);
            }

            Debug.Log("ProxGeracao");
        }
    }