2009-06-01 21 views
6

Dies ist für ein Schulprojekt; Ich stoße auf eine Menge Ärger, und ich kann keine verständliche Lösung finden.Dijkstra-Algorithmus für 2D-Array in 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 - 

Das ist das zweidimensionale Array. Wenn Sie also den kürzesten Weg finden wollen, ist es von a, b, e, d, z = 7, und (a, b) = (b, a) - es bringt Sie zu der neuen Zeile für die angrenzenden Zeilen Pfade

Gibt es jemanden, der mir helfen kann, den Dijkstra-Algorithmus für dieses Beispiel zu implementieren? Ich würde es wirklich schätzen. (Ich mag Arrays am besten zu mögen, Karten und Sets verwirren mich ein wenig, Listen sind überschaubar - obwohl ich zu diesem Zeitpunkt in irgendeine Lösung schauen möchte)

[Zumindest reiße ich nicht einfach ab eine Quelle aus dem Netz. Ich will wirklich diese Dinge ... Es ist nur schwer wirklich (>. <)]

Oh, Startpunkt A und Endpunkt Z


Da die meisten Menschen, finde ich nicht das Konzept des Algorithmus schwierig - ich kann nur sehen, um die Codierung richtig zu machen ... Hilfe bitte?

Beispielcode - ein Freund hat mir dabei sehr geholfen (obwohl er mit Datenstrukturen gefüllt ist, die ich schwer zu finden finde) Ich habe auch versucht, den C++ Code von dreamincode.net/forums/blog/martyr2/ anzupassen index.php? showentry = 578 in Java, aber das ist nicht so gut gehen ...

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))); 
    } 
} 

Antwort

8

die Darstellung, die Sie 2D-Array aufrufen, ist die Adjazenzmatrix Darstellung eines Graphen und das Problem, das Sie zu lösen versucht, ist eine Instanz von 'Single-Source Shortest Paths' Problem.Dijkstra-Algorithmus wurde entwickelt, um diese Art von Problem zu lösen.Dies kann hilfreich sein http://renaud.waldura.com/doc/java/dijkstra/.Download der Code von der Website und lesen Sie die Dokumentation.Im Grunde werden Sie ne ed-Code zu schreiben ähnlich wie folgenden

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

Leider hilft mir diese Seite nicht viel. Es befasst sich nicht mit 2D-Arrays wie ich es brauche ... Hat jemand andere eine Lösung/Vorschlag? – Stan

+0

Ich habe meine Antwort aktualisiert und Codebeispiel hinzugefügt. – Babar

+0

@Babar: Schöne Art, ihn in die richtige Richtung zu stoßen, ohne alle Bohnen zu verschütten. +1 –

0

wissen nicht, ob noch jemand Interesse an dieser Matrixdarstellung von Dijikstra ist, aber ich habe über Codierung Dijikstra in Actionscript gedacht und so zunächst selbst zu lehren hatte, wie Dijuikstra gearbeitet. Nachdem ich das gemacht und versucht hatte, es zu kodieren, erkannte ich erst letzte Nacht, dass ich die Knoten und Entfernungen in einer Matrix darstellen konnte, wie Sie sie oben auf diesem Post haben. Meine Theorie ist dann, dass die Suche nach dem kürzesten Weg eine sehr einfache Angelegenheit sein wird. Ich experimentiere immer noch, um sicherzustellen, dass ich korrigiere.

In der Matrix;

abcdez - 2 3 - - - b 2 - - 5 2 - C 3 - - - 5 - d - 5 - - 1 2 e - 2 01-04 Mai z - - - 2 4 -

Ich beginne mit der Zeile "a" (da dies der Startpunkt ist) und wähle die kleinste Zahl in der Zeile 2 (unter b). Also schreibe ich den Pfad als "a - b" zu einem Preis von 2. Dann gehe ich in die b Zeile und finde wieder die kleinste Zahl nach RECHTS von b (da wir schon beim b Knoten sind. Das gibt mir 2 unter das "e". So ist der Pfad nun "a - b - e" bei einem Gesamtkosten von 4. i Dann schaue auf die "e" Zeile und die Regel sollte die kleinste Nummer nach der "e" Spalte finden. Dies würde mir "Z" geben und den vollständigen Pfad als "a - b - e - z" und Gesamtkosten von 8 geben. Aber, und erinnere mich, dass ich das erst letzte Nacht herausgefunden habe, muss die Methodik das beim Anschauen erkennen die "e" -Zeile eine andere Möglichkeit ist, zu der d-Spalte für 1 zu gehen.Dann schauen Sie sich die d-Reihe für die niedrigste Zahl nach der d-Reihe an, die mir die "z" -Reihe zu Kosten von 2 gibt.

Daher ist dies eine bessere Lösung mit dem Pfad "a - b - e - d -z "zu einem Gesamtpreis von 7, wie Sie richtig gesagt haben.

OK Ich muss dies noch in Actionscript codieren, aber mein Bauchgefühl ist, dass es sehr einfach sein wird, in Actionscript zu programmieren. Angst, ich habe keine Erfahrung in Java, aber wenn Sie mit meiner Methode einverstanden sind, sollte es einfach sein, in Java zu programmieren.

Paul