mirror of
https://codeberg.org/qg-info-unterricht/zpg-graphentester.git
synced 2026-03-24 20:48:26 +01:00
87 lines
3 KiB
Java
87 lines
3 KiB
Java
package algorithmen;
|
|
|
|
import java.util.List;
|
|
import java.util.Collections;
|
|
import java.nio.file.*;
|
|
|
|
import graph.*;
|
|
/**
|
|
* Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen.
|
|
* Algorithmus: Bellman-Ford
|
|
*
|
|
* @version 7.1 from 12.02.2025
|
|
* @author Thomas Schaller
|
|
*/
|
|
|
|
public class GraphAlgo_BellmanFord extends GraphAlgo {
|
|
|
|
// Anfang Attribute
|
|
|
|
public String getBezeichnung() {
|
|
return "Kürzester Pfad (Bellman-Ford)";
|
|
}
|
|
|
|
private String knoteninfo(Knoten k) {
|
|
if (!k.getInfotext().equals("")) {
|
|
return k.getInfotext()+" (Wert "+k.getDoubleWert()+")";
|
|
} else {
|
|
return "Knoten Nr. "+g.getNummer(k)+" (Wert "+k.getDoubleWert()+")";
|
|
}
|
|
}
|
|
|
|
public void 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;
|
|
}
|
|
|
|
getStartKnoten().setWert(0);
|
|
info("Setze Startknoten auf Entfernung 0");
|
|
step();
|
|
for(int i = 0; i < g.getAnzahlKnoten()-1; i++) {
|
|
info(""+i+". Durchgang");
|
|
infoIndentMore();
|
|
for(Kante k: g.getAlleKanten()) {
|
|
info("Kante von "+knoteninfo(k.getStart())+" nach "+knoteninfo(k.getZiel()));
|
|
Knoten von = k.getStart();
|
|
Knoten nach = k.getZiel();
|
|
if(von.getDoubleWert()+k.getGewicht() < nach.getDoubleWert()){
|
|
nach.setWert(von.getDoubleWert()+k.getGewicht());
|
|
List<Kante> alterWeg = g.getEingehendeKanten(nach, ka -> ka.isMarkiert());
|
|
if(alterWeg.size()>0) alterWeg.get(0).setMarkiert(false);
|
|
info("Neue Entfernung für "+knoteninfo(nach)+":"+nach.getDoubleWert());
|
|
k.setMarkiert(true);
|
|
}
|
|
if(!g.isGerichtet() && nach.getDoubleWert()+k.getGewicht() < von.getDoubleWert()){
|
|
von.setWert(nach.getDoubleWert()+k.getGewicht());
|
|
info("Neue Entfernung für "+knoteninfo(von)+":"+von.getDoubleWert());
|
|
List<Kante> alterWeg = g.getEingehendeKanten(von, ka -> ka.isMarkiert());
|
|
if(alterWeg.size()>0) alterWeg.get(0).setMarkiert(false);
|
|
k.setMarkiert(true);
|
|
}
|
|
step();
|
|
}
|
|
infoIndentLess();
|
|
step();
|
|
}
|
|
info("Zyklenkontrolle");
|
|
for(Kante k: g.getAlleKanten()) {
|
|
if(k.getStart().getDoubleWert()+k.getGewicht() < k.getZiel().getDoubleWert()){
|
|
melde("Es gibt einen Zyklus negativen Gewichts");
|
|
info("Es gibt einen Zyklus negativen Gewichts");
|
|
g.initialisiereAlleKnoten();
|
|
return;
|
|
}
|
|
}
|
|
step();
|
|
} // end of for
|
|
|
|
// Ende Methoden
|
|
}
|