static void ordenar(List <Cromossomo> populacao) { //implementação do método do pente - combsort int distancia = populacao.Count; bool houveTroca; do { distancia = (int)(distancia / 1.3); if (distancia < 1) { distancia = 1; } houveTroca = false; for (int i = 0; i + distancia < populacao.Count; i++) { if ((int)populacao[i].aptidao < (int)populacao[i + distancia].aptidao) { houveTroca = true; Cromossomo temp = populacao[i]; populacao[i] = populacao[i + distancia]; populacao[i + distancia] = temp; } } } while (distancia != 1 || houveTroca); }
// // ─── FUNÇÕES BÁSICAS DO ALGORITMO GENÉTICO ────────────────────────────────────── // /** * Cria e configura os indivíduos da primeira geração. */ void inicializarPopulacao() { qtdIndividuosMortos = 0; populacao = new List <Individuo>(tamanhoPopulacao); individuosSelecionados = new List <Individuo>(); for (int i = 0; i < tamanhoPopulacao; i++, qtdIndividuosGerados++) { Individuo carro = InstanciarIndividuo(); carro.nome = "Individuo_" + qtdIndividuosGerados; // Inicializar cada cromossomo. Cromossomo[] cromossomos = new Cromossomo[qtdCromossomos]; for (int j = 0; j < qtdCromossomos; j++) { cromossomos[j] = new Cromossomo(qtdGenes, limitesInfSupCromo[j]); } carro.cromossomos = cromossomos; populacao.Add(carro); } }
static void mutar(List <Cromossomo> populacao, String estadoFinal) { Random gerador = new Random(); int qtdMutantes = gerador.Next((int)populacao.Count / 5); //20% NO MÁXIMO DE MUTANTES Cromossomo mutante; int posicaoMutante; for (; qtdMutantes > 0; qtdMutantes--) { posicaoMutante = gerador.Next((int)populacao.Count / 2, populacao.Count); mutante = populacao[posicaoMutante]; Console.WriteLine("vai mutar " + mutante.valor + " " + mutante.aptidao); //mutando String valorMutado = mutante.valor; char caracterMutante = mutante.valor[gerador.Next(mutante.valor.Length)]; char caracterSorteado = Util.letras[gerador.Next(Util.tamanho)]; valorMutado = valorMutado.Replace(caracterMutante, caracterSorteado); mutante = new Cromossomo(valorMutado, estadoFinal); Console.WriteLine("por esse " + mutante.valor + " " + mutante.aptidao); populacao[posicaoMutante] = mutante; } }
public bool Equals(Cromossomo o) { if (o == null) { return(false); } return(this.valor.Equals(o.valor)); }
void ProximaGeracao(Cromossomo primeiro, Cromossomo segundo) { Cromossomo penultimo = new Cromossomo(); Cromossomo ultimo = new Cromossomo(); if (SaveControl.RetornarEvolutionState()) { int menor = 10; for (int i = 0; i < cromossomosUsados.Count; i++) { if (cromossomosUsados[i].FuncaoAvaliacao() <= menor) { menor = cromossomosUsados[i].FuncaoAvaliacao(); if (i == 0) { penultimo = cromossomosUsados[i]; ultimo = cromossomosUsados[i]; } else { ultimo = penultimo; penultimo = cromossomosUsados[i]; } } } } else { int maior = 0; for (int i = 0; i < cromossomosUsados.Count; i++) { if (cromossomosUsados[i].FuncaoAvaliacao() >= maior) { maior = cromossomosUsados[i].FuncaoAvaliacao(); if (i == 0) { penultimo = cromossomosUsados[i]; ultimo = cromossomosUsados[i]; } else { ultimo = penultimo; penultimo = cromossomosUsados[i]; } } } } cromossomosUsados[penultimo.id].cromossomo = primeiro.cromossomo; cromossomosUsados[ultimo.id].cromossomo = segundo.cromossomo; arquivoGame.cromossomos = cromossomosUsados; SaveControl.AtualizarArquivoJogo(arquivoGame); }
void Selecao() { Cromossomo primeiro = new Cromossomo(); Cromossomo segundo = new Cromossomo(); if (SaveControl.RetornarEvolutionState()) { int maior = 0; for (int i = 0; i < cromossomosUsados.Count; i++) { if (cromossomosUsados[i].FuncaoAvaliacao() >= maior) { maior = cromossomosUsados[i].FuncaoAvaliacao(); if (i == 0) { primeiro = cromossomosUsados[i]; segundo = cromossomosUsados[i]; } else { segundo = primeiro; primeiro = cromossomosUsados[i]; } } } } else { int menor = 10; for (int i = 0; i < cromossomosUsados.Count; i++) { if (cromossomosUsados[i].FuncaoAvaliacao() <= menor) { menor = cromossomosUsados[i].FuncaoAvaliacao(); if (i == 0) { primeiro = cromossomosUsados[i]; segundo = cromossomosUsados[i]; } else { segundo = primeiro; primeiro = cromossomosUsados[i]; } } } } Crossover(primeiro, segundo); }
public static bool contem(List <Cromossomo> populacao, Cromossomo selecionado) { for (int i = 0; i < populacao.Count; i++) { if (populacao[i].valor.Equals(selecionado.valor)) { return(true); } } return(false); }
/** * Cruzamento de ponto único. */ void CrossOver() { // Selecionando só 2 indivíduos por enquanto... Cromossomo[] cromossomos1 = individuosSelecionados[0].cromossomos; Cromossomo[] cromossomos2 = individuosSelecionados[1].cromossomos; foreach (Individuo individuo in populacao) { Cromossomo[] cromossomosCrossover = new Cromossomo[qtdCromossomos]; // Para cada cromossomo for (int i = 0; i < qtdCromossomos; i++) { BitArray[] genesCrossover = new BitArray[qtdGenes]; // Pegar os cromossomos dos 2 indivíduos selecionados. Cromossomo cromossomo1 = cromossomos1[i]; Cromossomo cromossomo2 = cromossomos2[i]; // Para cada gene for (int j = 0; j < qtdGenes; j++) { int ponto = UnityEngine.Random.Range(0, Cromossomo.qtdBits); BitArray gene1 = cromossomo1.genes[j]; BitArray gene2 = cromossomo2.genes[j]; BitArray geneCrossover = new BitArray(6); // Antes e depois do ponto for (int k = 0; k < ponto; k++) { geneCrossover[k] = gene1[k]; } for (int k = ponto; k < gene1.Count; k++) { geneCrossover[k] = gene2[k]; } genesCrossover[j] = geneCrossover; } cromossomosCrossover[i] = new Cromossomo(genesCrossover); } qtdIndividuosGerados++; individuo.Setar("Individuo_" + qtdIndividuosGerados, cromossomosCrossover); } }
public void TestaGetFit() { //Arrange var obj = new Cromossomo(); obj.Genes = "10000000001000000000"; //0 e 0 double expected = 0; //Act double actual = obj.Fitness; //Assert Assert.AreEqual(actual, expected); }
public void TestaDecodificaGenes() { //Arrange var ob = new Cromossomo(); ob.Genes = "01000000001000000111"; //-256 e 7 double[] expected = { -2.56, 0.07 }; //Act double[] actual = ob.decodificaGenes(); //Assert Assert.IsTrue(actual[0] == expected[0] && actual[1] == expected[1]); }
public void TestaFormataNumBin() { //Arrange var obj = new Cromossomo(); string sin = "0"; string n = "11";//-3 var expected = "0000000011"; //Act var actual = obj.formataNumBin(sin, n); //Assert Assert.AreEqual(actual, expected); }
void Crossover(Cromossomo primeiro, Cromossomo segundo) { Cromossomo temp; temp = primeiro; int pontoCorte = UnityEngine.Random.Range(1, 9); for (int i = 0; i < pontoCorte; i++) { primeiro.cromossomo[i] = segundo.cromossomo[i]; segundo.cromossomo[i] = temp.cromossomo[i]; } Mutacao(primeiro, segundo); }
void GerarPopulacaoInicial() { for (int i = 0; i < 100; i++) { Cromossomo c = new Cromossomo(); c.Inicializar(); c.id = i; cromossomosUsados.Add(c); } arquivoGame.cromossomos = cromossomosUsados; arquivoGame.evolutionState = true; for (int i = 0; i < arquivoGame.lastScores.Length; i++) { arquivoGame.lastScores[i] = -1; } SaveControl.AtualizarArquivoJogo(arquivoGame); }
void Mutacao(Cromossomo primeiro, Cromossomo segundo) { int chance = UnityEngine.Random.Range(0, 100); if (chance <= 10 && chance >= 0) { int cromossomo = UnityEngine.Random.Range(0, 1); int numCromossomo = UnityEngine.Random.Range(0, 7); int valGene = UnityEngine.Random.Range(0, 2); if (cromossomo == 0) { primeiro.cromossomo[numCromossomo] = valGene; } else { segundo.cromossomo[numCromossomo] = valGene; } } ProximaGeracao(primeiro, segundo); }