Problema com recustividade em JAVA

1 resposta
P

Estou fazendo um programa em java para uma matéria de grafos da faculdade. Estou implementando o algoritmo de kruskal, que transforma um grafo qualquer em uma árvore (grafo acíclico) com o menor custo posspivel. Esse algorítmo deve organizar os arcos (ou arestas valoradas, representadas por beans) por custo, e então ir criando a árvore caso o arco não forme um ciclo. O algorítmo foi implementado, e está funcionando semi-perfeitamente. Segue minha função formaCiclo()
Ps:. um grafo é formado por beans Vertice e beans Aresta, sendo esta ultima formada por dois beans Vertices e um custo (valor)

private boolean formaCiclo(Aresta aresta) {
		boolean retorno = false;

		Vertice x = aresta.getX();
		Vertice y = aresta.getY();

		ArrayList adjX = this.arvore.verticesAdjacentes2(x);

		setPermitir(true);
		this.arvore.desvisitarVertices();
		x.setVisitado(true);

		return procurarConvergencia(adjX, y);
	}

	private boolean procurarConvergencia(ArrayList adjX, Vertice y) {
		boolean retorno = false;

		if (!adjX.isEmpty()) {
			for (int i = 0; i < adjX.size(); i++) {
				Vertice vertice1 = (Vertice) adjX.get(i);
				synchronized (this) {
					if (!getPermitir())
						break;
				}
				
					if (!vertice1.isVisitado()) {
						vertice1.setVisitado(true);
						if (vertice1.getValor() == y.getValor()) {
							retorno = true;
							synchronized(this){
								setPermitir(!retorno);
								break;
							}
						
					} else {
						retorno = procurarConvergencia(this.arvore
								.verticesAdjacentes2(vertice1), y);
					}

				}

			}
		}

		return retorno;
	}

	private synchronized boolean getPermitir() {
		return this.permitir;
	}

	private synchronized void setPermitir(boolean bol) {
		this.permitir = bol;
	}

Eh, eu sei, tá uma gambiarra medonha, usando até mesmo for para percorrer uma Collection. Mas enfim…
O algorítmo funciona perfeitamente quando defino um grafo em uma classe e nessa mesma classe chamo o algoritmo. Mas quando uso uma interface gráfica
para criar os grafos, pegando os vertices e as arestas, o algoritmo não funciona. Ele não dá erro, simplesmente não funciona corretamente, o MESMO grafo criado quando definido na classe é transformado corretamente mas quando uso uma interface ele não funciona corretamente.
O mesmo acontece em dois outros algoritmos que utilizo recursividade, o algoritmo da busca por amplitude. Em uma classe onde defino o grafo ele funciona perfeitamente, mas O MESMO GRAFO definido pelo usuario com uma interface gráfica ele não funciona corretamente.
Alguem tem alguma ideia de como posso resolver esse problema?
Desde já meu muito obrigado!

1 Resposta

S

pedro você já debugou seu código para :
1º ter certeza que o que vem da interface está correto??
2º saber em que parte do código está o problema??

a sincronização está correta quando você usa a interface?

Criado 18 de agosto de 2008
Ultima resposta 20 de ago. de 2008
Respostas 1
Participantes 2