Beispiel #1
0
 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);
        }