Example #1
0
        public static Retorno AlgoritmoMenorCaminho(GrafoCB gr, Vertice origem, Vertice destino)
        {
            //Precisamos carregar todos os dados em um único servidor

            int nServidores = VariaveisGlobais.servidoresVizinhos.Count();

            for (var i = 0; i < nServidores; i++)
            {
                Retorno retorno = enviarRequisicaoParaServidor(VariaveisGlobais.servidoresVizinhos[i].Identificador);

                if (retorno.Sucesso)
                {
                    GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(retorno.Retorno_);

                    gr.Vertices.AddRange(grafo.Vertices);
                    gr.Arestas.AddRange(grafo.Arestas);
                }
            }

            origem  = gr.Vertices.Where(p => p.Nome == origem.Nome).FirstOrDefault();
            destino = gr.Vertices.Where(p => p.Nome == destino.Nome).FirstOrDefault();

            if (origem != null && destino != null)
            {
                return(algoritmoDijkstra(gr, origem, destino));
            }
            else
            {
                Retorno r = new Retorno();
                r.Sucesso  = false;
                r.Mensagem = "Não foi possível identificar os vértices informados";

                return(r);
            }
        }
Example #2
0
        private void btnBuscarVizinhos_Click(object sender, RoutedEventArgs e)
        {
            if (txtNomeVerticeVizinhos.Text == "")
            {
                MessageBox.Show("Por favor informe o vértice a ser utilizado!");
                return;
            }

            Retorno r = client.getGrafo();

            GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(r.Retorno_);

            Vertice v = grafo.Vertices.Where(p => p.Nome == Convert.ToInt32(txtNomeVerticeVizinhos.Text)).FirstOrDefault();


            if (v == null)
            {
                MessageBox.Show("O vértice informado não existe!");
                return;
            }

            Retorno r1 = client.listarVizinhoVertice(v);

            List <Vertice> vertices = JsonConvert.DeserializeObject <List <Vertice> >(r1.Retorno_);

            dgVizinhos.ItemsSource = vertices;
        }
Example #3
0
        private void txtDescricaoAresta_Delete_LostFocus(object sender, RoutedEventArgs e)
        {
            if (txtDescricaoAresta_Delete.Text == "")
            {
                MessageBox.Show("Por favor informe a descrição da aresta!");
                return;
            }

            Retorno r = client.getGrafo();

            GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(r.Retorno_);

            Aresta a = null;

            a = grafo.Arestas.Where(p => p.Descricao == txtDescricaoAresta_Delete.Text).FirstOrDefault();

            if (a == null)
            {
                txtDescricaoAresta_Delete.Text = "";
                MessageBox.Show("A aresta informado não existe!!!");
            }
            else
            {
                txtDescricaoAresta_Delete.IsEnabled = false;

                txtVerticeOrigemAresta_Delete.Text        = a.VerticeInicio.ToString();
                txtVerticeDestinoAresta_Delete.Text       = a.VerticeFim.ToString();
                txtPesoAresta_Delete.Text                 = a.Peso.ToString();
                cbBidirecionalAresta_Delete.SelectedIndex = (a.FlagBidirecional == true ? 0 : 1);
            }
        }
Example #4
0
        private void txtNomeVertice_Delete_LostFocus(object sender, RoutedEventArgs e)
        {
            if (txtNomeVertice_Delete.Text == "")
            {
                MessageBox.Show("Por favor informe o nome do vértice!");
                return;
            }

            Retorno r = client.getGrafo();

            GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(r.Retorno_);

            Vertice v = null;

            v = grafo.Vertices.Where(p => p.Nome == Convert.ToInt32(txtNomeVertice_Delete.Text)).FirstOrDefault();

            if (v == null)
            {
                txtNomeVertice_Delete.Text = "";
                MessageBox.Show("O vértice informado não existe!!!");
            }
            else
            {
                txtNomeVertice_Delete.IsEnabled = false;

                txtCorVertice_Delete.Text       = v.Cor.ToString();
                txtDescricaoVertice_Delete.Text = v.Descricao;
                txtPesoVertice_Delete.Text      = v.Peso.ToString();
            }
        }
Example #5
0
        public Retorno listarVizinhoVertice(Vertice v)
        {
            Retorno retorno = new Retorno(true);

            try
            {
                Monitor.Enter(VariaveisGlobais.locker);
                atualizarGrafo();
            }
            catch (Exception ex)
            {
                VariaveisGlobais.telaPrincipal.AtualizarLog("Não foi possível ler o grafo! " + ex.Message);
            }
            finally
            {
                Monitor.Exit(VariaveisGlobais.locker);
            }

            List <Vertice> vizinhos = new List <Vertice>();

            List <Aresta> arestas = null;

            //Todas as arestas do vertice
            arestas = this.Arestas.Where(p => p.VerticeInicio == v.Nome).ToList();

            if (arestas != null)
            {
                foreach (Aresta item in arestas)
                {
                    Vertice v1 = this.Vertices.Where(p => p.Nome == item.VerticeFim).FirstOrDefault();

                    if (v1 != null)
                    {
                        vizinhos.Add(v1);
                    }
                    else
                    {
                        int     servidor = Uteis.GetServidor(item.VerticeFim.ToString());
                        Retorno r        = Uteis.enviarRequisicaoParaServidor(servidor + 1);

                        GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(r.Retorno_);

                        v1 = grafo.Vertices.Where(p => p.Nome == item.VerticeFim).FirstOrDefault();

                        vizinhos.Add(v1);
                    }
                }
            }

            //Serializado em uma lista de vertices
            retorno.Retorno_ = JsonConvert.SerializeObject(vizinhos);

            return(retorno);
        }
Example #6
0
        private void Aresta_Update_LostFocus(object sender, RoutedEventArgs e)
        {
            if (txtVerticeOrigemUpdateAresta.Text == "" || txtVerticeDestinoUpdateAresta.Text == "")
            {
                return;
            }

            //Vamos identificar qual client será utilizado
            int nClient = Uteis.GetServidor(txtVerticeOrigemUpdateAresta.Text);

            Retorno r = new Retorno();

            switch (nClient)
            {
            case 0:
                r = VariaveisGlobais.client_servidor1.getGrafo();
                break;

            case 1:
                r = VariaveisGlobais.client_servidor2.getGrafo();
                break;

            case 2:
                r = VariaveisGlobais.client_servidor3.getGrafo();
                break;
            }

            GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(r.Retorno_);

            Aresta a = null;

            a = grafo.Arestas.Where(p => p.VerticeInicio == Convert.ToInt32(txtVerticeOrigemUpdateAresta.Text) && p.VerticeFim == Convert.ToInt32(txtVerticeDestinoUpdateAresta.Text)).FirstOrDefault();

            if (a == null)
            {
                txtDescricaoArestaUpdate.Text = "";
                MessageBox.Show("A aresta informado não existe!!!");
            }
            else
            {
                txtVerticeOrigemUpdateAresta.IsEnabled  = false;
                txtVerticeDestinoUpdateAresta.IsEnabled = false;

                txtVerticeOrigemUpdateAresta.Text        = a.VerticeInicio.ToString();
                txtVerticeDestinoUpdateAresta.Text       = a.VerticeFim.ToString();
                txtDescricaoArestaUpdate.Text            = a.Descricao;
                txtPesoArestaUpdate.Text                 = a.Peso.ToString();
                cbBidirecionalArestaUpdate.SelectedIndex = (a.FlagBidirecional == true ? 0 : 1);

                arestaCorrente = a;
            }
        }
Example #7
0
        private void txtNomeVertice_Update_LostFocus(object sender, RoutedEventArgs e)
        {
            if (txtNomeVerticeUpdate.Text == "")
            {
                MessageBox.Show("Por favor informe o nome do vértice!");
                return;
            }

            int nClient = Uteis.GetServidor(txtNomeVerticeUpdate.Text);

            Retorno r = null;

            switch (nClient)
            {
            case 0:
                r = VariaveisGlobais.client_servidor1.getGrafo();
                break;

            case 1:
                r = VariaveisGlobais.client_servidor2.getGrafo();
                break;

            case 2:
                r = VariaveisGlobais.client_servidor3.getGrafo();
                break;
            }

            GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(r.Retorno_);

            Vertice v = null;

            v = grafo.Vertices.Where(p => p.Nome == Convert.ToInt32(txtNomeVerticeUpdate.Text)).FirstOrDefault();

            if (v == null)
            {
                txtNomeVerticeUpdate.Text = "";
                MessageBox.Show("O vértice informado não existe!!!");
            }
            else
            {
                txtNomeVerticeUpdate.IsEnabled = false;

                txtCorVerticeUpdate.Text       = v.Cor.ToString();
                txtDescricaoVerticeUpdate.Text = v.Descricao;
                txtPesoVerticeUpdate.Text      = v.Peso.ToString();
            }
        }
Example #8
0
        private void btnBuscarMenorCaminho_Click(object sender, RoutedEventArgs e)
        {
            if (txtNomeVerticeCaminhoOrigem.Text == "")
            {
                MessageBox.Show("Por favor informe o vértice a ser utilizado como origem!");
                return;
            }

            if (txtNomeVerticeCaminhoDestino.Text == "")
            {
                MessageBox.Show("Por favor informe o vértice a ser utilizado como destino!");
                return;
            }

            Retorno r = client.getGrafo();

            GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(r.Retorno_);

            Vertice v1 = grafo.Vertices.Where(p => p.Nome == Convert.ToInt32(txtNomeVerticeCaminhoOrigem.Text)).FirstOrDefault();

            if (v1 == null)
            {
                MessageBox.Show("O vértice de origem informado não existe!");
                return;
            }

            Vertice v2 = grafo.Vertices.Where(p => p.Nome == Convert.ToInt32(txtNomeVerticeCaminhoDestino.Text)).FirstOrDefault();

            if (v2 == null)
            {
                MessageBox.Show("O vértice de destino informado não existe!");
                return;
            }

            Retorno r1 = client.menorCaminho(v1, v2);

            List <Vertice> caminho = JsonConvert.DeserializeObject <List <Vertice> >(r1.Retorno_);

            string caminhoString = "Menor Caminho: ";

            foreach (Vertice item in caminho)
            {
                caminhoString += item.Nome + " - ";
            }

            txtCaminho.Content = caminhoString.Substring(0, caminhoString.Length - 3);
        }
Example #9
0
        private void btnBuscarVerticesAresta_Click(object sender, RoutedEventArgs e)
        {
            if (txtDescricaoArestaListar.Text == "")
            {
                MessageBox.Show("Por favor informe a descrição da aresta a ser utilizada!");
                return;
            }

            Retorno r = client.getGrafo();

            GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(r.Retorno_);

            Aresta a = null;

            a = grafo.Arestas.Where(p => p.Descricao == txtDescricaoArestaListar.Text).FirstOrDefault();

            if (a == null)
            {
                txtDescricaoArestaListar.Text = "";
                MessageBox.Show("A aresta informada não existe!");
                return;
            }

            Retorno r1 = client.listarVerticesAresta(a);

            List <Vertice> vertices = JsonConvert.DeserializeObject <List <Vertice> >(r1.Retorno_);

            txtNomeVertice_V1.Text      = vertices[0].Nome.ToString();
            txtCorVertice_V1.Text       = vertices[0].Cor.ToString();
            txtDescricaoVertice_V1.Text = vertices[0].Descricao;
            txtPesoVertice_V1.Text      = vertices[0].Peso.ToString();

            txtNomeVertice_V2.Text      = vertices[1].Nome.ToString();
            txtCorVertice_V2.Text       = vertices[1].Cor.ToString();
            txtDescricaoVertice_V2.Text = vertices[1].Descricao;
            txtPesoVertice_V2.Text      = vertices[1].Peso.ToString();
        }
Example #10
0
        public Retorno listarVerticesAresta(Aresta a)
        {
            Retorno retorno = new Retorno(true);

            try
            {
                Monitor.Enter(VariaveisGlobais.locker);
                atualizarGrafo();
            }
            catch (Exception ex)
            {
                VariaveisGlobais.telaPrincipal.AtualizarLog("Não foi possível ler o grafo! " + ex.Message);
            }
            finally
            {
                Monitor.Exit(VariaveisGlobais.locker);
            }

            List <Vertice> vertices = new List <Vertice>();

            Vertice vOrigem  = null;
            Vertice vDestino = null;

            Aresta arestaCorrente = Arestas.Where(p => p.Descricao == a.Descricao).FirstOrDefault();

            if (arestaCorrente == null)
            {
                retorno.Sucesso  = false;
                retorno.Mensagem = "A aresta informada não existe!";

                return(retorno);
            }

            vOrigem = Vertices.Where(p => p.Nome == arestaCorrente.VerticeInicio).FirstOrDefault();

            if (vOrigem != null)
            {
                int servidor = Uteis.GetServidor(arestaCorrente.VerticeFim.ToString());

                if ((servidor + 1) == VariaveisGlobais.servidorLocal.Identificador)
                {
                    vDestino = Vertices.Where(p => p.Nome == arestaCorrente.VerticeFim).FirstOrDefault();
                }
                else
                {
                    Retorno r = Uteis.enviarRequisicaoParaServidor(servidor + 1);

                    if (r.Sucesso)
                    {
                        GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(r.Retorno_);

                        vDestino = grafo.Vertices.Where(p => p.Nome == arestaCorrente.VerticeFim).FirstOrDefault();
                    }
                }

                vertices.Add(vOrigem);
                vertices.Add(vDestino);

                //Serializado como uma lista de vertices
                retorno.Sucesso  = true;
                retorno.Retorno_ = JsonConvert.SerializeObject(vertices);
            }
            else
            {
                retorno.Sucesso = false;
            }

            return(retorno);
        }
Example #11
0
        //Métodos para Arestas
        public Retorno insertAresta(Aresta a)
        {
            Retorno retorno = new Retorno(true);

            try
            {
                Monitor.Enter(VariaveisGlobais.lockerAresta);

                atualizarGrafo();

                Vertice v1 = null;
                Vertice v2 = null;

                v1 = this.Vertices.Where(p => p.Nome == a.VerticeInicio).FirstOrDefault();
                v2 = this.Vertices.Where(p => p.Nome == a.VerticeFim).FirstOrDefault();

                //Devemos verificar se o vértice de destino existe em algum outro servidor
                if (v2 == null)
                {
                    int servidor = Uteis.GetServidor(a.VerticeFim.ToString());

                    Retorno r = Uteis.enviarRequisicaoParaServidor(servidor + 1);

                    if (r.Sucesso)
                    {
                        GrafoAtributo grafo = JsonConvert.DeserializeObject <GrafoAtributo>(r.Retorno_);

                        v2 = grafo.Vertices.Where(p => p.Nome == a.VerticeFim).FirstOrDefault();
                    }
                }

                if (v1 == null || v2 == null)
                {
                    //Implica que algum vértice informado não existe
                    VariaveisGlobais.telaPrincipal.AtualizarLog("Não foi possível cadastrar a aresta " + a.Descricao + ".Algum dos vértices informados não existe!");
                    retorno.Sucesso  = false;
                    retorno.Mensagem = "Algum dos vértices informados não existe!";
                    return(retorno);
                }

                this.Arestas.Add(a);

                if (!Uteis.escreverGrafoArquivo(this))
                {
                    VariaveisGlobais.telaPrincipal.AtualizarLog("Não foi possível gravar a aresta " + a.Descricao + " no arquivo!");
                    retorno.Sucesso  = false;
                    retorno.Mensagem = "Não foi possível gravar a aresta no arquivo!";
                    return(retorno);
                }
            }
            catch (Exception ex)
            {
                VariaveisGlobais.telaPrincipal.AtualizarLog(ex.Message);
                retorno.Sucesso  = false;
                retorno.Mensagem = "Não foi possível gravar a aresta! " + ex.Message;
                return(retorno);
            }
            finally
            {
                Monitor.Exit(VariaveisGlobais.lockerAresta);
            }

            VariaveisGlobais.telaPrincipal.AtualizarLog("Aresta " + a.Descricao + " cadastrado com sucesso!");
            retorno.Mensagem = "Aresta cadastrado com sucesso!";

            return(retorno);
        }