zpg-graphentester/algorithmen/GraphAlgo_Dijkstra.java
2026-03-17 08:43:07 +01:00

91 lines
3 KiB
Java

package algorithmen;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.nio.file.*;
import graph.*;
/**
* Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen.
* Algorithmus: Dijkstra
*
* @version 7.1 from 12.02.2025
* @author Thomas Schaller
*/
public class GraphAlgo_Dijkstra extends GraphAlgo {
// Anfang Attribute
public String getBezeichnung() {
return "Kürzester Pfad (Dijkstra)";
}
public void init() {
super.init();
for(Knoten k : g.getAlleKnoten()) {
k.setWert(Double.POSITIVE_INFINITY);
}
info("Setze alle Entfernungen auf unendlich");
}
// Anfang Methoden
public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) {
return;
}
info("Erzeuge leere toDo-Liste und füge Startknoten hinzu");
List<Knoten> toDo = new ArrayList<Knoten>();
getStartKnoten().setBesucht(true);
getStartKnoten().setWert(0);
toDo.add(getStartKnoten());
while(toDo.size()>0) {
info("Sortiere toDo-Liste");
Collections.sort(toDo);
info("Nimm ersten Knoten aus der toDo-Liste (momentan "+toDo.size()+" Elemente) heraus");
Knoten k = toDo.remove(0);
infoIndentMore();
k.setMarkiert(true);
info("Markiere den Knoten");
info("Er hat Entfernung "+k.getIntWert());
info("Für jeden Nachbarknoten");
infoIndentMore();
for(Knoten n : g.getNachbarknoten(k)) {
if(!n.isMarkiert()){
info("- ist noch nicht markiert");
Kante ka = g.getKante(k, n);
if(n.getDoubleWert() > k.getDoubleWert()+ka.getGewicht()){
if(n.isBesucht()) {
List<Kante> eingehend = g.getEingehendeKanten(n, ka2 -> !ka2.isGeloescht() && ka2.isMarkiert());
Kante alterWeg = eingehend.get(0);
alterWeg.setGeloescht(true);
alterWeg.setMarkiert(false);
info(" loesche bisherigen Weg dorthin");
}
n.setWert(k.getIntWert()+ka.getGewicht());
if(!toDo.contains(n)) toDo.add(n);
ka.setMarkiert(true);
n.setBesucht(true);
info(" setze Entfernung "+(n.getDoubleWert())+" und füge ggf. ToDo-Liste hinzu.");
info(" toDo-Liste hat jetzt "+toDo.size()+" Elemente");
} else {
info(" keine neue beste Entfernung");
ka.setGeloescht(true);
}
}
}
infoIndentLess();
infoIndentLess();
step();
}
info("ToDo-Liste fertig abgearbeitet");
} // end
// Ende Methoden
}