/// <summary> /// Este construtor gera uma nova população respeitando os parâmetros informados /// Cada item individuo da população é um item do tipo Tabela /// Cada individo tem uma rota aleatória e um total de distância /// A variável TabelaResultado é uma lista dinâmica do tipo tabela /// Ao concluir a população A TabelaResultado é ordenada /// </summary> public Populacao(int origem, int total, int fator, double coefMutacao) { this.GenePrimario = origem; this.Total = total; this.FatorCruzamento = fator; this.CoefMutante = coefMutacao; for (int i = 0; i < this.Total; i++) { int[] rota = Rota.CriaRota(this.GenePrimario, TotalCromossomo, rand.Next(0, this.total)); this.TabelaResultado.Add(new Tabela(Rota.Fitness(this.GenePrimario, rota.ToArray()), rota.ToArray())); } TabelaSort(); }
/// <summary> /// Este método percorre toda a população mexclando cada cromossomo /// </summary> public void Crossover() { int i = 0; while (i < this.Total - 1) { int[] novaRota1 = new int[TotalCromossomo]; int[] novaRota2 = new int[TotalCromossomo]; novaRota1 = arrayCopy(this.TabelaResultado[i].Rota.ToArray(), this.TabelaResultado[i + 1].Rota.ToArray(), 0, this.FatorCruzamento, this.FatorCruzamento + 1, TotalCromossomo).ToArray(); novaRota2 = arrayCopy(this.TabelaResultado[i + 1].Rota.ToArray(), this.TabelaResultado[i].Rota.ToArray(), 0, this.FatorCruzamento, this.FatorCruzamento + 1, TotalCromossomo).ToArray(); int mutcao1 = rand.Next(0, total); int mutcao2 = rand.Next(0, total); novaRota1 = resolveRepetidos(novaRota1.ToArray()); novaRota2 = resolveRepetidos(novaRota2.ToArray()); if (mutcao1 <= (int)(total * this.CoefMutante)) { novaRota1 = Mutacao(novaRota1.ToArray()).ToArray(); } if (mutcao2 <= (int)(total * this.CoefMutante)) { novaRota2 = Mutacao(novaRota2.ToArray()).ToArray(); } this.TabelaResultado.Add( new Tabela(Rota.Fitness(this.GenePrimario, novaRota1.ToArray()), novaRota1.ToArray()) ); this.TabelaResultado.Add( new Tabela(Rota.Fitness(this.GenePrimario, novaRota2.ToArray()), novaRota2.ToArray()) ); i++; i++; } TabelaSort(); }