示例#1
0
 private int BuscaMenorDistancia(VerticeModel destino)
 {
     if (distancia.TryGetValue(destino, out int d))
     {
         return(d);
     }
     else
     {
         return(int.MaxValue);
     }
 }
示例#2
0
 private int BuscaDistancia(VerticeModel nodo, VerticeModel nodoDestino)
 {
     foreach (ArestaModel aresta in arestas)
     {
         if (aresta.Origem.Equals(nodo) &&
             aresta.Destino.Equals(nodoDestino))
         {
             return(aresta.Peso);
         }
     }
     throw new System.Exception();
 }
        //adiciona um trajeto para ser inserido no Grafo. (ex.: A distância da cidade A (origemAresta) até a cidade B (destinoAresta) é 5 (duração))
        private void AdicionaAresta(String id, int origemAresta, int destinoAresta, int duracao)
        {
            //verifica se há de fato um vertice representando a origem e outro representando o destino da aresta
            VerticeModel origem  = new VerticeModel("Nodo_" + origemAresta, "Nodo_" + origemAresta);
            VerticeModel destino = new VerticeModel("Nodo_" + destinoAresta, "Nodo_" + destinoAresta);

            if (nodos.Contains(origem) &&
                nodos.Contains(destino))
            {
                ArestaModel faixa = new ArestaModel(id, nodos[nodos.IndexOf(origem)], nodos[nodos.IndexOf(destino)], duracao);
                arestas.Add(faixa);
            }
        }
示例#4
0
        private List <VerticeModel> BuscaNodosVizinhos(VerticeModel nodo)
        {
            List <VerticeModel> vizinhos = new List <VerticeModel>();

            foreach (ArestaModel aresta in arestas)
            {
                if (aresta.Origem.Equals(nodo) &&
                    !Resolvido(aresta.Destino))
                {
                    vizinhos.Add(aresta.Destino);
                }
            }
            return(vizinhos);
        }
示例#5
0
        public static void main()
        {
            nodos   = new List <VerticeModel>();
            arestas = new List <ArestaModel>();
            for (int i = 0; i < 8; i++)
            {
                VerticeModel location = new VerticeModel("Node_" + i, "Node_" + i);
                nodos.Add(location);
            }

            addLane("Edge_0", 0, 1, 5);
            addLane("Edge_1", 0, 3, 5);
            addLane("Edge_2", 0, 4, 7);
            addLane("Edge_3", 1, 2, 4);
            addLane("Edge_4", 2, 3, 8);
            addLane("Edge_5", 2, 4, 2);
            addLane("Edge_6", 3, 2, 8);
            addLane("Edge_7", 3, 4, 6);
            addLane("Edge_8", 4, 1, 3);

            //        A distância da cidade A até a cidade B é 5.
            //        A distância da cidade A até a cidade D é 5.
            //        A distância da cidade A até a cidade E é 7.
            //        A distância da cidade B até a cidade C é 4.
            //        A distância da cidade C até a cidade D é 8.
            //        A distância da cidade C até a cidade E é 2.
            //        A distância da cidade D até a cidade C é 8.
            //        A distância da cidade D até a cidade E é 6.
            //        A distância da cidade E até a cidade B é 3.

            // Lets check from location Loc_1 to Loc_10
            GrafoModel graph    = new GrafoModel(nodos, arestas);
            Dijkstra   dijkstra = new Dijkstra(graph);

            dijkstra.Executa(nodos[2]);
            List <VerticeModel> path = dijkstra.BuscaCaminho(nodos[2]);

            if (path == null || path.Count <= 0)
            {
                throw new System.Exception();
            }

            foreach (VerticeModel vertex in path)
            {
                Console.WriteLine(vertex);
            }
        }
示例#6
0
        private void EncontraDistanciasMinimas(VerticeModel nodo)
        {
            //busca os nodos vizinhos (os quais o nodo principal tem acesso)
            List <VerticeModel> nodosAdjacentes = BuscaNodosVizinhos(nodo);

            foreach (VerticeModel nodoDestino in nodosAdjacentes)
            {
                if (BuscaMenorDistancia(nodoDestino) > BuscaMenorDistancia(nodo)
                    + BuscaDistancia(nodo, nodoDestino))
                {
                    distancia.Add(nodoDestino, BuscaMenorDistancia(nodo)
                                  + BuscaDistancia(nodo, nodoDestino));
                    antecessores.Add(nodoDestino, nodo);
                    nodosNaoResolvidos.Add(nodoDestino);
                }
            }
        }
示例#7
0
        public void Executa(VerticeModel origem)
        {
            nodosResolvidos    = new HashSet <VerticeModel>();
            nodosNaoResolvidos = new HashSet <VerticeModel>();
            distancia          = new Dictionary <VerticeModel, int>();
            antecessores       = new Dictionary <VerticeModel, VerticeModel>();

            //cria uma distancia inicial 0, ja que origem até origem tem distancia = 0
            distancia.Add(origem, 0);

            //lista de nodos que ainda não foram testados
            nodosNaoResolvidos.Add(origem);
            while (nodosNaoResolvidos.Count > 0)
            {
                VerticeModel node = BuscaMenor(nodosNaoResolvidos);
                nodosResolvidos.Add(node);
                nodosNaoResolvidos.Remove(node);
                EncontraDistanciasMinimas(node);
            }
        }
示例#8
0
        /*
         * Esse método retorna o caminho da origem até o destino ou Null caso o caminho seja impossível
         */
        public List <VerticeModel> BuscaCaminho(VerticeModel nodoDestino)
        {
            LinkedList <VerticeModel> caminho = new LinkedList <VerticeModel>();
            VerticeModel aux = nodoDestino;

            // checa se o caminho existe, verificando a exitencia do destino nos nodos encontrados
            if (!antecessores.TryGetValue(aux, out VerticeModel verticeRetornado))
            {
                return(null);
            }
            caminho.AddLast(aux);
            while (antecessores.TryGetValue(aux, out verticeRetornado))
            {
                aux = antecessores[aux];
                caminho.AddLast(aux);
            }

            // coloca a lista na ordem correta
            return(caminho.Reverse().ToList());
        }
示例#9
0
        private VerticeModel BuscaMenor(HashSet <VerticeModel> vertices)
        {
            VerticeModel minimo = null;

            foreach (VerticeModel vertice in vertices)
            {
                if (minimo == null)
                {
                    minimo = vertice;
                }
                else
                {
                    if (BuscaMenorDistancia(vertice) < BuscaMenorDistancia(minimo))
                    {
                        minimo = vertice;
                    }
                }
            }
            return(minimo);
        }
        public GrafoModel MontaGrafo(String caminho)
        {
            nodos   = new List <VerticeModel>();
            arestas = new List <ArestaModel>();

            //cria a lista de nodos do grafo
            string[] caminhoArray = null;
            if (caminho != null)
            {
                caminhoArray = caminho.Split('_');
                for (int i = 0; i < caminhoArray.Length; i++)
                {
                    VerticeModel location = new VerticeModel("Nodo_" + caminhoArray[i], "Nodo_" + caminhoArray[i]);
                    nodos.Add(location);
                }
            }
            else
            {
                for (int i = 0; i < 8; i++)
                {
                    VerticeModel location = new VerticeModel("Nodo_" + i, "Nodo_" + i);
                    nodos.Add(location);
                }
            }

            //adiciona as ligações possíveis (ex.: A --- 5 ---> B)
            AdicionaAresta("Trajeto_0", 0, 1, 5);
            AdicionaAresta("Trajeto_1", 0, 3, 5);
            AdicionaAresta("Trajeto_2", 0, 4, 7);
            AdicionaAresta("Trajeto_3", 1, 2, 4);
            AdicionaAresta("Trajeto_4", 2, 3, 8);
            AdicionaAresta("Trajeto_5", 2, 4, 2);
            AdicionaAresta("Trajeto_6", 3, 2, 8);
            AdicionaAresta("Trajeto_7", 3, 4, 6);
            AdicionaAresta("Trajeto_8", 4, 1, 3);

            // cria o Grafo com os Nodos e Arestas criados
            return(new GrafoModel(nodos, arestas));
        }
示例#11
0
 private bool Resolvido(VerticeModel vertice)
 {
     return(nodosResolvidos.Contains(vertice));
 }