Denkanstoss beim DijkstraAlgorithmus

Status
Nicht offen für weitere Antworten.

Hassbrut

Aktives Mitglied
Hi, ich muss mit dem Dijkstra-Algorithmus arbeiten. Es handelt sich hierbei um einen Algorithmus, der die kürzeste Strecke einer Route bestimmt. Siehe auch: http://n.ethz.ch/student/stammt/doc/Algorithmen/Dijkstra.html

Ich habmich damit beschäftig, verstehe ihn auch und versuche ihn gerade in mein Programm einzubauen.

Hab mir hierfür den Methodenaufbau überlegt:
DijkstraSuche(Startnode, Endnode)
{
Ereignisliste.add(Startnode)

do
{
tempNode = erstes Element der Ereignisliste setzen

********************************************************

getconnectedNode(erste Node in Ereignisliste) //gibt den Vector "connected" mit allen verbundenen Nodes zurück

********************************************************

"connected" mit vector "bereits_besucht" vergleichen //"bereits_besucht" ist anfangs leer
und gleiche Einträge aus "connected" löschen

********************************************************

erstes Element aus "Ereignisliste" in "bereits_
besucht" schreiben und aus ersterer löschen

********************************************************

Element aus "connected" in die Ereignis-
liste anfügen (mit Datentyp DijkstraNode):

prüfen:

If (Element aus connected in Ereignisliste vorhanden)
& (connected.Element.Zeit < Ereignisliste.Element.Zeit)
{
überschreibe Element
Setze VorgängerNode = tempNode
}

If (Element aus connected in Ereignisliste vorhanden)
& (connected.Element.Zeit >= Ereignisliste.Element.Zeit)
{
nichts
}

If (Element aus connected nicht in Ereignisliste vorhanden)
{
Schreibe connected.Element in Ereignisliste
Setze VorgängerNode = tempNode
}

********************************************************

}
while (Ereignisliste != leer);
}

Soweit so gut, hab alle Methoden, die ich dafür brauche geschrieben, als da wären:

Code:
public int getDistance(Node node1, Node node2)

public Vector VectorVergleich(Vector v_vergleichen, Vector v_zuvergleichen)

public boolean TestVector(Vector vector,Node node) 

public Vector getConnectedNode(Node node)

Jetzt mein Problem:

Ich arbeite ja mit dem Datentyp Node. Ist einfach nen Datentyp, der einen Punkt auf einer Karte darstellt.
Das Problem ist nur, dass der Dijkstra-Algorithmus mehr als diesen Datentyp braucht.

Wer sich damit auskennt oder den Link oben studiert wird feststellen, dass ich neben der aktuellen Node auch die VorgängerNode und den Abstand zwischen den Nodes (als Zeiteinheit) abspeichern muss.

Mein Ansatz war nun einen Datentyp DijkstraNode zu erschaffen, der 2 Typen Nodes und eine Integer-Zahl beinhaltet.
Sprich Node aktuelleNode = new Node() , VorgaengerNode und int Abstand;

Aber wie gehe ich damit um? Ich komm keinen Schritt weiter bei der Handhabung dieses neuen Datentyps.


Sofern irgendwer versteht, was ich hier zusammenposte :) , wäre ich super dankbar, wenn er mir da helfen könnte.
 
M

Manderby

Gast
Hallo,
bin der Schreiber des oben angegebenen Links, deshalb meld ich mich hier mal. Bin zwar kein Java-Experte, aber mein schlaues Buch zuhause erlaubt mir, dir hier einen Vorschlag zu machen.

Bei der Zeile
Code:
tempNode = erstes Element der Ereignisliste setzen
weiss ich nicht genau, ob ich das richtig verstanden habe: Meinst du damit einfach irgendein Element, dass nun zufälligerweise an erster Stelle steht, oder das FRÜHESTE Element?

Falls das erste zutrifft, heisst das, dass du keine Priority-Queue benutzt. Daher könnte es sein, dass ein Knoten in "bereits_besucht" von einem anderen Knoten aus schneller besucht werden kann, dies jedoch nicht passiert, da dieser Knoten ja schon in "bereits_besucht" enthalten ist. Dafür gibt es zwei Lösungen:
1. Du implementierst das Ganze mit einer Priority-Queue, nehme immer nur den frühesten Knoten aus der Ereignisliste. Ich empfehle einen Heap. Sodann hast du, sobald du bei einem Knoten ankommst, automatisch den schnellsten Weg für diesen Knoten gefunden, denn es gibt keine weitere Möglichkeit mehr, mit noch weniger Schritten zu diesem Knoten zu gelangen.
2. Du streichst das Array "bereits_besucht" vollständig. Dies bewirkt, dass die Laufzeit des Algorithmus explodieren könnte (muss aber nicht).

Und hier der Vorschlag:

Code:
class DijkstraNode extends Node {

  public DijkstraNode vorg;          //Zeiger auf den Vorgängerknoten
  public int dist;                   //Der Abstand

  //Konstruktor:
  DijkstraNode(int xvalue,int y){
    //Setze die Werte für Node (keine Ahnung, was diese Klasse
    //für Werte besitzt, ich nehme mal an x und y und beide protected)
    x=xvalue;
    y=value;
  }

  SetNewValues(int distanz, DijkstraNode vorgaenger){
    dist=distanz;
    vorg=vorgaenger;
  }
 
}

Die GetValues kannst du selbst programmieren.

Wie geht man damit um?

Anstelle dass du deine Werte in Nodes eingibst (irgendwo müssen die Werte ja eingetragen werden), gibst du sie in DijkstraNodes ein. Bsp (Bitte nicht böse sein, wenn die Syntax nicht stimmt :) ):

Code:
DikstraNode[] nodes=new DikstraNode[3];
nodes[1]=DikstraNode(25,44);
nodes[2]=DikstraNode(43,62);
nodes[3]=DikstraNode(76,93);

Sobald du bei einem der Punkte
Code:
If (Element aus connected in Ereignisliste vorhanden) 
If (Element aus connected nicht in Ereignisliste vorhanden)
ankommst, berechnest du die Distanz und trägst die neuen Werte ein:

Code:
SetNewValues(neuedistanz, neuervorgaenger);

Das ist alles.

Hoffe, das half etwas. Viel Spass mit Dijkstra, es gibt viele Abgründe! :D
 

Hassbrut

Aktives Mitglied
Puhh, das ist einiges auf einmal, jedenfalls für 06:30 Uhr... :)
Trotzdem big thx, werd mir das mal reinziehen, sobald ich wach bin.

TempNode ist schlicht die Variable, mit der einen Schritt vorher gearbeitet wurde, wenn nun
Element aus "connected" in die Ereignis-
liste anfügen
abgefragt wird, steht in der TempNode die Node, die die VorgängerNode ist.

Mit TempNode kann ich somit realisieren, dass er speichert, von welcher Node er zu einer anderen gekommen ist.
Beispiel: D2[A]
Dann ist D = die Node die als letztes in bereits_besucht geschrieben wurde, 2 die Zeit, [A] die Vorgänger/TempNode.
Als TempNode setze ich am anfang der do/while-Schleife immer das oberste Element der Ereignisliste, weil die ja permanent abgearbeitet wird.


PS.: Super Seite, hab den Dijkstra damit recht schnell verstanden. Respekt! :toll:
 

meez

Top Contributor
Bau das Programm so, dass du die Wertigkeiten auch dynamisch verteilen kann, d.h. dass die Nodes (Router) ihre Tabellen weitergeben können...
Weil das wird der nächste Teil der Aufgabe sein....;)...
(btw. Dijkstra wird heute nicht mehr verwendet...Nur noch in Uebungen)
 
B

bygones

Gast
mhm - Dijkstra - durfte mich die letzten 4 monaten damit ausführlich beschäftigen.....
ehrlich gesagt: wenns geht - versuch eine library zu nehmen (z.b. http://www.jdsl.org).

Dijkstra ist nichts anderes als eine Variation einer Breitensuche bzw. Tiefensuche in einem Graph, nur dass die Knoten nicht in einem Stack oder Queue gehalten werde sondern in einer Priority Queue. Und eine gute Implementierung einer Priority Queue ist nicht an einem Tag zu machen....

daher mein Tipp: wenns geht: nimm eine lib (ist einfacher und meist auch besser)

meez hat gesagt.:
(btw. Dijkstra wird heute nicht mehr verwendet...Nur noch in Uebungen)
Das stimmt nicht !! Ich benutze in noch :)
Aber meez hat recht - wenn du z.b. den weg in einem festen gitter suchst oder bzw eine Heuristik funktion nehmen kannst um zu schätzen wie weit dein knoten vom zielknoten entfernt ist, dann ist der A* Algorithmus besser
 

Hassbrut

Aktives Mitglied
meez hat gesagt.:
Bau das Programm so, dass du die Wertigkeiten auch dynamisch verteilen kann, d.h. dass die Nodes (Router) ihre Tabellen weitergeben können...
Weil das wird der nächste Teil der Aufgabe sein....;)...

Hö? Welcher Teil für welche Aufgabe?

Blick jetzt garnet mehr durch, werd mir mal die Bibliothek ansehen, ansonsten nen Plan wie ich das mit dem Datentyp hinbekomme? Versteh's immernoch net so ganz.
 
M

Manderby

Gast
Code:
Bau das Programm so, dass du die Wertigkeiten auch dynamisch verteilen kann, d.h. dass die Nodes (Router) ihre Tabellen weitergeben können...
Weil das wird der nächste Teil der Aufgabe sein.......

Jetzt versteh ich glaubs, ihr wollt das OSPF-Protokoll (http://n.ethz.ch/student/stammt/doc/Netzwerk/OSPF.html) implementieren! Deswegen auch Router. Ich denke, damit ist gemeint: Führe den Dijkstra für jeden Knoten durch und speichere die jeweiligen Ergebnisse für sämtliche Knoten (oder vielleicht auch nur eine Teilmenge?) in dem Knoten selbst. Anders gesagt: Gehe durch alle Knoten durch, setze den Knoten als Startknoten und führe einen kompletten Dijkstra durch. Speichere das Ergebnis in einem Array der Form

Code:
DijkstraNode node;
int gesamtdistanz;
(Wobei du diese beiden Werte eventuell als eigene Klasse implementieren solltest)

Mit dynamisch ist gemeint:
Das was hier abläuft ist ein rein sequentieller Ablauf von einer Simulation mehrerer Knoten (zuerst Knoten 1, dann Knoten 2)

Um das ganze nun jedoch nicht-sequentiell zu machen (ich schätze, ihr geht jetzt dann auf das Thema Threads über) wurde nun der Dijkstra ausgewählt, da dieser gerade im OSPF-Protokoll (welches im Interent für die Router benötigt wird) verwendet wird (@meez: Dijkstra wird glaubs schon noch verwendet, den A*-Algorithmus kenn ich jedoch nicht, vielleicht kann dieser den Dijkstra ja ersetzen). Also wird der sequentielle Ablauf "Gehe durch alle Knoten durch..." ersetzt durch soetwas wie "frage mal deine Nachbarn, ob die vielleicht Informationen über den schnellsten Weg zu Knoten X haben".

Alles klar, oder? :)
 
B

bygones

Gast
Manderby hat gesagt.:
Dijkstra wird glaubs schon noch verwendet, den A*-Algorithmus kenn ich jedoch nicht, vielleicht kann dieser den Dijkstra ja ersetzen
hat er eigentlich schon. A* arbeitet im gegensatz zum DIjkstra mit einer Heuristik Funktion die einem sagt wie weit geschätzt ein Knoten entfernt ist vom Zielknoten. Das hilft dem Algorithmus schneller seinen Weg zu finden.

Wenn aber für das gegebene Problem keine Heuristik Funktion gefunden werden kann, so ist und bleibt Dijkstra die einzige Wahl !
 

Hassbrut

Aktives Mitglied
Hey halt, ich progge mein Softwareprojekt zusammen für die Uni, wir müssen ein Streckennetz aufstellen und jetzt die kürzeste Route berechnen. Daher der Dijkstra.

Eigentlich wollte ich das so einfach wie möglich halten, doch jetzt versteh ich absolut garnichts mehr. :)
 
M

Manderby

Gast
Einfach nicht beachten, wir haben nur ein wenig gefachsimpelt (Mist, was ist schon wieder eine Heuristikfunktion? Ach ja, angepasste Wahrscheinlichkeit-Funktionen für gegebene Problemklasse ???:L ). @deathbyaclown: Komm jetzt nicht grad dazu, diese Thematik zu studieren, tönt aber spannend.

Also, die Sätze mit folgenden Wörtern einfach streichen, dann kommst du schon wieder draus: A*, Heuristik, Router, Thread, ospf. (Diejenigen mit Dijkstra würd ich lassen :) )
Mach den Dijkstra mal ganz normal, das ganze weitere Zeugs kommt dann in der nächsten Übung ;)
 

Hassbrut

Aktives Mitglied
Okay ich setz mich jetzt ran und versuch nochmal die Variablen zu deixeln, wie gesagt das einzige Prob was ich noch mit Dijkstra hab.
 

Hassbrut

Aktives Mitglied
So hab's über den neuen Datentyp DijkstraNode(Node aktuelleNode, Node VorgaengerNode, int Abstand) geschafft!
Läuft alles super.
Der Quelltext sieht zwar aus, wie von 'nem Geisteskranken geschrieben, aber da kann man ja noch aufräumen.

Auf jeden big thx an alle, die sich hier beteiligt haben!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna OutOfMemory-Error beim Build in der CI-Pipeline Allgemeine Java-Themen 5
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
B Stringmanipulationen beim Dateinamen Allgemeine Java-Themen 8
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
A Hilfe beim Verständnis Allgemeine Java-Themen 16
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
U Fehler beim Compillieren Allgemeine Java-Themen 13
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
J Jasper Report - seltame Meldung beim compilieren Allgemeine Java-Themen 3
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
J WARNING: An illegal reflective access operation has occurred, beim Compilieren von JasperReports, was bedeutet das ? Allgemeine Java-Themen 23
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
S Seitenausrichtung beim Drucken Allgemeine Java-Themen 1
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
M Beim Öffnen Dialog Directory und Filetype definieren Allgemeine Java-Themen 2
G Problem beim GUI Allgemeine Java-Themen 9
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
J Konstruktor in JSP beim Kompilieren nicht gefunden Allgemeine Java-Themen 3
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
Fischkralle Beim Clean Coden an den Schnittstellen geschnitten. Allgemeine Java-Themen 10
H Beim Konstruktor "this" Allgemeine Java-Themen 4
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
Thallius Swing Merkwürdiges Verhalten beim Panel Tausch Allgemeine Java-Themen 3
Tacofan Sound beim öffnen der GUI Allgemeine Java-Themen 8
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
J JDK installieren Das Jdk funtioniert beim Editor nicht. Allgemeine Java-Themen 3
R Verdrückt beim Sicherheitshinweis Allgemeine Java-Themen 2
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
javampir Input/Output Effizienz beim binären Lesen einer Datei Allgemeine Java-Themen 6
javampir Seltsame Lücken beim Abspielen von Sound Allgemeine Java-Themen 2
RalleYTN JAnsi Warum bleiben die Hintergrundfarben beim Reseten der Konsole? Allgemeine Java-Themen 0
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
S Verständnisproblem beim Mocking Allgemeine Java-Themen 8
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K Fehler beim erstellen von .jar Datei Allgemeine Java-Themen 3
M Eclipse Fehler beim Installieren des Plugins "Jigloo" Allgemeine Java-Themen 12
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
G StackoverflowError beim laden einer FXMML Datei Allgemeine Java-Themen 1
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
D Selenium WebDriver HtmlUnitDriver Problem beim Automatisieren Allgemeine Java-Themen 1
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
D Input/Output Zeilen werden "ignoriert" beim Einlesen aus einer Textdatei Allgemeine Java-Themen 3
L Suchvorschläge beim eingeben einzelner Buchstaben Allgemeine Java-Themen 3
B Compiler-Fehler NullPointerException beim Auslesen von .lang-Datei Allgemeine Java-Themen 3
U Eclipse Java Programm beschädigt .tar.gz dateien beim Entpacken Allgemeine Java-Themen 7
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
reibi Classpath Classpath Variable beim Tomcat Allgemeine Java-Themen 2
H JUnit Fehler beim Compilieren - erledigt Allgemeine Java-Themen 0
J Fehler beim parsens eine Datums Allgemeine Java-Themen 3
A Java - Beim Abspeichern Redundanzen vermeiden! Allgemeine Java-Themen 6
L einfache Verzinsung mit for-Schleife & Ausschluss von Werten beim Einlesen Allgemeine Java-Themen 5
C Bufferoverflow beim eigenen simpeln Programm Allgemeine Java-Themen 4
MiMa Umlaute beim Einlesen von Dateinamen Allgemeine Java-Themen 12
G Fehler beim instanzieren einer Generischen Klasse Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben