ALGORITMO DO MENOR CAMINHO

WEBMASTER 12/11/2009 09:07:50
#327493
Caros,

Devido a problemas pessoais e profissionais, confesso que nao estou conseguindo manter o foco no racicionio deste processo afim de resolver este problema como deveria.

Basicamente devo desenvolver um processo de caminhamento dentro dos vertices de um grafo ligados por suas arestas, cada qual com seu devido peso. O problema eh ue realmente nao consigo desenvolver a selecao de caminhos como eh solicitado.

O problema na funcionalidade abaixo (dentro de grafo.cs)

public String EncontrarMenorCaminho(Vertice o, Vertice d)
{
String operacao = [Ô]Registro de operações realizadas:

[Ô];
Caminho caminho = new Caminho();
Caminho caminhomenor = null;
Aresta arestamenor = null;

List<Caminho> caminhos = new List<Caminho>();
List<Vertice> lista_aberta = new List<Vertice>();
List<Vertice> lista_fechada = new List<Vertice>();

operacao += [Ô]Tentando ir de [Ô] + o.Info.ToString() + [Ô] para [Ô] + d.Info.ToString() + [Ô]
[Ô];

lista_aberta.Add(o);
while(lista_aberta.Count > 0)
{
Vertice v = lista_aberta[0];
arestamenor = null;
operacao += [Ô]Visitando [Ô] + v.Info.ToString() + [Ô]
[Ô];
foreach (Vertice vz in EncontrarVizinhos(v))
{
if (!lista_fechada.Contains(vz))
{
Aresta az = GetAresta(v, vz);
if (az != null)
{
//if (arestamenor == null || az.Peso < arestamenor.Peso) arestamenor = az;
if (arestamenor == null) arestamenor = az;
if (az.Peso < arestamenor.Peso)
{
arestamenor = az;
lista_aberta.Add(vz);
}

if (vz.Equals(d))
{
operacao += [Ô] Achei [Ô] + d.Info.ToString() + [Ô], reiniciando caminho
[Ô];
caminhos.Add(caminho);
caminho = new Caminho();
/*
foreach (Aresta a in caminhos[caminhos.Count-1].Arestas)
{
if (!caminho.Arestas.Contains(a)) caminho.AddAresta(a);
}
*/
}
}
operacao += [Ô] Visitando [Ô] + v.Info.ToString() + [Ô] -> [Ô] + vz.Info.ToString() + [Ô] com peso [Ô] + az.Peso.ToString() + [Ô]
[Ô];
}
}
if (arestamenor != null)
{
caminho.AddAresta(arestamenor);
operacao += [Ô] Menor caminho é [Ô] + arestamenor.ToString() + [Ô]
[Ô];
}
lista_aberta.Remove(v);
lista_fechada.Add(v);
}

if (caminhos.Count > 0)
{
foreach (Caminho c in caminhos)
{
if (caminhomenor == null || c.PesoFinal < caminhomenor.PesoFinal) caminhomenor = c;
foreach (Aresta a in c.Arestas)
{
a.Origem.Selecionado = false;
a.Destino.Selecionado = false;
}
}

if (caminhomenor != null)
{
foreach (Aresta a in caminhomenor.Arestas)
{
a.Origem.Selecionado = true;
a.Destino.Selecionado = true;
}
}
}

operacao += [Ô]
[Ô];
operacao += caminhos.Count.ToString() + [Ô] caminhos encontrados:
[Ô];
foreach(Caminho c in caminhos)
{
operacao += [Ô]Caminho [Ô] + caminhos.IndexOf(c).ToString() + [Ô] ([Ô] + c.ToString() + [Ô]) tem peso : [Ô] + c.PesoFinal.ToString() + [Ô]
[Ô];
}

operacao += [Ô]
[Ô];
operacao += [Ô]O menor caminho escolhido foi:
[Ô];
if (caminhomenor == null)
{
operacao += [Ô]Não houve caminho encontrado !!!
[Ô];
}
else
{
operacao += caminhomenor.ToString() + [Ô] com peso [Ô] + caminhomenor.PesoFinal.ToString() + [Ô]
[Ô];
}

DesenharMapa();
return operacao;
}


Qualquer ajuda para resolver o problema da seleção será bem vindo, posteriormente vou postar o código fonte ajustado para estudos.
GLAUCIO 12/11/2009 12:00:42
#327522
Em anexo vai um código fonte de uma implementação de um path finder (A+ PathFinder)

Talvez refresque a tua memória

No aguardo do fonte para uma melhor ajuda.

Inté+
JWCELYO 12/11/2009 12:24:16
#327523
Oi tudo bem
o caminho é chamado de um arquivo xml, e estruturado pelo um arraylist é isso que esta acima?
WEBMASTER 12/11/2009 15:30:34
#327540
Na verdade eh txt, mas iso nao vem ao caso.
A questao eh a navegacao dos nos dentro de duas estruturas de listas...
WEBMASTER 12/11/2009 17:44:48
#327553
Glaucio

Confesso que gostei do teu exemplo, mas ele nao eh orientado a objetos no nivel que preciso alem disso esta bem mais complicado do que o meu projeto. Leia meu codigo e veja...
LEVII 13/11/2009 14:40:58
#327680
Caro web master.

O exemplo pode não estar em OOP como vc quer, mas não e interessante uma analise mais profunda a fim de verificar como ele resolveu alguns problemas?

ai voce adapta pra OOP...
WEBMASTER 14/11/2009 21:26:15
#327767
Ja li varioas livros, tudo bem me acho meio lerdo para certas coisas mesmo...
Os livros que vi encontram menores caminhos no grafo, nao o que va do ponto a para b

aqui esta a versao com matriz...nao eh o que eu queria nao, mas mesmo assim nao resolveu meu problema ( )

private void Teste2(Vertice o, Vertice d)
{
int vertice_inicial = 0;
long vertice_minimo = 0;
int vertice_proximo = 0;
int vertice_de = Vertices.IndexOf(o);
int vertice_para = Vertices.IndexOf(d);
int tamanho = Vertices.Count;
int[] matriz_vertices = new int[tamanho];
long[,] matriz_global = new long[tamanho, tamanho];
long total = 0;
List<Aresta> selecionados = new List<Aresta>();

for (int i = 0; i < tamanho; i++)
{
for (int j = 0; j < tamanho; j++)
{
matriz_global[i, j] = 0;
}
}

for (int i = 0; i < Arestas.Count; i++)
{
vertice_de = Vertices.IndexOf(Arestas[i].Origem);
vertice_para = Vertices.IndexOf(Arestas[i].Destino);
matriz_global[vertice_de, vertice_para] = EncontrarAresta(Arestas[i].Origem, Arestas[i].Destino).Peso;
matriz_global[vertice_para, vertice_de] = EncontrarAresta(Arestas[i].Origem, Arestas[i].Destino).Peso;
}

for (int i = 0; i < tamanho; i++)
{
matriz_vertices[i] = vertice_inicial;
ZerarMatriz(matriz_global, matriz_vertices[i]);
vertice_minimo = EncontrarArestaMinima(matriz_global, matriz_vertices, out vertice_inicial, ref vertice_proximo);
if (vertice_minimo != 0)
{
total += vertice_minimo;
Aresta tmp = new Aresta();
tmp = EncontrarAresta(Vertices[vertice_proximo], Vertices[vertice_inicial]);
selecionados.Add(tmp);
}
}

foreach (Aresta a in selecionados)
{
Debug.Print(a.ToString());
a.Selecionado = true;
}
DesenharMapa();
}



Isso ai ta encontrando os [Ô]n[Ô] menores caminhos, nao tem nada a ver com o ir de / para , mas eh o que os livros de algoritmo que encontrei me mostram (e olha, nao foi poucos nao).
Tópico encerrado , respostas não são mais permitidas