} /* fim Imprime tempo */

        //------------------------------------------------------------------------------


        /* Coordena as partes do programa */
        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) */

            CaixeiroOtimo caixeiro = new CaixeiroOtimo();
            Grafo         grafo; // = new Grafo();         /* matriz de adjacencia com o grafo */

            Console.Write("\n\n\t\tDigite o numero de cidades: ");
            numCidades = int.Parse(Console.ReadLine());
            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
            caixeiro.imprimeMelhorCaminho(melhorCusto, melhorRota);
            caixeiro.imprimeTempo(stopwatch);

            Console.ReadKey(true);
        } /* fim main */
        } // fim montaGrafo

        //------------------------------------------------------------------------------

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

            /* Gera os caminhos possiveis e escolhe o melhor, chamando a funcao recursiva
             * permuta */
            permuta(permutacao, grafo, melhorRota, ref melhorCusto, controle, 1);
        } /* fim GeraEscolheCaminhos */
Esempio n. 3
0
        const int MaxCusto = 50;// custo ou distância máxima entre duas cidades

        /**
         * Monta a rota obtida através do algortimo guloso
         */
        void encontraCaminho(Grafo grafo, List <Rota> caminho, ref int custo)
        {
            int i, cid1 = 0, cid2 = 0, menorCusto, tamanho = caminho.Capacity;

            int[]      pos         = new int[grafo.M.Length];
            List <int> adicionados = new List <int>(grafo.M.Length); //Lista contendo os vértices que já foram adicionados à rota

            adicionados.Add(0);                                      //adiciona o primeiro vértice (0)
            Rota rota = new Rota();

            custo = 0;

            for (i = 0; i < tamanho; i++)
            {
                menorCusto   = MaxCusto + 1;
                rota.cidade1 = cid1;//Adiciona a cidade 1 à rota

                //No final retorna ao vértice inicial (0)
                if (i == caminho.Capacity - 1)
                {
                    menorCusto = grafo.M[cid1, 0];
                    cid2       = 0;
                }
                else
                {
                    for (int j = 0; j < tamanho; j++)
                    {
                        if (j != cid1 && !adicionados.Contains(j))
                        {
                            //Encontra o arco adjacente com menor peso, e o vértice adjacente a ele
                            if (grafo.M[cid1, j] != 0 && grafo.M[cid1, j] < menorCusto)
                            {
                                menorCusto = grafo.M[cid1, j];
                                cid2       = j;
                            }
                        }
                    }
                }
                rota.cidade2 = cid2;       //adiciona a segunda cidade à rota()
                rota.custo   = menorCusto; //adiciona o custo da rota
                adicionados.Add(cid2);
                custo += menorCusto;       //adiciona o custo da rota a soma do custo total
                caminho.Add(rota);         //Adiciona a rota oa caminho
                rota = new Rota();
                cid1 = cid2;
            }
        }