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(); }
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"); } }