Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505

    Elenco di oggetti collection in una variabile

    Premetto che Java non lo tocco da una vita.
    Mi trovo alle prese con un grafo, dal quale dati due vertici devo restituire tutti i percorsi esistenti tra questi due.
    Nessun problema nel trovare i percorsi, il problema lo sto avendo con la restituzione dei percorsi.

    I vertici sono oggetti Vertex<String>
    Attualmente la funzione mi stampa semplicemente i percorsi trovati in questo modo
    codice:
    public void bfs(Graph<String,Integer> g, LinkedList<Vertex<String>> visited, Vertex<String> destination) {
    
    	Collection<Vertex<String>> nodes = g.outVertices(visited.getLast()); //nodi raggiungibili da quello dato
    	// esamina i vertici adiacenti
    	for (Vertex<String> node : nodes) {
    		if (visited.contains(node)) {
    			continue;
    		}
    		if (node.equals(destination)) {
    			visited.add(node);
    			//stampa i vertici contenuti in visited, sono i vertici appartenenti al percorso
    			printPath(visited);
    			visited.removeLast();
    			break;
    		}
    	}
    	//ricorsione per la BFS
    	for (Vertex<String> node : nodes) {
    		if (visited.contains(node) || node.equals(destination)) {
    			continue;
    		}
    		visited.addLast(node);
    		bfs(g, visited, destination);
    		visited.removeLast();
    	}
    }
    Al posto dell'istruzione printPath(visited) dovrei inserire la variabile visited in una struttura dati da ritornare in seguito.
    Un'idea potrebbe essere l'uso di un array, ma non so a priori quanti percorsi verranno trovati.
    Cosa potrei usare per raccogliere tutti i percorsi in una variabile da restituire al metodo chiamante?

  2. #2
    Semplicemente un oggetto di tipo List (ArrayList o LinkedList).

  3. #3
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    ok, ho modificato il codice in questo modo, ma non fa quello che vorrei.
    codice:
    private List<LinkedList<Vertex<String>>> bfs(Graph<String,Integer> g, 
                                                 LinkedList<Vertex<String>> visited, 
                                                 List<LinkedList<Vertex<String>>> paths, 
                                                 Vertex<String> destination) {
    
        Collection<Vertex<String>> nodes = g.outVertices(visited.getLast());
        // examine adjacent nodes
        for (Vertex<String> node : nodes) {
            if (visited.contains(node)) {
                continue;
            }
            if (node.equals(destination)) {
                visited.add(node);
                //inserisce i vertici contenuti in visited nella lista dei percorsi
                paths.add(visited);
                System.out.println("Visited size: " + visited.size()); //stampa correttamente il numero di nodi nel percorso
                visited.removeLast();
                break;
            }
        }
        //ricorsione per la BFS
        for (Vertex<String> node : nodes) {
            if (visited.contains(node) || node.equals(destination)) {
                continue;
            }
            visited.addLast(node);
            bfs(g, visited, paths, destination);
            visited.removeLast();
        }
    
        return paths;
    }
    Quando vado a ciclare sul risltato lo faccio così
    codice:
    List<LinkedList<Vertex<String>>> paths = new GraphUtil().bfs(gra, visited, percorsi, e);
    
    Iterator<LinkedList<Vertex<String>>> lli = paths.iterator();
    if(paths.size() > 0) {
        while(lli.hasNext()) {
            LinkedList<Vertex<String>> path = lli.next();
            Iterator<Vertex<String>> li = path.iterator();
            Vertex<String> v1 = null;
            Vertex<String> v2 = null;
            int pesoTot = 0;
            System.out.println("Path size: " + path.size()); //è sempre 1, ma non dovrebbe essere così
            if(path.size() > 1) {
                v1 = li.next();
    
                while(li.hasNext()) {
                    v2 = li.next();
                    Edge<String,Integer> edge = gra.getEdge(v1,v2);
                    System.out.println("Da: " + v1.getElement().toString() + " - A: " + v2.getElement().toString()  + " - Linea: " + edge.getLine() );
                    pesoTot += edge.getWeight();
    
                    v1 = v2;
                }
                System.out.println("Peso totale: " + pesoTot);
                System.out.println("------------------------------------");
            }
        }
    }
    else {
        System.out.println("nessun percorso");
    }
    In questa seconda parte di codice path.size() è sempre 1, quindi non vado mai nell'if che mi recupera l'arco tra i due nodi, invece dovrebbe corrispondere ad ogni ciclo alle variabili visited inserite in paths nel metodo bfs.

    Quale è il problema?

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Non riesco a venire a capo del problema.
    Ho messo i file contenenti le classi in un file zip e caricato a questo indirizzo se volete vedere il codice completo e provarlo:
    https://www.sugarsync.com/pf/D6724194_65191373_98554

    la classe da modificare è GraphUtils.java, le altre dovrebbero già essere a posto.

    Riassumendo: vorrei fosse possibile ottenere tutti i percorsi tra il vertice di partenza e quello di destinazione, senza duplicati.

    Vi sare veramente grato se riusciste a darmi una mano.

  5. #5
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    up

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.