Fehler beim Abbruch einer Simulation behoben

This commit is contained in:
Thomas Schaller 2025-02-12 09:00:02 +01:00
parent aa431abc4d
commit c254b039b3
47 changed files with 436 additions and 221 deletions

View file

@ -9,23 +9,23 @@ import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType; import javafx.scene.control.ButtonType;
import javafx.application.Platform; import javafx.application.Platform;
/** /**
* *
* description * Abstrakte Oberklasse für alle zu simulierende Algorithmen
* Diese müssen die Methode getBezeichnung(): String und fuehreAlgorithmusAus() überschreiben.
* *
* @version 1.0 from 26.04.2019 * @version 6.7 (Dez. 2020)
* @author * @author Thomas Schaller
*/ */
public abstract class GraphAlgo extends Thread { public abstract class GraphAlgo extends Thread {
// Anfang Attribute // Anfang Attribute
private boolean stepping; private boolean stepping; // Einzelschrittmodus
private boolean waitforrepaint; private boolean waitforrepaint; // wird gerade gezeichnet (=> nicht nochmal zeichnen beauftragen)
private boolean waitforclick; private boolean waitforclick; // wird auf Klick für nächsten Step gewartet
protected boolean inArbeit; protected boolean inArbeit;
private GraphPlotter gp; protected GraphPlotter gp;
private Knoten startKnoten; private Knoten startKnoten;
private int speed =100; private int speed =100;
private Hilfe hilfe; private Hilfe hilfe;
@ -34,6 +34,9 @@ public abstract class GraphAlgo extends Thread {
// Ende Attribute // Ende Attribute
// Anfang Methoden // Anfang Methoden
/**
* Erzeugt neues Algorithmus-Objekt
*/
public GraphAlgo() { public GraphAlgo() {
stepping = true; stepping = true;
waitforrepaint = false; waitforrepaint = false;
@ -42,31 +45,53 @@ public abstract class GraphAlgo extends Thread {
setDaemon(true); setDaemon(true);
} }
/**
* Setzt die Referenz auf die GraphAnzeige und das Hilfefenster
* @param graphPlotter
* @param hilfe
*/
public void setGUIElemente(GraphPlotter graphPlotter, Hilfe hilfe) { public void setGUIElemente(GraphPlotter graphPlotter, Hilfe hilfe) {
gp = graphPlotter; gp = graphPlotter;
g = gp.getGraph(); g = gp.getGraph();
this.hilfe = hilfe; this.hilfe = hilfe;
if (hilfe != null) hilfe.setGraphPlotter(gp); if (hilfe != null) hilfe.setGraphPlotter(gp);
} }
/**
* Setzt Referenz auf den Graphen
* @param g Graph auf den der Algorithmus angewendet wird
*/
public void setGraph(Graph g) { public void setGraph(Graph g) {
this.g = g; this.g = g;
gp = null; gp = null;
hilfe = null; hilfe = null;
} }
/**
* Gibt Referenz auf den Graphen zurück
* @return g Graph, auf den der Algorithmus angewendet wird
*/
public Graph getGraph() {
return g;
}
/**
* Muss vom Algorithmus aufgerufen werden, um einen Haltepunkt zu setzen
*/
public void step() { public void step() {
if(gp == null) return; if(gp == null) return;
try{ try{
//System.out.println("Step");
gp.updateImage(); gp.updateImage();
aktuellerZustand = g.getStatus(); aktuellerZustand = g.getStatus();
waitforclick = true; waitforclick = true;
if (hilfe != null) hilfe.setReviewAllowed(true); if (hilfe != null) hilfe.setReviewAllowed(true);
int i = 0; int i = 0;
while((waitforclick && (stepping || i*10 < speed)) && !isInterrupted()){ while((waitforclick && (stepping || i*10 < speed)) && !isInterrupted()){
Thread.sleep(10); Thread.sleep(10);
i++; i++;
} }
if (hilfe != null) hilfe.setReviewAllowed(false); if (hilfe != null) hilfe.setReviewAllowed(false);
g.setStatus(aktuellerZustand); g.setStatus(aktuellerZustand);
aktuellerZustand = null; aktuellerZustand = null;
@ -76,30 +101,41 @@ public abstract class GraphAlgo extends Thread {
} }
} }
public boolean getWaitforrepaint() { /**
return waitforrepaint; * Wird gerade auf einen Buttonklick für den nächsten Step gewartet?
} * @return true/false
*/
public void setWaitforrepaint(boolean waitforrepaintNeu) {
waitforrepaint = waitforrepaintNeu;
}
public boolean getWaitforclick() { public boolean getWaitforclick() {
return waitforclick; return waitforclick;
} }
/**
* Setzt, ob gewartet wird. Damit kann übermittelt werden, dass der Button gedrückt wurde
* @param wairforclickNeu Soll weiter gewartet werden?
*/
public void setWaitforclick(boolean waitforclickNeu) { public void setWaitforclick(boolean waitforclickNeu) {
waitforclick = waitforclickNeu; waitforclick = waitforclickNeu;
} }
/**
* Setzt, ob im Einzelschrittmodus ausgeführt werden soll
* @param stepping true/false
*/
public void setStepping(boolean stepping) { public void setStepping(boolean stepping) {
this.stepping = stepping; this.stepping = stepping;
} }
/**
* Setzt die Wartezeit im automatischen Modus
* @param delay Wartezeit
*/
public void setSpeed(int delay) { public void setSpeed(int delay) {
this.speed = delay; this.speed = delay;
} }
/**
* Ausführung des Algorithmus
*/
public void run() public void run()
{ {
if(!inArbeit && gp != null) if(!inArbeit && gp != null)
@ -109,9 +145,10 @@ public abstract class GraphAlgo extends Thread {
try{ try{
if (hilfe != null) hilfe.setReviewAllowed(false); if (hilfe != null) hilfe.setReviewAllowed(false);
fuehreAlgorithmusAus(); fuehreAlgorithmusAus();
gp.updateImage();
// System.out.println("Algorithmus beendet"); // System.out.println("Algorithmus beendet");
} catch( ThreadDeath e){ } catch( ThreadDeath e){
// System.out.println("Algorithmus vorzeitig beendet."); // System.out.println("Algorithmus vorzeitig beendet."+e);
} }
if (hilfe != null) hilfe.setReviewAllowed(true); if (hilfe != null) hilfe.setReviewAllowed(true);
inArbeit = false; inArbeit = false;
@ -124,10 +161,18 @@ public abstract class GraphAlgo extends Thread {
} }
// Ende Methoden // Ende Methoden
/**
* Setzen des Startknotens
* @param k Startknoten
*/
public void setStartKnoten(Knoten k) { public void setStartKnoten(Knoten k) {
startKnoten = k; startKnoten = k;
} }
/**
* Abfragen des Startknotens für den Algorithmus
* @return gesetzter Startknoten oder Knoten Nr. 0
*/
public Knoten getStartKnoten() { public Knoten getStartKnoten() {
if (startKnoten != null) { if (startKnoten != null) {
return startKnoten; return startKnoten;
@ -136,37 +181,79 @@ public abstract class GraphAlgo extends Thread {
} // end of if-else } // end of if-else
} }
/**
* Methode für den eigentlichen Algorithmus
*/
public abstract void fuehreAlgorithmusAus(); public abstract void fuehreAlgorithmusAus();
/**
* Name des Algorithmus für die Dropdown-Auswahl
*/
public abstract String getBezeichnung(); public abstract String getBezeichnung();
/**
* Öffnet ein Anzeigefenster mit einer Meldung. Die
* Meldung wird ggf. auch im Hilfefenster angezeigt.
* Ist für die Verwendung im Algorithmus gedacht.
* @param s Meldung
*/
public void melde(String s) { public void melde(String s) {
info(s); info(s);
Platform.runLater(() -> { Platform.runLater(() -> {
Alert meldung = new Alert(AlertType.INFORMATION, s, ButtonType.OK); Alert meldung = new Alert(AlertType.INFORMATION, s, ButtonType.OK);
meldung.setTitle("Information"); meldung.setTitle("Information");
meldung.setHeaderText(null); meldung.setHeaderText(null);
meldung.showAndWait(); meldung.showAndWait();
}); });
} }
/**
* Text in das Hilfefenster einfügen
* Ist für die Verwendung im Algorithmus gedacht.
* @param s Hilfetext
*/
public void info(String s) { public void info(String s) {
if(hilfe != null) hilfe.append(s+"\n"); if(hilfe != null) hilfe.append(s+"\n");
} }
/**
* Löscht das Hilfefenster
*/
public void resetInfo() { public void resetInfo() {
if(hilfe != null) hilfe.loescheAlles(); if(hilfe != null) hilfe.loescheAlles();
} }
/**
* Rückt im Hilfefenster eine Ebene tiefer ein.
* Ist für die Verwendung im Algorithmus gedacht.
*/
public void infoIndentMore() { public void infoIndentMore() {
if(hilfe != null) hilfe.indentMore(); if(hilfe != null) hilfe.indentMore();
} }
/**
* Rückt im Hilfefenster eine Ebene aus.
* Ist für die Verwendung im Algorithmus gedacht.
*/
public void infoIndentLess() { public void infoIndentLess() {
if(hilfe != null) hilfe.indentLess(); if(hilfe != null) hilfe.indentLess();
} }
/**
* Initialisiert den Graphen
*/
public void init() {
gp.getGraphOptions().knotenKurztext = new String[]{"Wert"};
gp.getGraphOptions().knotenLangtext = new String[]{"Infotext","Wert","Markiert","Besucht"};
if(g.isGewichtet()) {
gp.getGraphOptions().kanteKurztext = new String[]{"Gewicht"};
gp.getGraphOptions().kanteLangtext = new String[]{"Gewicht","Markiert","Gelöscht"};
} else {
gp.getGraphOptions().kanteKurztext = new String[]{};
gp.getGraphOptions().kanteLangtext = new String[]{"Markiert","Gelöscht"};
}
}
} }

View file

@ -29,15 +29,19 @@ public class GraphAlgo_BellmanFord extends GraphAlgo {
} }
} }
public void init() {
for(Knoten k : g.getAlleKnoten()) {
k.setWert(Double.POSITIVE_INFINITY);
}
info("Setze alle Entfernungen auf unendlich");
}
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }
for(Knoten k : g.getAlleKnoten()) {
k.setWert(1000);
}
info("Setze alle Entfernungen auf unendlich (1000)");
getStartKnoten().setWert(0); getStartKnoten().setWert(0);
info("Setze Startknoten auf Entfernung 0"); info("Setze Startknoten auf Entfernung 0");
step(); step();

View file

@ -22,6 +22,13 @@ public class GraphAlgo_Dijkstra extends GraphAlgo {
return "Kürzester Pfad (Dijkstra)"; 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 // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() {
@ -50,13 +57,10 @@ public class GraphAlgo_Dijkstra extends GraphAlgo {
if(!n.isMarkiert()){ if(!n.isMarkiert()){
info("- ist noch nicht markiert"); info("- ist noch nicht markiert");
Kante ka = g.getKante(k, n); Kante ka = g.getKante(k, n);
if(!n.isBesucht() || n.getDoubleWert() > k.getDoubleWert()+ka.getGewicht()){ if(n.getDoubleWert() > k.getDoubleWert()+ka.getGewicht()){
if(n.isBesucht()) { if(n.isBesucht()) {
List<Kante> eingehend = g.getEingehendeKanten(n, ka2 -> !ka2.isGeloescht() && ka2.isMarkiert()); List<Kante> eingehend = g.getEingehendeKanten(n, ka2 -> !ka2.isGeloescht() && ka2.isMarkiert());
Kante alterWeg = eingehend.get(0); Kante alterWeg = eingehend.get(0);
// Kante alterWeg = g.beschraenkeKantenAuf(g.getEingehendeKanten(n), Graph.MARKIERT, Graph.NICHTGELOESCHT).get(0);
// alterWeg.setGeloescht(true);
// alterWeg.setMarkiert(false);
alterWeg.setGeloescht(true); alterWeg.setGeloescht(true);
alterWeg.setMarkiert(false); alterWeg.setMarkiert(false);

View file

@ -0,0 +1,109 @@
package algorithmen;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.nio.file.*;
import java.util.Arrays;
import graph.*;
/**
* Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen.
* Algorithmus: Dijkstra
*
* @version 1.0 from 10.12.2020
* @author Thomas Schaller
*/
public class GraphAlgo_DijkstraMitVorgaenger extends GraphAlgo {
// Anfang Attribute
public String getBezeichnung() {
return "Kürzester Pfad (Dijkstra mit Vorgänger)";
}
public void init() {
List<Knoten> alle = g.getAlleKnoten();
for(Knoten k : alle) {
k.set("Vorgänger","-");
k.set("Entfernung",Double.POSITIVE_INFINITY);
k.setSortierkriterium("Entfernung");
}
gp.getGraphOptions().knotenKurztext = new String[]{"Entfernung","Vorgänger"};
gp.getGraphOptions().knotenLangtext = new String[]{"Infotext","Entfernung","Vorgänger","Markiert","Besucht"};
}
public void fuehreAlgorithmusAus() {
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().set("Entfernung", 0);
toDo.add(getStartKnoten());
while(toDo.size()>0) {
info("Sortiere toDo-Liste nach der Entfernung");
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.getString("Entfernung"));
info("Für jeden Nachbarknoten");
infoIndentMore();
for(Knoten n : g.getNachbarknoten(k)) {
if(!n.isMarkiert()){
if(!n.getInfotext().isEmpty()) {
info("- "+n.getInfotext()+" ist noch nicht markiert");
} else {
info("- Knoten Nr. "+g.getNummer(n)+" ist noch nicht markiert");
}
Kante ka = g.getKante(k, n);
if(!n.isBesucht() || n.getDouble("Entfernung") > k.getDouble("Entfernung") + ka.getGewicht()){
if(n.isBesucht()) {
List<Kante> eingehend = g.getEingehendeKanten(n, ka2 -> !ka2.isGeloescht() && ka2.isMarkiert());
Kante alterWeg = eingehend.get(0);
// Kante alterWeg = g.beschraenkeKantenAuf(g.getEingehendeKanten(n), Graph.MARKIERT, Graph.NICHTGELOESCHT).get(0);
// alterWeg.setGeloescht(true);
// alterWeg.setMarkiert(false);
alterWeg.setGeloescht(true);
alterWeg.setMarkiert(false);
info(" loesche bisherigen Weg dorthin");
}
n.set("Entfernung", k.getInt("Entfernung")+ka.getGewicht());
if(k.getInfotext().equals("")) {
n.set("Vorgänger",g.getNummer(k));
} else {
n.set("Vorgänger",k.getInfotext());
}
if(!toDo.contains(n)) toDo.add(n);
ka.setMarkiert(true);
n.setBesucht(true);
info(" setze Entfernung "+n.getString("Entfernung")+" 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
}

View file

@ -43,26 +43,28 @@ public class GraphAlgo_toplogischeSortierung extends GraphAlgo {
info("Sortiere die noch nicht markierten Knoten nach ihrem Wert"); info("Sortiere die noch nicht markierten Knoten nach ihrem Wert");
Knoten k = knoten.get(0); Knoten k = knoten.get(0);
k.setMarkiert(true); k.setMarkiert(true);
info("Nimm Knoten "+g.getKnoteninfo(k,false)+" und markiere ihn."); info("Nimm Knoten mit dem geringsten Wert: "+g.getKnoteninfo(k,false)+" und markiere ihn.");
if(k.getIntWert() != 0) { if(k.getIntWert() != 0) {
melde("Fehler: Wert ist nicht 0 - Zyklus vorhanden"); melde("Fehler: Wert ist nicht 0 - Zyklus vorhanden - Keine topologische Sortierung möglich");
knoten.clear(); knoten.clear();
return; return;
} else { } else {
reihenfolge += " "+g.getKnoteninfo(k, false); reihenfolge += " "+g.getKnoteninfo(k, false);
info("Füge ihn der Liste hinzu: "+reihenfolge); info("Füge ihn der Liste hinzu: "+reihenfolge);
knoten.remove(k); knoten.remove(k);
info("Reduziere den Wert aller Nachbarn von "+g.getKnoteninfo(k,false)+" um 1");
infoIndentMore();
for(Knoten k2 : g.getNachbarknoten(k)) { for(Knoten k2 : g.getNachbarknoten(k)) {
k2.setWert(k2.getIntWert()-1); k2.setWert(k2.getIntWert()-1);
info("Setze "+g.getKnoteninfo(k2, false)+" auf "+k2.getIntWert());
} }
info("Reduziere den Wert aller Nachbarn von Knoten "+g.getNummer(k)+" um 1"); infoIndentLess();
} }
step(); step();
} }
melde("Topologische Sortierung: "+reihenfolge); melde("Topologische Sortierung: "+reihenfolge);
} // end } // end
// Ende Methoden // Ende Methoden

View file

@ -1,20 +1,20 @@
#BlueJ package file #BlueJ package file
dependency1.from=GraphAlgo_DominatingSetGreedyE dependency1.from=GraphAlgo_DominatingSetGreedyF
dependency1.to=GraphAlgo dependency1.to=GraphAlgo
dependency1.type=UsesDependency dependency1.type=UsesDependency
dependency2.from=GraphAlgo_DominatingSetGreedyE dependency2.from=GraphAlgo_DominatingSetGreedyF
dependency2.to=GraphAlgo_Moore dependency2.to=GraphAlgo_Moore
dependency2.type=UsesDependency dependency2.type=UsesDependency
dependency3.from=GraphAlgo_DominatingSetGreedyF dependency3.from=GraphAlgo_DominatingSetGreedyG
dependency3.to=GraphAlgo dependency3.to=GraphAlgo
dependency3.type=UsesDependency dependency3.type=UsesDependency
dependency4.from=GraphAlgo_DominatingSetGreedyF dependency4.from=GraphAlgo_DominatingSetGreedyG
dependency4.to=GraphAlgo_Moore dependency4.to=GraphAlgo_Moore
dependency4.type=UsesDependency dependency4.type=UsesDependency
dependency5.from=GraphAlgo_DominatingSetGreedyG dependency5.from=GraphAlgo_DominatingSetGreedyE
dependency5.to=GraphAlgo dependency5.to=GraphAlgo
dependency5.type=UsesDependency dependency5.type=UsesDependency
dependency6.from=GraphAlgo_DominatingSetGreedyG dependency6.from=GraphAlgo_DominatingSetGreedyE
dependency6.to=GraphAlgo_Moore dependency6.to=GraphAlgo_Moore
dependency6.type=UsesDependency dependency6.type=UsesDependency
dependency7.from=GraphAlgo_DominatingSetGreedyH dependency7.from=GraphAlgo_DominatingSetGreedyH
@ -23,18 +23,18 @@ dependency7.type=UsesDependency
dependency8.from=GraphAlgo_DominatingSetGreedyH dependency8.from=GraphAlgo_DominatingSetGreedyH
dependency8.to=GraphAlgo_Moore dependency8.to=GraphAlgo_Moore
dependency8.type=UsesDependency dependency8.type=UsesDependency
objectbench.height=133 objectbench.height=66
objectbench.width=750 objectbench.width=1428
package.divider.horizontal=0.6003172085646312 package.divider.horizontal=0.6003172085646312
package.divider.vertical=0.8309178743961353 package.divider.vertical=0.9027962716378163
package.editor.height=668 package.editor.height=671
package.editor.width=1133 package.editor.width=1292
package.editor.x=533 package.editor.x=100
package.editor.y=122 package.editor.y=118
package.frame.height=928 package.frame.height=852
package.frame.width=1297 package.frame.width=1452
package.numDependencies=8 package.numDependencies=8
package.numTargets=31 package.numTargets=32
package.showExtends=true package.showExtends=true
package.showUses=true package.showUses=true
readme.height=60 readme.height=60
@ -46,216 +46,223 @@ target1.height=50
target1.name=GraphAlgo_ColoringGreedyRandom target1.name=GraphAlgo_ColoringGreedyRandom
target1.showInterface=false target1.showInterface=false
target1.type=ClassTarget target1.type=ClassTarget
target1.width=250 target1.width=290
target1.x=600 target1.x=740
target1.y=590 target1.y=590
target10.height=50 target10.height=50
target10.name=GraphAlgo_DominatingSetGreedyF target10.name=GraphAlgo_DominatingSetGreedyF
target10.showInterface=false target10.showInterface=false
target10.type=ClassTarget target10.type=ClassTarget
target10.width=240 target10.width=280
target10.x=290 target10.x=430
target10.y=420 target10.y=420
target11.height=50 target11.height=50
target11.name=GraphAlgo_DominatingSetGreedyG target11.name=GraphAlgo_DominatingSetGreedyG
target11.showInterface=false target11.showInterface=false
target11.type=ClassTarget target11.type=ClassTarget
target11.width=250 target11.width=290
target11.x=290 target11.x=430
target11.y=470 target11.y=470
target12.height=50 target12.height=50
target12.name=GraphAlgo_TSPGreedy target12.name=GraphAlgo_TSPGreedy
target12.showInterface=false target12.showInterface=false
target12.type=ClassTarget target12.type=ClassTarget
target12.width=230 target12.width=230
target12.x=600 target12.x=740
target12.y=160 target12.y=160
target13.height=50 target13.height=50
target13.name=GraphAlgo_DominatingSetGreedyD target13.name=GraphAlgo_DominatingSetGreedyD
target13.showInterface=false target13.showInterface=false
target13.type=ClassTarget target13.type=ClassTarget
target13.width=250 target13.width=290
target13.x=290 target13.x=430
target13.y=320 target13.y=320
target14.height=50 target14.height=50
target14.name=GraphAlgo_TSPGenetisch target14.name=GraphAlgo_TSPGenetisch
target14.showInterface=false target14.showInterface=false
target14.type=ClassTarget target14.type=ClassTarget
target14.width=230 target14.width=230
target14.x=600 target14.x=740
target14.y=340 target14.y=340
target15.height=50 target15.height=50
target15.name=GraphAlgo_DominatingSetGreedyE target15.name=GraphAlgo_DominatingSetGreedyE
target15.showInterface=false target15.showInterface=false
target15.type=ClassTarget target15.type=ClassTarget
target15.width=240 target15.width=280
target15.x=290 target15.x=430
target15.y=370 target15.y=370
target16.height=50 target16.height=50
target16.name=GraphAlgo_DominatingSetGenetisch target16.name=GraphAlgo_DominatingSetGenetisch
target16.showInterface=false target16.showInterface=false
target16.type=ClassTarget target16.type=ClassTarget
target16.width=250 target16.width=300
target16.x=290 target16.x=430
target16.y=640 target16.y=640
target17.height=50 target17.height=50
target17.name=GraphAlgo_ZyklusBacktracking target17.name=GraphAlgo_ZyklusBacktracking
target17.showInterface=false target17.showInterface=false
target17.type=ClassTarget target17.type=ClassTarget
target17.width=220 target17.width=230
target17.x=20 target17.x=160
target17.y=640 target17.y=410
target18.height=50 target18.height=50
target18.name=GraphAlgo_DominatingSetGreedyH target18.name=GraphAlgo_DominatingSetGreedyH
target18.showInterface=false target18.showInterface=false
target18.type=ClassTarget target18.type=ClassTarget
target18.width=250 target18.width=290
target18.x=290 target18.x=430
target18.y=520 target18.y=520
target19.height=50 target19.height=50
target19.name=GraphAlgo_DominatingSetGreedyI target19.name=GraphAlgo_DominatingSetGreedyI
target19.showInterface=false target19.showInterface=false
target19.type=ClassTarget target19.type=ClassTarget
target19.width=240 target19.width=280
target19.x=290 target19.x=430
target19.y=570 target19.y=570
target2.height=50 target2.height=50
target2.name=GraphAlgo_Tiefensuche target2.name=GraphAlgo_Tiefensuche
target2.showInterface=false target2.showInterface=false
target2.type=ClassTarget target2.type=ClassTarget
target2.width=210 target2.width=210
target2.x=20 target2.x=160
target2.y=170 target2.y=160
target20.height=50 target20.height=50
target20.name=GraphAlgo_Moore target20.name=GraphAlgo_Moore
target20.showInterface=false target20.showInterface=false
target20.type=ClassTarget target20.type=ClassTarget
target20.width=210 target20.width=210
target20.x=20 target20.x=150
target20.y=440 target20.y=480
target21.height=50 target21.height=50
target21.name=GraphAlgo_BellmanFord target21.name=GraphAlgo_BellmanFord
target21.showInterface=false target21.showInterface=false
target21.type=ClassTarget target21.type=ClassTarget
target21.width=210 target21.width=210
target21.x=20 target21.x=150
target21.y=560 target21.y=660
target22.height=50 target22.height=50
target22.name=GraphAlgo_Breitensuche target22.name=GraphAlgo_Breitensuche
target22.showInterface=false target22.showInterface=false
target22.type=ClassTarget target22.type=ClassTarget
target22.width=210 target22.width=210
target22.x=20 target22.x=160
target22.y=290 target22.y=280
target23.height=50 target23.height=50
target23.name=GraphAlgo_toplogischeSortierung target23.name=GraphAlgo_toplogischeSortierung
target23.showInterface=false target23.showInterface=false
target23.type=ClassTarget target23.type=ClassTarget
target23.width=240 target23.width=250
target23.x=20 target23.x=160
target23.y=370 target23.y=350
target24.height=50 target24.height=50
target24.name=GraphAlgo_DominatingSetBacktracking target24.name=GraphAlgo_DominatingSetBacktracking
target24.showInterface=false target24.showInterface=false
target24.type=ClassTarget target24.type=ClassTarget
target24.width=270 target24.width=320
target24.x=290 target24.x=430
target24.y=100 target24.y=100
target25.height=50 target25.height=50
target25.name=GraphAlgo_ColoringGreedy target25.name=GraphAlgo_ColoringGreedy
target25.showInterface=false target25.showInterface=false
target25.type=ClassTarget target25.type=ClassTarget
target25.width=240 target25.width=240
target25.x=600 target25.x=740
target25.y=530 target25.y=530
target26.height=50 target26.height=50
target26.name=GraphAlgo_EulerkreisExistenz target26.name=GraphAlgo_DijkstraMitVorgaenger
target26.showInterface=false target26.showInterface=false
target26.type=ClassTarget target26.type=ClassTarget
target26.width=210 target26.width=250
target26.x=20 target26.x=150
target26.y=100 target26.y=600
target27.height=50 target27.height=50
target27.name=GraphAlgo_TiefensucheRek target27.name=GraphAlgo_EulerkreisExistenz
target27.showInterface=false target27.showInterface=false
target27.type=ClassTarget target27.type=ClassTarget
target27.width=210 target27.width=220
target27.x=20 target27.x=160
target27.y=230 target27.y=100
target28.height=50 target28.height=50
target28.name=GraphAlgo_TSPGreedy2 target28.name=GraphAlgo_TiefensucheRek
target28.showInterface=false target28.showInterface=false
target28.type=ClassTarget target28.type=ClassTarget
target28.width=230 target28.width=210
target28.x=600 target28.x=160
target28.y=220 target28.y=220
target29.height=50 target29.height=50
target29.name=GraphAlgo_ColoringBacktracking target29.name=GraphAlgo_TSPGreedy2
target29.showInterface=false target29.showInterface=false
target29.type=ClassTarget target29.type=ClassTarget
target29.width=240 target29.width=230
target29.x=600 target29.x=740
target29.y=470 target29.y=220
target3.height=50 target3.height=50
target3.name=GraphAlgo_MST_Prim target3.name=GraphAlgo_TSPBacktracking
target3.showInterface=false target3.showInterface=false
target3.type=ClassTarget target3.type=ClassTarget
target3.width=230 target3.width=240
target3.x=890 target3.x=740
target3.y=100 target3.y=100
target30.height=50 target30.height=50
target30.name=GraphAlgo_Dijkstra target30.name=GraphAlgo_ColoringBacktracking
target30.showInterface=false target30.showInterface=false
target30.type=ClassTarget target30.type=ClassTarget
target30.width=210 target30.width=270
target30.x=20 target30.x=740
target30.y=500 target30.y=470
target31.height=50 target31.height=50
target31.name=GraphAlgo_TSPGreedyOpt target31.name=GraphAlgo_Dijkstra
target31.showInterface=false target31.showInterface=false
target31.type=ClassTarget target31.type=ClassTarget
target31.width=230 target31.width=210
target31.x=600 target31.x=150
target31.y=280 target31.y=540
target32.height=50
target32.name=GraphAlgo_TSPGreedyOpt
target32.showInterface=false
target32.type=ClassTarget
target32.width=230
target32.x=740
target32.y=280
target4.height=50 target4.height=50
target4.name=GraphAlgo_TSPBacktracking target4.name=GraphAlgo_MST_Prim
target4.showInterface=false target4.showInterface=false
target4.type=ClassTarget target4.type=ClassTarget
target4.width=230 target4.width=230
target4.x=600 target4.x=1030
target4.y=100 target4.y=100
target5.height=50 target5.height=50
target5.name=GraphAlgo_DominatingSetGreedyB target5.name=GraphAlgo_DominatingSetGreedyB
target5.showInterface=false target5.showInterface=false
target5.type=ClassTarget target5.type=ClassTarget
target5.width=240 target5.width=290
target5.x=290 target5.x=430
target5.y=220 target5.y=220
target6.height=50 target6.height=50
target6.name=GraphAlgo target6.name=GraphAlgo
target6.showInterface=false target6.showInterface=false
target6.type=AbstractTarget target6.type=AbstractTarget
target6.width=90 target6.width=100
target6.x=310 target6.x=450
target6.y=10 target6.y=10
target7.height=50 target7.height=50
target7.name=GraphAlgo_DominatingSetGreedyC target7.name=GraphAlgo_DominatingSetGreedyC
target7.showInterface=false target7.showInterface=false
target7.type=ClassTarget target7.type=ClassTarget
target7.width=240 target7.width=290
target7.x=290 target7.x=430
target7.y=270 target7.y=270
target8.height=50 target8.height=50
target8.name=GraphAlgo_MST_Kruskal target8.name=GraphAlgo_MST_Kruskal
target8.showInterface=false target8.showInterface=false
target8.type=ClassTarget target8.type=ClassTarget
target8.width=230 target8.width=230
target8.x=890 target8.x=1030
target8.y=160 target8.y=160
target9.height=50 target9.height=50
target9.name=GraphAlgo_DominatingSetGreedyA target9.name=GraphAlgo_DominatingSetGreedyA
target9.showInterface=false target9.showInterface=false
target9.type=ClassTarget target9.type=ClassTarget
target9.width=250 target9.width=290
target9.x=290 target9.x=430
target9.y=170 target9.y=170

View file

@ -3,7 +3,7 @@ showWeights,0
# Knoteninfo anzeigen 1,Knoteninfo nicht anzeigen 0 # Knoteninfo anzeigen 1,Knoteninfo nicht anzeigen 0
showInfoText,1 showInfoText,1
# Knoten leer 0, Knotenname anzeigen 1, Wert des Knoten anzeigen 2 # Knoten leer 0, Knotenname anzeigen 1, Wert des Knoten anzeigen 2
vertexStyle,2 vertexStyle,1
# Bild im Hintergrund (bitte im "images"-Ordner ablegen) --> Dateiname angeben. Fall kein Bild bitte 0 schreiben! # Bild im Hintergrund (bitte im "images"-Ordner ablegen) --> Dateiname angeben. Fall kein Bild bitte 0 schreiben!
image,siedler.png image,siedler.png
# #
@ -16,12 +16,12 @@ directed,1
# Jede Zeile steht fuer einen Knoten, durch Komma getrennt steht der adjazente Knoten mit dem zugehoerigen Kantengewicht. # Jede Zeile steht fuer einen Knoten, durch Komma getrennt steht der adjazente Knoten mit dem zugehoerigen Kantengewicht.
list,infotext list,infotext
Farm,285,101,1,3 Farm,285,101,1,3
Mühle,531,105,2 Mühle,531,105,2
Bäckerei,694,159 Bäckerei,694,159
Schweinefarm,119,239,4 Schweinefarm,119,239,4
Metzger,167,409 Metzger,167,409
Kohlemine,423,445,7,8 Kohlemine,423,445,7,8
Erzmine,724,314,7 Erzmine,724,314,7
Eisenschmelze,537,326,8 Eisenschmelze,537,326,8
Werkzeugmacher,389,246,0,4 Werkzeugmacher,389,246,0,4
Fischerhütte,741,456,6,5 Fischerhütte,741,456,6,5
Can't render this file because it contains an unexpected character in line 7 and column 33.

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

View file

@ -14,7 +14,7 @@ import javafx.application.Platform;
* Abstrakte Oberklasse für alle zu simulierende Algorithmen * Abstrakte Oberklasse für alle zu simulierende Algorithmen
* Diese müssen die Methode getBezeichnung(): String und fuehreAlgorithmusAus() überschreiben. * Diese müssen die Methode getBezeichnung(): String und fuehreAlgorithmusAus() überschreiben.
* *
* @version 6.7 (Dez. 2020) * @version 7.1 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -78,10 +78,9 @@ public abstract class GraphAlgo extends Thread {
/** /**
* Muss vom Algorithmus aufgerufen werden, um einen Haltepunkt zu setzen * Muss vom Algorithmus aufgerufen werden, um einen Haltepunkt zu setzen
*/ */
public void step() { public void step() throws InterruptedException {
if(gp == null) return; if(gp == null) return;
try{ try{
//System.out.println("Step");
gp.updateImage(); gp.updateImage();
aktuellerZustand = g.getStatus(); aktuellerZustand = g.getStatus();
waitforclick = true; waitforclick = true;
@ -95,9 +94,13 @@ public abstract class GraphAlgo extends Thread {
if (hilfe != null) hilfe.setReviewAllowed(false); if (hilfe != null) hilfe.setReviewAllowed(false);
g.setStatus(aktuellerZustand); g.setStatus(aktuellerZustand);
aktuellerZustand = null; aktuellerZustand = null;
if(Thread.interrupted()){
throw new InterruptedException();
}
}catch(Exception e) { }catch(Exception e) {
// Erneutes Stop, damit nicht stop während des Sleeps hier abgefangen wird. // Erneutes Stop, damit nicht stop während des Sleeps hier abgefangen wird.
stop(); //System.out.println("Step wurde unterbrochen");
throw e;
} }
} }
@ -146,17 +149,13 @@ public abstract class GraphAlgo extends Thread {
if (hilfe != null) hilfe.setReviewAllowed(false); if (hilfe != null) hilfe.setReviewAllowed(false);
fuehreAlgorithmusAus(); fuehreAlgorithmusAus();
gp.updateImage(); gp.updateImage();
// System.out.println("Algorithmus beendet"); //System.out.println("Algorithmus beendet");
} catch( ThreadDeath e){ } catch( InterruptedException e){
// System.out.println("Algorithmus vorzeitig beendet."+e); //System.out.println("Algorithmus vorzeitig beendet."+e);
} finally {
if (hilfe != null) hilfe.setReviewAllowed(true);
inArbeit = false;
} }
if (hilfe != null) hilfe.setReviewAllowed(true);
inArbeit = false;
return;
}
else
{
return;
} }
} }
// Ende Methoden // Ende Methoden
@ -184,7 +183,7 @@ public abstract class GraphAlgo extends Thread {
/** /**
* Methode für den eigentlichen Algorithmus * Methode für den eigentlichen Algorithmus
*/ */
public abstract void fuehreAlgorithmusAus(); public abstract void fuehreAlgorithmusAus() throws InterruptedException;
/** /**
* Name des Algorithmus für die Dropdown-Auswahl * Name des Algorithmus für die Dropdown-Auswahl
@ -257,3 +256,4 @@ public abstract class GraphAlgo extends Thread {
} }
} }

View file

@ -9,7 +9,7 @@ import graph.*;
* Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen. * Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen.
* Algorithmus: Bellman-Ford * Algorithmus: Bellman-Ford
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -37,7 +37,7 @@ public class GraphAlgo_BellmanFord extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -10,7 +10,7 @@ import graph.*;
* Dieser Algorithmus nummeriert alle Knoten des Graphen. * Dieser Algorithmus nummeriert alle Knoten des Graphen.
* Algorithmus: Breitensuche mit ToDo-Liste (Schlange) * Algorithmus: Breitensuche mit ToDo-Liste (Schlange)
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -23,7 +23,7 @@ public class GraphAlgo_Breitensuche extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -10,7 +10,7 @@ import graph.*;
* die gleiche Farbe haben und möglichst wenige Farben benutzt werden. * die gleiche Farbe haben und möglichst wenige Farben benutzt werden.
* Algorithmus: Backtracking * Algorithmus: Backtracking
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -25,7 +25,7 @@ public class GraphAlgo_ColoringBacktracking extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }
@ -35,7 +35,7 @@ public class GraphAlgo_ColoringBacktracking extends GraphAlgo {
step(); step();
} }
private void bestimmeColoring(int benutzteFarben) { private void bestimmeColoring(int benutzteFarben) throws InterruptedException {
int min = Integer.MAX_VALUE; int min = Integer.MAX_VALUE;
List<Knoten> knoten = g.getAlleKnoten(k->k.getFarbe()<=0); List<Knoten> knoten = g.getAlleKnoten(k->k.getFarbe()<=0);

View file

@ -9,7 +9,7 @@ import graph.*;
* die gleiche Farbe haben und möglichst wenige Farben benutzt werden. * die gleiche Farbe haben und möglichst wenige Farben benutzt werden.
* Algorithmus: Näherungslösung mit Greedy-Algorithmus * Algorithmus: Näherungslösung mit Greedy-Algorithmus
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
public class GraphAlgo_ColoringGreedy extends GraphAlgo { public class GraphAlgo_ColoringGreedy extends GraphAlgo {
@ -26,7 +26,7 @@ public class GraphAlgo_ColoringGreedy extends GraphAlgo {
// Ende Attribute // Ende Attribute
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
List<Knoten> knoten = g.getAlleKnoten(); List<Knoten> knoten = g.getAlleKnoten();
info("Wiederhole für jeden Knoten"); info("Wiederhole für jeden Knoten");
for (Knoten aktuellerKnoten: knoten ) { for (Knoten aktuellerKnoten: knoten ) {

View file

@ -10,7 +10,7 @@ import graph.*;
* die gleiche Farbe haben und möglichst wenige Farben benutzt werden. * die gleiche Farbe haben und möglichst wenige Farben benutzt werden.
* Algorithmus: Näherungslösung mit Greedy-Algorithmus (Knotenreihenfolge zufällig) * Algorithmus: Näherungslösung mit Greedy-Algorithmus (Knotenreihenfolge zufällig)
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -28,7 +28,7 @@ public class GraphAlgo_ColoringGreedyRandom extends GraphAlgo {
// Ende Attribute // Ende Attribute
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
List<Knoten> knoten = g.getAlleKnoten(); List<Knoten> knoten = g.getAlleKnoten();
Collections.shuffle(knoten); Collections.shuffle(knoten);
info("Wiederhole für jeden Knoten"); info("Wiederhole für jeden Knoten");

View file

@ -10,7 +10,7 @@ import graph.*;
* Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen. * Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen.
* Algorithmus: Dijkstra * Algorithmus: Dijkstra
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -31,7 +31,7 @@ public class GraphAlgo_Dijkstra extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -11,7 +11,7 @@ import graph.*;
* Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen. * Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen.
* Algorithmus: Dijkstra * Algorithmus: Dijkstra
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -34,7 +34,7 @@ public class GraphAlgo_DijkstraMitVorgaenger extends GraphAlgo {
gp.getGraphOptions().knotenLangtext = new String[]{"Infotext","Entfernung","Vorgänger","Markiert","Besucht"}; gp.getGraphOptions().knotenLangtext = new String[]{"Infotext","Entfernung","Vorgänger","Markiert","Besucht"};
} }
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -10,7 +10,7 @@ import graph.*;
* und bestimmt den Zeitbedarf. * und bestimmt den Zeitbedarf.
* Algorithmus: Backtracking * Algorithmus: Backtracking
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -26,7 +26,7 @@ public class GraphAlgo_DominatingSetBacktracking extends GraphAlgo {
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
long starttime = System.currentTimeMillis(); long starttime = System.currentTimeMillis();
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
@ -41,7 +41,7 @@ public class GraphAlgo_DominatingSetBacktracking extends GraphAlgo {
private void bestimmeDominierendeMenge(int knoten) { private void bestimmeDominierendeMenge(int knoten) throws InterruptedException {
List<String> status = g.getStatus(); List<String> status = g.getStatus();
List<Knoten> markierte = g.getAlleKnoten(kn->kn.isMarkiert()); List<Knoten> markierte = g.getAlleKnoten(kn->kn.isMarkiert());

View file

@ -11,7 +11,7 @@ import graph.*;
* Dieser Algorithmus bestimmt die kleinste dominierende Menge in einem Graphen * Dieser Algorithmus bestimmt die kleinste dominierende Menge in einem Graphen
* und bestimmt den Zeitbedarf. * und bestimmt den Zeitbedarf.
* Algorithmus: Genetischer Algorithmus * Algorithmus: Genetischer Algorithmus
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -31,7 +31,7 @@ public class GraphAlgo_DominatingSetGenetisch extends GraphAlgo {
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
population = new int[popGroesse][g.getAnzahlKnoten()]; population = new int[popGroesse][g.getAnzahlKnoten()];
double[] bewertungen = new double[popGroesse]; double[] bewertungen = new double[popGroesse];
for(int i=0; i<popGroesse; i++) { for(int i=0; i<popGroesse; i++) {

View file

@ -14,7 +14,7 @@ import graph.*;
* Algorithmus: Greedy mit Strategie: * Algorithmus: Greedy mit Strategie:
* Nimm den Knoten mit den meisten Nachbarn * Nimm den Knoten mit den meisten Nachbarn
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -48,7 +48,7 @@ public class GraphAlgo_DominatingSetGreedyA extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -13,7 +13,7 @@ import graph.*;
* und bestimmt den Zeitbedarf. * und bestimmt den Zeitbedarf.
* Algorithmus: Greedy mit Strategie: * Algorithmus: Greedy mit Strategie:
* Nimm den Knoten mit den wenigsten Nachbarn * Nimm den Knoten mit den wenigsten Nachbarn
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -47,7 +47,7 @@ public class GraphAlgo_DominatingSetGreedyB extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -14,7 +14,7 @@ import graph.*;
* Algorithmus: Greedy mit Strategie: * Algorithmus: Greedy mit Strategie:
* Nimm den Knoten mit den meisten Nachbarn * Nimm den Knoten mit den meisten Nachbarn
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -29,7 +29,7 @@ public class GraphAlgo_DominatingSetGreedyC extends GraphAlgo {
/** Bestimmt besten Knoten nach Strategie: /** Bestimmt besten Knoten nach Strategie:
* Nimm den Knoten mit den meisten Nachbarn * Nimm den Knoten mit den meisten Nachbarn
*/ */
private Knoten bestimmeBesten() { private Knoten bestimmeBesten() {
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert()); List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert());
info("Wiederhole für jeden noch nicht markierten Knoten"); info("Wiederhole für jeden noch nicht markierten Knoten");
@ -49,7 +49,7 @@ public class GraphAlgo_DominatingSetGreedyC extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -14,7 +14,7 @@ import graph.*;
* Algorithmus: Greedy mit Strategie: * Algorithmus: Greedy mit Strategie:
* Nimm den Knoten mit den meisten Nachbarn * Nimm den Knoten mit den meisten Nachbarn
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -49,7 +49,7 @@ public class GraphAlgo_DominatingSetGreedyD extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -14,7 +14,7 @@ import graph.*;
* Algorithmus: Greedy mit Strategie: * Algorithmus: Greedy mit Strategie:
* ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat * ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -30,7 +30,7 @@ public class GraphAlgo_DominatingSetGreedyE extends GraphAlgo {
* ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat * ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
*/ */
private Knoten bestimmeBesten() { private Knoten bestimmeBesten() throws InterruptedException {
Random r= new Random(); Random r= new Random();
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() ); List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
@ -68,7 +68,7 @@ public class GraphAlgo_DominatingSetGreedyE extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -14,7 +14,7 @@ import graph.*;
* Algorithmus: Greedy mit Strategie: * Algorithmus: Greedy mit Strategie:
* ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat * ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -30,7 +30,7 @@ public class GraphAlgo_DominatingSetGreedyF extends GraphAlgo {
* ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat * ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
*/ */
private Knoten bestimmeBesten() { private Knoten bestimmeBesten() throws InterruptedException {
Random r= new Random(); Random r= new Random();
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() ); List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
@ -68,7 +68,7 @@ public class GraphAlgo_DominatingSetGreedyF extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -14,7 +14,7 @@ import graph.*;
* Algorithmus: Greedy mit Strategie: * Algorithmus: Greedy mit Strategie:
* ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat * ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -30,7 +30,7 @@ public class GraphAlgo_DominatingSetGreedyG extends GraphAlgo {
* ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat * ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
*/ */
private Knoten bestimmeBesten() { private Knoten bestimmeBesten() throws InterruptedException {
Random r= new Random(); Random r= new Random();
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() ); List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
@ -68,7 +68,7 @@ public class GraphAlgo_DominatingSetGreedyG extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -14,7 +14,7 @@ import graph.*;
* Algorithmus: Greedy mit Strategie: * Algorithmus: Greedy mit Strategie:
* ein nicht abgedeckten Knoten, der von möglichst vielen schon ausgewählten Knoten die Entfernung 3 hat * ein nicht abgedeckten Knoten, der von möglichst vielen schon ausgewählten Knoten die Entfernung 3 hat
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -29,7 +29,7 @@ public class GraphAlgo_DominatingSetGreedyH extends GraphAlgo {
/** Bestimmt besten Knoten nach Strategie: /** Bestimmt besten Knoten nach Strategie:
* ein nicht abgedeckten Knoten, der von möglichst vielen schon ausgewählten Knoten die Entfernung 3 hat * ein nicht abgedeckten Knoten, der von möglichst vielen schon ausgewählten Knoten die Entfernung 3 hat
*/ */
private Knoten bestimmeBesten() { private Knoten bestimmeBesten() throws InterruptedException {
Random r = new Random(); Random r = new Random();
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() ); List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
List<Knoten> nichtabgedeckte = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht() ); List<Knoten> nichtabgedeckte = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht() );
@ -71,7 +71,7 @@ public class GraphAlgo_DominatingSetGreedyH extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -14,7 +14,7 @@ import graph.*;
* Algorithmus: Greedy mit Strategie: * Algorithmus: Greedy mit Strategie:
* ein nicht abgedeckten Knoten, der von den ausgewählten Knoten eine möglichst große Entfernung hat * ein nicht abgedeckten Knoten, der von den ausgewählten Knoten eine möglichst große Entfernung hat
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -30,7 +30,7 @@ public class GraphAlgo_DominatingSetGreedyI extends GraphAlgo {
* ein nicht abgedeckten Knoten, der von den ausgewählten Knoten eine möglichst große Entfernung hat * ein nicht abgedeckten Knoten, der von den ausgewählten Knoten eine möglichst große Entfernung hat
*/ */
private Knoten bestimmeBesten() { private Knoten bestimmeBesten() throws InterruptedException {
Random r = new Random(); Random r = new Random();
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() ); List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
List<Knoten> nichtabgedeckte = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht() ); List<Knoten> nichtabgedeckte = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht() );
@ -84,7 +84,7 @@ public class GraphAlgo_DominatingSetGreedyI extends GraphAlgo {
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -8,7 +8,7 @@ import graph.*;
* Algorithmus: Zunächst wird auf geraden Grad der Knoten getestet, danach * Algorithmus: Zunächst wird auf geraden Grad der Knoten getestet, danach
* mit Tiefensuche der Zusammenhang des Graphen überprüft. * mit Tiefensuche der Zusammenhang des Graphen überprüft.
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -18,7 +18,7 @@ public class GraphAlgo_EulerkreisExistenz extends GraphAlgo {
return "Eulerkreis (Existenz)"; return "Eulerkreis (Existenz)";
} }
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -25,7 +25,7 @@ public class GraphAlgo_MST_Kruskal extends GraphAlgo {
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
int farbe = 1; int farbe = 1;
List<Kante> kanten = g.getAlleKanten(); List<Kante> kanten = g.getAlleKanten();
List<Knoten> knoten = g.getAlleKnoten(); List<Knoten> knoten = g.getAlleKnoten();

View file

@ -24,7 +24,7 @@ public class GraphAlgo_MST_Prim extends GraphAlgo {
return "MST (Prim)"; return "MST (Prim)";
} }
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
int markiert = 0; int markiert = 0;
List<Knoten> knoten; List<Knoten> knoten;
List<Kante> kanten; List<Kante> kanten;

View file

@ -10,7 +10,7 @@ import graph.*;
* Dieser Algorithmus findet die kürzesten Pfade in einem ungewichteten Graphen. * Dieser Algorithmus findet die kürzesten Pfade in einem ungewichteten Graphen.
* Algorithmus: Algorithmus A von Moore * Algorithmus: Algorithmus A von Moore
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -23,7 +23,7 @@ public class GraphAlgo_Moore extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -32,7 +32,7 @@ public class GraphAlgo_TSPBacktracking extends GraphAlgo {
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
start = this.getStartKnoten(); start = this.getStartKnoten();
probiere(start); probiere(start);
g.setStatus(besteLoesung); g.setStatus(besteLoesung);
@ -40,7 +40,7 @@ public class GraphAlgo_TSPBacktracking extends GraphAlgo {
melde("beste Route gefunden:" +getInfo()); melde("beste Route gefunden:" +getInfo());
} // end of for } // end of for
public void probiere(Knoten akt) { public void probiere(Knoten akt) throws InterruptedException {
boolean fertig = true; boolean fertig = true;
infoIndentMore(); infoIndentMore();
akt.setMarkiert(true); akt.setMarkiert(true);

View file

@ -30,7 +30,7 @@ public class GraphAlgo_TSPGenetisch extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
population = new int[popGroesse][g.getAnzahlKnoten()+1]; population = new int[popGroesse][g.getAnzahlKnoten()+1];
double[] rundreiseLaenge = new double[popGroesse]; double[] rundreiseLaenge = new double[popGroesse];
for(int i=0; i<popGroesse; i++) { for(int i=0; i<popGroesse; i++) {

View file

@ -28,7 +28,7 @@ public class GraphAlgo_TSPGreedy extends GraphAlgo {
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
Knoten start = this.getStartKnoten(); Knoten start = this.getStartKnoten();
Knoten akt = start; Knoten akt = start;
Kante min; Kante min;

View file

@ -29,7 +29,7 @@ public class GraphAlgo_TSPGreedy2 extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
int farbe = 1; int farbe = 1;
int anzkanten = 0; int anzkanten = 0;
List<Kante> kanten = g.getAlleKanten(); List<Kante> kanten = g.getAlleKanten();

View file

@ -27,7 +27,7 @@ public class GraphAlgo_TSPGreedyOpt extends GraphAlgo {
} }
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
Knoten start = this.getStartKnoten(); Knoten start = this.getStartKnoten();
Knoten akt = start; Knoten akt = start;
List<Knoten> reihung = new ArrayList<Knoten>(); List<Knoten> reihung = new ArrayList<Knoten>();

View file

@ -10,7 +10,7 @@ import graph.*;
* Dieser Algorithmus nummeriert alle Knoten des Graphen. * Dieser Algorithmus nummeriert alle Knoten des Graphen.
* Algorithmus: Tiefensuche mit ToDo-Liste (Stapel) * Algorithmus: Tiefensuche mit ToDo-Liste (Stapel)
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -24,7 +24,7 @@ public class GraphAlgo_Tiefensuche extends GraphAlgo {
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }

View file

@ -10,7 +10,7 @@ import graph.*;
* Dieser Algorithmus nummeriert alle Knoten des Graphen. * Dieser Algorithmus nummeriert alle Knoten des Graphen.
* Algorithmus: Tiefensuche rekursiv * Algorithmus: Tiefensuche rekursiv
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -24,14 +24,14 @@ public class GraphAlgo_TiefensucheRek extends GraphAlgo {
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;
} }
nummeriere(getStartKnoten(), 0); nummeriere(getStartKnoten(), 0);
} // end } // end
private int nummeriere(Knoten k, int nr) { private int nummeriere(Knoten k, int nr) throws InterruptedException {
// Abbruchbedingung // Abbruchbedingung
if(k.isBesucht()) { if(k.isBesucht()) {
info("Untersuche "+g.getKnoteninfo(k,false)+" => ist schon besucht"); info("Untersuche "+g.getKnoteninfo(k,false)+" => ist schon besucht");

View file

@ -10,7 +10,7 @@ import graph.*;
* Er sucht einen Zyklus im Graphen. * Er sucht einen Zyklus im Graphen.
* Algorithmus: Backtracking * Algorithmus: Backtracking
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -22,13 +22,13 @@ public class GraphAlgo_ZyklusBacktracking extends GraphAlgo {
return "Zyklensuche (Backtracking)"; return "Zyklensuche (Backtracking)";
} }
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
List<String> loesung = backtracking(getStartKnoten()); List<String> loesung = backtracking(getStartKnoten());
if(loesung != null) g.setStatus(loesung); if(loesung != null) g.setStatus(loesung);
step(); step();
} }
public List<String> backtracking(Knoten k){ public List<String> backtracking(Knoten k) throws InterruptedException {
List<String> loesung = null; List<String> loesung = null;

View file

@ -8,7 +8,7 @@ import graph.*;
/** /**
* Dieser Algorithmus findet eine topologische Sortierung des Graphen. * Dieser Algorithmus findet eine topologische Sortierung des Graphen.
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -23,7 +23,7 @@ public class GraphAlgo_toplogischeSortierung extends GraphAlgo {
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
String reihenfolge = ""; String reihenfolge = "";
if (g.getAnzahlKnoten()==0) { if (g.getAnzahlKnoten()==0) {
return; return;

View file

@ -1,5 +1,5 @@
# Anzeigeoptionen:# Gewichte anzeigen 1, Gewichte nicht anzeigen 0 # Anzeigeoptionen:# Gewichte anzeigen 1, Gewichte nicht anzeigen 0
showWeights,0 showWeights,1
# Knoteninfo anzeigen 1,Knoteninfo nicht anzeigen 0 # Knoteninfo anzeigen 1,Knoteninfo nicht anzeigen 0
showInfoText,1 showInfoText,1
# Knoten leer 0, Knotenname anzeigen 1, Wert des Knoten anzeigen 2 # Knoten leer 0, Knotenname anzeigen 1, Wert des Knoten anzeigen 2

Can't render this file because it contains an unexpected character in line 7 and column 33.

View file

@ -1,5 +1,5 @@
# Anzeigeoptionen:# Gewichte anzeigen 1, Gewichte nicht anzeigen 0 # Anzeigeoptionen:# Gewichte anzeigen 1, Gewichte nicht anzeigen 0
showWeights,0 showWeights,1
# Knoteninfo anzeigen 1,Knoteninfo nicht anzeigen 0 # Knoteninfo anzeigen 1,Knoteninfo nicht anzeigen 0
showInfoText,1 showInfoText,1
# Knoten leer 0, Knotenname anzeigen 1, Wert des Knoten anzeigen 2 # Knoten leer 0, Knotenname anzeigen 1, Wert des Knoten anzeigen 2

Can't render this file because it contains an unexpected character in line 7 and column 33.

View file

@ -32,13 +32,14 @@ import javafx.collections.ObservableList;
* Die Klasse Controller stellt den Controller des Hauptfensters / Menu dar. * Die Klasse Controller stellt den Controller des Hauptfensters / Menu dar.
* *
* @author Thomas Schaller * @author Thomas Schaller
* @version 03.03.2023 (v7.1) * @version 12.02.2025 (v7.4)
* v7.0: Die aktuelle Bildschirmposition und der angezeigte Graph werden in config.csv abgelegt. * v7.0: Die aktuelle Bildschirmposition und der angezeigte Graph werden in config.csv abgelegt.
* v7.1: Verzeichnisauswahl für Laden/Speichern verbessert * v7.1: Verzeichnisauswahl für Laden/Speichern verbessert
* v7.4: Unterbrechen von Simulieren-Thread neu geregelt.
*/ */
public class Controller { public class Controller {
private String version = "7.0 (Februar 2023)"; private String version = "7.4 (Januar 2025)";
private String pfad; // Pfad der aktuell angezeigten Datei private String pfad; // Pfad der aktuell angezeigten Datei
@FXML @FXML

View file

@ -40,7 +40,8 @@ import javafx.collections.ObservableList;
* durchgeführt werden. * durchgeführt werden.
* *
* @author Thomas Schaller * @author Thomas Schaller
* @version 03.03.2023 (v7.0) * @version 12.02.2025 (v7.4)
* v7.4: Unterbrechen eines Algorithmus neu geregelt.
* v7.1: Fehler bei Aktualisierung des Hilfefensters behoben, Splitpane statt HBox * v7.1: Fehler bei Aktualisierung des Hilfefensters behoben, Splitpane statt HBox
* v7.0: Mechanismus geändert, so dass die init-Methode des Algorithmus beim Wechesel eines Algorithmus * v7.0: Mechanismus geändert, so dass die init-Methode des Algorithmus beim Wechesel eines Algorithmus
* aufgerufen wird, um die für diesen Algorithmus passenden Anzeigeeinstellungen zu setzen. * aufgerufen wird, um die für diesen Algorithmus passenden Anzeigeeinstellungen zu setzen.
@ -189,7 +190,7 @@ public class SimulationTabMitController extends TabMitController implements Hilf
} }
public void changeAlgorithm() { public void changeAlgorithm() {
if(aktAlgo != null && aktAlgo.isAlive()) aktAlgo.stop(); if(aktAlgo != null && aktAlgo.isAlive() && !aktAlgo.isInterrupted()) aktAlgo.interrupt();
graph.initialisiereAlleKnoten(); graph.initialisiereAlleKnoten();
graph.initialisiereAlleKanten(); graph.initialisiereAlleKanten();

View file

@ -13,7 +13,7 @@ import algorithmen.*;
* die gleiche Farbe haben und möglichst wenige Farben benutzt werden. * die gleiche Farbe haben und möglichst wenige Farben benutzt werden.
* Algorithmus: Beispieldatei, in der Schüler den Algorithmus selbst umsetzen können * Algorithmus: Beispieldatei, in der Schüler den Algorithmus selbst umsetzen können
* *
* @version 1.0 from 10.12.2020 * @version 7.1 from 12.02.2025
* @author Thomas Schaller * @author Thomas Schaller
*/ */
@ -28,9 +28,9 @@ public class GraphAlgo_Coloring_Schueler extends GraphAlgo {
// Ende Attribute // Ende Attribute
// Anfang Methoden // Anfang Methoden
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
gr = getGraph(); gr = getGraph();
getStartKnoten().setFarbe(3); getStartKnoten().setFarbe(3);
// Hole alle Knoten vom Graph g // Hole alle Knoten vom Graph g

View file

@ -9,7 +9,7 @@ import algorithmen.*;
/** /**
* Beschreibung des Algos * Beschreibung des Algos
* *
* @version 1.0 from ??? * @version 7.1 from 12.02.2025
* @author Schueler * @author Schueler
*/ */
@ -21,7 +21,7 @@ public class GraphAlgo_Dijkstra_Eigener extends GraphAlgo {
return "02_Dijkstra_Eigener"; return "02_Dijkstra_Eigener";
} }
public void fuehreAlgorithmusAus() { public void fuehreAlgorithmusAus() throws InterruptedException {
gr = getGraph(); gr = getGraph();
//# Hier kommt dein Quelltext zum loesen des Graphenproblems hin: //# Hier kommt dein Quelltext zum loesen des Graphenproblems hin: