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); }
/// <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(); }