Dijkstra Algorithmus Hilfe!!

dijkstra2000

Mitglied
Hey, ich bräuchte schnelle Hilfe zu meinem Algorithmus.

Ich habe mehrere Klassen, darunter eine Klasse Graph, einer Liste, Knoten und Kanten. Alle jeweils mit Methoden.
Dazu habe ich jetzt noch die Klasse Klasse erstellt.

Wie kann ich den schnellsten Weg von einem Knoten zu einem bestimmten Knoten finden? Hier meine Lösungsansatz:


private Graph Klassengraph;


public Klasse()
{


Klassengraph = new Graph();


Vertex test1 = new Vertex("Test1");
klassengraph.addVertex(test1);

Vertex test2 = new Vertex("Test2");
klassengraph.addVertex(test2);



Edge k1 = new Edge(test1,test2,4);
//Stellt euch noch andere Knoten und Kanten vor

}

public Vertex kürzesteEntfernung(String pName1)
{
Vertex name1 = klassengraph.getVertex(pName1);
List<Edge> nachbar = klassengraph.getEdges(name1);
nachbar.toFirst();
double minimum = nachbar.getContent().getWeight();

while(nachbar.hasAccess())
{

}
}
 
Wir machen selbstverständlich KEINE Hausaufgaben, aber können bei konkreten Fragen weiterhelfen.

Du hast also eine Adjazenzliste, keine -Matrix, sehe ich das richtig? Dann könnte es frickelig werden, weil Du ja jeden Nachfolger brauchst: https://www.geeksforgeeks.org/dijkstras-algorithm-for-adjacency-list-representation-greedy-algo-8/

Ich würde sagen, fang erstmal hier an zu lesen: https://de.wikipedia.org/wiki/Dijkstra-Algorithmus#Algorithmus_in_Pseudocode

und bei konkreten Fragen meldest Du Dich nochmal. Einfach sagen: "Macht mal!", funktioniert so nicht.
 
Wir machen selbstverständlich KEINE Hausaufgaben, aber können bei konkreten Fragen weiterhelfen.

Du hast also eine Adjazenzliste, keine -Matrix, sehe ich das richtig? Dann könnte es frickelig werden, weil Du ja jeden Nachfolger brauchst: https://www.geeksforgeeks.org/dijkstras-algorithm-for-adjacency-list-representation-greedy-algo-8/

Ich würde sagen, fang erstmal hier an zu lesen: https://de.wikipedia.org/wiki/Dijkstra-Algorithmus#Algorithmus_in_Pseudocode

und bei konkreten Fragen meldest Du Dich nochmal. Einfach sagen: "Macht mal!", funktioniert so nicht.
Danke für deine Nachricht inkl. der Hilfen, auch wenn das meiste nur Links sind. Und recherchieren könnte ich auch selbst.

Also eine Hausaufgabe ist das eher weniger. Aber das macht nichts.
"Macht mal!" habe ich ebenfalls nicht erwähnt. Ich habe nur gesagt, dass ich nicht weiterkomme und somit Hilfe benötige. Ob das jetzt nur ein Tipp sein soll oder direkt die komplette Lösung ist, kann jeder selbst entscheiden und dann kommentieren. Das wichtigste ist, dass ich das, wie das Programm abläuft und was es macht, verstehen möchte. Allerdings will ich nicht zu viel Zeit mit recherchieren vergeuden, das hat so einige Gründe. Deshalb dachte ich mir, hier im Java Forum sind einige kompetente Leute die mir das schnell, super einfach erklären können.
 
Naja, die Frage ist halt, was Du erklärt haben willst. Den "schnellsten Weg" (wie ist der definiert?) zwischen zwei Knoten kannst Du per Dijkstra oder A* ermitteln.
 
Naja, die Frage ist halt, was Du erklärt haben willst. Den "schnellsten Weg" (wie ist der definiert?) zwischen zwei Knoten kannst Du per Dijkstra oder A* ermitteln.
Jede Verbindung (also Kante) hat ein Gewicht. Der schnellste Weg ist also: Kleinste Summe der Gewichte der Kanten.

test1 ist der Anfangsknoten. test2 gibt man als Parameter ein. Dann müsste der Algorithmus doch irgendwie alle Kanten berücksichtigen die zu test2 hingehen. Aber irgendwie macht das kein Sinn, weil ja auch andere Knoten dazwischen sein können...
 
Warum machst du es dann nicht, anstatt hier eine Komplettlösung anzufordern? Man bräuchte mehr Informationen über den Graphen und wie dieser hinterlegt ist... Und A* ist auch nicht schlecht.
Deinen ersten Satz habe ich bereits beantwortet:
1. "Allerdings will ich nicht zu viel Zeit mit recherchieren vergeuden, das hat so einige [private] Gründe"
2. "Ob das jetzt nur ein Tipp sein soll oder direkt die komplette Lösung ist, kann jeder selbst entscheiden und dann kommentieren."

Ja ich habe den Konstruktor mit reingeschrieben. Ich hoffe das reicht um sich den Graphen vorzustellen?

A* ist bestimmt gut. Aber ich habe in letzter Zeit so viele Algorithmen und sonst was kennengeleiteten, da verliere ich den Überblick was für was ist...
 
Jede Verbindung (also Kante) hat ein Gewicht. Der schnellste Weg ist also: Kleinste Summe der Gewichte der Kanten.
OK, nachdem ich da keinen Ansatz für eine Heuristik sehe, fällt A* schon mal flach. Dann konzentrieren wir uns mal auf Dijkstra.

Aber irgendwie macht das kein Sinn, weil ja auch andere Knoten dazwischen sein können...
Doch, genau darum geht es. Der Algorithmus ist im Wiki-Link von @eineNick bestens beschrieben. Es wäre jetzt irgendwie schwachsinnig, das jetzt alles hier zu wiederholen.

Im Prinzip lässt sich das 1:1 umsetzen, wenn Du https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/PriorityQueue.html verwendest.
 
@dijkstra2000 Fang doch mal an zu lesen, anstatt hier eine Lösung erschleichen zu wollen...


A* is basically an informed variation of Dijkstra.
A* is considered a "best first search" because it greedily chooses which vertex to explore next, according to the value of f(v) [f(v) = h(v) + g(v)] - where h is the heuristic and g is the cost so far.

Note that if you use a non informative heuristic function: h(v) = 0 for each v: you get that A* chooses which vertex to develop next according to the "so far cost" (g(v)) only, same as Dijkstra's algorithm - so if h(v) = 0, A* defaults to Dijkstra's Algorithm.
...
A* is both complete (finds a path if one exists) and optimal (always finds the shortest path) if you use an Admissible heuristic function. If your function is not admissible - all bets are off.
...
h(n): approximate cost from node n to goal node. It is a heuristic function. This heuristic function should never overestimate the cost. That means, the real cost to reach goal node from node n should be greater than or equal h(n). It is called admissible heuristic.

Das soll Folgendes bedeuten: Fällt die Luftlinienheuristik flach, weil es, wie du beschreibst @mihe7 , eine kostengünstigere Verbindung zwischen zwei Knoten geben kann als die Luftlinie und sich die Luftlinienheuristik damit überschätzt, fällt auch A* flach...

Das heißt konkret, dass du den Algorithmus einfach so wie auf Wikipedia beschrieben mit einer PQ umsetzen kannst... Gute Nacht. 🙂
 

Zurück
Oben