Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
        /// <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();
        }