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