static void Main(string[] args)
        {
            int[]  permutacao;   /* vetor com uma possivel rota de viagem */
            Rota[] melhorRota;   /* contera' a melhor rota da viagem */
            int    numCidades,   /* numero de vertices (cidades) do grafo */
                   melhorCusto;  /* custo da viagem pelo grafo (pelas cidades) */

            CaixeiroViajante caixeiro = new CaixeiroViajante();
            Grafo            grafo;

            numCidades = 5;
            caixeiro.montaGrafo(out grafo, numCidades);

            permutacao = new int[numCidades];
            melhorRota = new Rota[numCidades];

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start(); //Inicia a contagem do tempo
            caixeiro.geraEscolheCaminhos(ref permutacao, grafo, melhorRota, out melhorCusto);
            stopwatch.Stop();  //Encerra a contagem do tempo
            Util.ImprimeMelhorCaminho(melhorCusto, melhorRota);
            Util.ImprimeTempo(stopwatch);

            Console.ReadKey(true);
        }
        /// <summary>
        /// Gera os possiveis caminhos entre a cidade zero e todas as outras envolvidas
        /// na rota da viagem do caixeiro e escolhe a melhor rota entre todas.
        /// </summary>
        /// <param name="permutacao"></param>
        /// <param name="grafo"></param>
        /// <param name="melhorRota"></param>
        /// <param name="melhorCusto"></param>
        public void geraEscolheCaminhos(ref int[] permutacao, Grafo grafo, Rota[] melhorRota, out int melhorCusto)
        {
            int controle = -1;

            melhorCusto = int.MaxValue;

            for (int i = 0; i < melhorRota.Length; i++)
            {
                melhorRota[i] = new Rota();
            }

            permuta(permutacao, grafo, melhorRota, ref melhorCusto, controle, 1);
        }
Beispiel #3
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();
        }
Beispiel #4
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();
        }