2010-10-17 3 views
2

J'ai implémenté un algorithme de traversée de graphe qui trouve un chemin entre deux noeuds dans le graphe. Le problème est qu'il ne trouve un chemin pour certaines requêtes quand je sais qu'il ya un chemin entre chaque nœudProblème avec la traversée de graphe

public List getDirectRoute(Node start, Node end) 
{ 
    //Uses Dijkstras 
    List<Node> vis = new LinkedList<Node>(); 
    Map<Node,Node> prev = new HashMap<Node,Node>(); // Records the previous Node 

    List<Node> route = new LinkedList<Node>(); //Will hold the final route 
    Queue<Node> queue = new LinkedList<Node>(); // Used for the algorithm 

    Node current = start; 
    queue.add(current); 
    vis.add(current); 

    while(!queue.isEmpty()) 
    { 
     current = queue.remove(); 

     if(current.equals(end)) 
     { 
      break; 
     }else 
     { 
      for(Node node : successors(current)) 
      { 
       if(node.equals(vertices.get(0))) 
       { 
        continue; 
       } 
       if(!vis.contains(node)) 
       { 
        queue.add(node); 
        vis.add(node); 
        prev.put(node, current); 
       } 
      } 

      } 
    } 

    if (!current.equals(end)) 
    { 
     System.out.println("No route available"); 
    } 

    for(Node node = end; node != null; node = prev.get(node)) 
    { 
     route.add(node); 

    } 
    return route; 


} 

Suis-je manque quelque chose dans l'algorithme? J'ai exécuté le débogueur et mais je ne peux pas trouver le problème

+0

Pouvez-vous ajouter une brève explication de votre algorithme utilisé ici? –

+1

Qu'est-ce que 'vertices'? Que font les successeurs (Node) '? Vous semblez avoir des données globales que vous ne liez pas. Comment encodes-tu le graphique en tant qu'objets? –

+0

@matt b +1, nous avons besoin du reste du code pour le comprendre. – andersoj

Répondre

0

Il semble que vous utilisiez une recherche de largeur au lieu de l'algorithme de Dijkstra pour trouver un chemin du début à la fin. J'ai supposé que les successeurs renvoient les nœuds que le courant peut traverser et que les nœuds vertices.get (0) signifient les nœuds qui n'ont pas de bord externe vers d'autres nœuds. Dans cet esprit, il semble que votre code devrait fonctionner correctement. Donc je dois dire que c'est soit la méthode de votre successeur qui fonctionne mal ou que vous avez ajouté des sommets qui ont des arêtes aux sommets (0) (bien que cela ne puisse contenir qu'un seul nœud).

Vous pourriez obtenir une meilleure réponse si nous savions ce que les successeurs ont fait et ce que vous stockez dans les sommets.

+0

C'était la méthode des successeurs qui était faux. Le fixe maintenant. Merci :-) – Joshy910

1

Je sais que vous essayez simplement de faire fonctionner votre code, probablement pas à la recherche d'une bibliothèque. Mais FYI, vous pouvez regarder JGraphT, qui est une bibliothèque de graphes pour Java. Il y a une solide implémentation de Dijkstra, entre autres choses.

+0

Merci. Je garderai cela à l'esprit pour la prochaine fois :-) – Joshy910

Questions connexes