2009-06-01 21 views
6

Ceci est pour un projet d'école; Je rencontre énormément de problèmes et je n'arrive pas à trouver une solution compréhensible.Algorithme de Dijkstra pour tableau 2D en Java

a b c d e z 
a - 2 3 - - - 
b 2 - - 5 2 - 
c 3 - - - 5 - 
d - 5 - - 1 2 
e - 2 5 1 - 4 
z - - - 2 4 - 

C'est le tableau à deux dimensions. Donc, si vous voulez trouver le chemin le plus court, c'est a, b, e, d, z = 7, et (a, b) = (b, a) - il vous amène à la nouvelle ligne pour les adjacentes de la ligne chemins

Y at-il quelqu'un qui peut m'aider à implémenter l'algorithme de Dijkstra pour cet exemple? Je l'apprécierais vraiment. (Je préfère les tableaux, les cartes et les décors m'embrouillent un peu, les listes sont gérables - bien que je sois prêt à chercher une solution à ce stade)

[Au moins, je ne suis pas en train de déchirer une source du net. En fait, je veux apprendre ces choses ... Il est vraiment difficile (>. <)]

Oh, point de départ est A et le point final est Z


Comme la plupart des gens, je ne trouve pas le concept de l'algorithme difficile - je peux juste voir pour obtenir le bon codage ... Aide s'il vous plaît?

Exemple de code - un ami m'a beaucoup aidé avec cela (bien qu'il soit rempli de structures de données que je trouve difficile à suivre) J'ai aussi essayé d'adapter le code C++ de dreamincode.net/forums/blog/martyr2/ index.php? showentry = 578 en java, mais ça n'a pas si bien ...

import java.util.*; 

public class Pathy{ 

    private static class pathyNode{ 
     public final String name; 
     public Map<pathyNode, Integer> adjacentNodes; 

     public pathyNode(String n){ 
      name = n; 
      adjacentNodes = new HashMap<pathyNode, Integer>(); 
     } 

    } 

    //instance variables 

    //constructors 

    //accessors 

    //methods 
    public static ArrayList<pathyNode> convert(int[][] inMatrix){ 
     ArrayList<pathyNode> nodeList = new ArrayList<pathyNode>(); 
     for(int i = 0; i < inMatrix.length; i++){ 
      nodeList.add(new pathyNode("" + i)); 
     } 
     for(int i = 0; i < inMatrix.length; i++){ 
      for(int j = 0; j < inMatrix[i].length; j++){ 
       if(inMatrix[i][j] != -1){ 
        nodeList.get(i).adjacentNodes.put(nodeList.get(j), 
          new Integer(inMatrix[i][j])); 
       } 
      } 
     } 
     return nodeList; 
    } 

    public static Map<pathyNode, Integer> Dijkstra(ArrayList<pathyNode> inGraph){ 
     Set<pathyNode> visited = new HashSet<pathyNode>(); 
     visited.add(inGraph.get(0)); 
     pathyNode source = inGraph.get(0); 
     Map answer = new TreeMap<pathyNode, Integer>(); 
     for(pathyNode node : inGraph){ 
      dijkstraHelper(visited, 0, source, node); 
      answer.put(node, dijkstraHelper(visited, 0, source, node)); 
     } 
     return answer; 
    } 

    private static int dijkstraHelper(Set<pathyNode> visited, int sum, pathyNode start, pathyNode destination){ 
     Map<pathyNode, Integer> adjacent = new HashMap<pathyNode, Integer>(); 

     for(pathyNode n : visited){ 
      for(pathyNode m: n.adjacentNodes.keySet()){ 
       if(adjacent.containsKey(m)){ 
        Integer temp = n.adjacentNodes.get(m); 
        if(temp < adjacent.get(m)){ 
         adjacent.put(m, temp); 
        } 
       } 
       else{ 
        adjacent.put(m, n.adjacentNodes.get(m)); 
       } 
      } 
     } 

     Map<pathyNode, Integer> adjacent2 = new HashMap<pathyNode, Integer>(); 
     Set<pathyNode> tempSet = adjacent.keySet(); 
     tempSet.removeAll(visited); 
     for(pathyNode n: tempSet){ 
      adjacent2.put(n, adjacent.get(n)); 
     } 
     adjacent = adjacent2; 
     Integer min = new Integer(java.lang.Integer.MAX_VALUE); 
     pathyNode minNode = null; 

     for(pathyNode n: adjacent.keySet()){ 
      Integer temp = adjacent.get(n); 
      if(temp < min){ 
       min = temp; 
       minNode = n; 
      } 
     } 
     visited.add(minNode); 
     sum += min.intValue(); 
     sum = dijkstraHelper(visited, sum, start, destination); 
     return sum; 
    } 

    //main 
    public static void main(String[] args){ 

     int[][] input = new int[][] { {-1, 2, 3, -1, -1, -1}, 
          {2, -1, -1, 5, 2, -1}, 
          {3, -1, -1, -1, 5, -1}, 
          {-1, 5, -1, -1, 1, 2}, 
          {-1, 2, 5, 1, -1, 4}, 
          {-1, -1, -1, 2, 4, -1}, 
         }; 
         //-1 represents an non-existant path 

     System.out.println(Dijkstra(convert(input))); 
    } 
} 

Répondre

8

la représentation que vous appelez tableau 2D, est la représentation de la matrice de contiguïté d'un graphique et le problème que vous êtes L'algorithme de Dijkstra est conçu pour résoudre ce type de problème, ce qui peut être utile: http://renaud.waldura.com/doc/java/dijkstra/ Téléchargez le code du site et lisez la documentation. ed écrire un code similaire à suivre

RoutesMap map = map = new DenseRoutesMap(5); 
    map.addDirectRoute(City.A, City.B, 2); 
    map.addDirectRoute(City.A, City.C, 3); 
    map.addDirectRoute(City.B, City.A, 2); 
    map.addDirectRoute(City.B, City.D, 5); 
    map.addDirectRoute(City.B, City.D, 2); 
    ... 
    DijkstraEngine engine = new DijkstraEngine(map); 
    int distance = engine.getShortestDistance(City.F); 
+0

Malheureusement, ce site ne m'aide pas beaucoup. Il ne traite pas des tableaux 2D comme j'en ai besoin aussi ... Est-ce que quelqu'un d'autre a une solution/suggestion? – Stan

+0

J'ai mis à jour ma réponse et ajouté un échantillon de code. – Babar

+0

@Babar: Belle manière de le pousser dans la bonne direction sans renverser tous les haricots. +1 –

0

Ne pas savoir si quelqu'un est toujours intéressé par cette représentation matricielle de Dijikstra mais j'ai pensé à coder Dijikstra en Actionscript et donc d'abord dû me apprendre comment fonctionnait Dijuikstra. Ayant fait cela et en essayant de le coder, j'ai réalisé seulement la nuit dernière que je pouvais représenter les nœuds et les distances dans une matrice comme celle que vous avez en haut de ce post. Ma théorie est alors que trouver le chemin le plus court sera une question très simple. J'expérimente toujours pour m'assurer que je corrige.

Dans la matrice;

abcdez a - 2 3 - - - b 2 - - 5 2 - c 3 - - - 5 - d - 5 - - 1 2 e - 2 mai 1 à 4 z - - - Je commence à regarder la ligne "a" (puisque c'est le point de départ) et sélectionne le plus petit nombre dans la rangée étant 2 (sous b). J'écris donc le chemin comme "a - b" pour un coût de 2. Ensuite, je vais à la ligne b et je trouve encore le plus petit nombre à la DROITE de b (puisque nous sommes déjà au nœud B. Cela me donne 2 sous le "e". Donc le chemin est maintenant "a - b - e" pour un coût total de 4. Puis regarde la ligne "e" et la règle devrait trouver le plus petit nombre apparaissant après la colonne "e". Cela me donnerait "z" et donnerait le chemin complet comme "a - b - e - z" et un coût total de 8. Cependant, et rappelez - vous que je ne l 'ai compris que la nuit dernière, la méthodologie doit reconnaître que tout en regardant la rangée "e" une autre possibilité est d'aller à la colonne d au coût de 1.Ensuite, regardez la ligne d pour le nombre le plus bas après la ligne d qui me donnera la ligne "z" pour un coût de 2.

Donc c'est une meilleure solution avec le chemin étant "a - b - e - d -z "à un coût total de 7 comme vous l'avez correctement dit. OK J'ai encore besoin de coder ceci dans Actionscript mais mon intuition est qu'il sera très facile de coder dans ActionScript. J'ai peur de ne pas avoir d'expérience en Java mais si vous êtes d'accord avec ma méthode, il devrait être facile de coder en Java.

Paul