public void Avaliar() { foreach (Individuo individuo in this.Individuos) { Problema.CalcularFuncaoObjetivo(individuo); } }
public double Executar() { _populacao = new Populacao(MinimoVariavelIndividuo, MaximoVariavelIndividuo, NumeroVariaveis, TamanhoPopulacao); _novaPopulacao = new Populacao(MinimoVariavelIndividuo, MaximoVariavelIndividuo, NumeroVariaveis, TamanhoPopulacao); _populacao.Criar(); _populacao.Avaliar(); Random rnd = new Random(); int primIndivIndex, segIndivIndex; for (int g = 1; g <= this.NumeroGeracoes; g++) { for (int t = 0; t < this.TamanhoPopulacao; t++) { if (rnd.NextDouble() <= this.TaxaCrossover) { primIndivIndex = rnd.Next(this.TamanhoPopulacao); do { segIndivIndex = rnd.Next(this.TamanhoPopulacao); } while (primIndivIndex == segIndivIndex); Individuo primDescendente = new Individuo(this.MinimoVariavelIndividuo, this.MaximoVariavelIndividuo, this.NumeroVariaveis); Individuo segDescendente = new Individuo(this.MinimoVariavelIndividuo, this.MaximoVariavelIndividuo, this.NumeroVariaveis); Individuo primProgenitor = this._populacao.Individuos[primIndivIndex]; Individuo segProgenitor = this._populacao.Individuos[segIndivIndex]; int corte = rnd.Next(primProgenitor.Variaveis.Count); CrossoverUmPonto(primProgenitor, segProgenitor, primDescendente, corte); CrossoverUmPonto(segProgenitor, primProgenitor, segDescendente, corte); MutacaoPorVariavel(primDescendente); MutacaoPorVariavel(segDescendente); Problema.CalcularFuncaoObjetivo(primDescendente); Problema.CalcularFuncaoObjetivo(segDescendente); _novaPopulacao.Individuos.Add(primDescendente); _novaPopulacao.Individuos.Add(segDescendente); } } _populacao.Individuos.AddRange(_novaPopulacao.Individuos); _populacao.Individuos.Sort(); _populacao.Individuos.RemoveRange(this.TamanhoPopulacao, _populacao.Individuos.Count - this.TamanhoPopulacao); _novaPopulacao.Individuos.Clear(); Console.WriteLine(String.Format("Gen: {0} \t Custo = {1}", g, _populacao.Individuos[0].FuncaoObjetivo)); } this.MelhorIndividuo = _populacao.Individuos[0]; this.PiorIndividuo = _populacao.Individuos[_populacao.Individuos.Count - 1]; return(_populacao.Individuos[0].FuncaoObjetivo); }