diff --git a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo.java b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo.java index e62b804..ff0ebae 100644 --- a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo.java +++ b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo.java @@ -9,23 +9,23 @@ import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ButtonType; 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 - * @author + * @version 6.7 (Dez. 2020) + * @author Thomas Schaller */ public abstract class GraphAlgo extends Thread { // Anfang Attribute - private boolean stepping; - private boolean waitforrepaint; - private boolean waitforclick; - protected boolean inArbeit; - private GraphPlotter gp; + private boolean stepping; // Einzelschrittmodus + private boolean waitforrepaint; // wird gerade gezeichnet (=> nicht nochmal zeichnen beauftragen) + private boolean waitforclick; // wird auf Klick für nächsten Step gewartet + protected boolean inArbeit; + protected GraphPlotter gp; private Knoten startKnoten; private int speed =100; private Hilfe hilfe; @@ -34,6 +34,9 @@ public abstract class GraphAlgo extends Thread { // Ende Attribute // Anfang Methoden + /** + * Erzeugt neues Algorithmus-Objekt + */ public GraphAlgo() { stepping = true; waitforrepaint = false; @@ -42,31 +45,53 @@ public abstract class GraphAlgo extends Thread { setDaemon(true); } + /** + * Setzt die Referenz auf die GraphAnzeige und das Hilfefenster + * @param graphPlotter + * @param hilfe + */ public void setGUIElemente(GraphPlotter graphPlotter, Hilfe hilfe) { gp = graphPlotter; g = gp.getGraph(); this.hilfe = hilfe; 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) { this.g = g; gp = 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() { if(gp == null) return; try{ + //System.out.println("Step"); gp.updateImage(); aktuellerZustand = g.getStatus(); waitforclick = true; if (hilfe != null) hilfe.setReviewAllowed(true); int i = 0; while((waitforclick && (stepping || i*10 < speed)) && !isInterrupted()){ - Thread.sleep(10); - i++; + Thread.sleep(10); + i++; } + if (hilfe != null) hilfe.setReviewAllowed(false); g.setStatus(aktuellerZustand); aktuellerZustand = null; @@ -76,30 +101,41 @@ public abstract class GraphAlgo extends Thread { } } - public boolean getWaitforrepaint() { - return waitforrepaint; - } - - public void setWaitforrepaint(boolean waitforrepaintNeu) { - waitforrepaint = waitforrepaintNeu; - } - + /** + * Wird gerade auf einen Buttonklick für den nächsten Step gewartet? + * @return true/false + */ public boolean getWaitforclick() { 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) { waitforclick = waitforclickNeu; } + /** + * Setzt, ob im Einzelschrittmodus ausgeführt werden soll + * @param stepping true/false + */ public void setStepping(boolean stepping) { this.stepping = stepping; } + /** + * Setzt die Wartezeit im automatischen Modus + * @param delay Wartezeit + */ public void setSpeed(int delay) { this.speed = delay; } + /** + * Ausführung des Algorithmus + */ public void run() { if(!inArbeit && gp != null) @@ -109,9 +145,10 @@ public abstract class GraphAlgo extends Thread { try{ if (hilfe != null) hilfe.setReviewAllowed(false); fuehreAlgorithmusAus(); + gp.updateImage(); // System.out.println("Algorithmus beendet"); } catch( ThreadDeath e){ - // System.out.println("Algorithmus vorzeitig beendet."); + // System.out.println("Algorithmus vorzeitig beendet."+e); } if (hilfe != null) hilfe.setReviewAllowed(true); inArbeit = false; @@ -124,10 +161,18 @@ public abstract class GraphAlgo extends Thread { } // Ende Methoden + /** + * Setzen des Startknotens + * @param k Startknoten + */ public void setStartKnoten(Knoten k) { startKnoten = k; } + /** + * Abfragen des Startknotens für den Algorithmus + * @return gesetzter Startknoten oder Knoten Nr. 0 + */ public Knoten getStartKnoten() { if (startKnoten != null) { return startKnoten; @@ -136,37 +181,79 @@ public abstract class GraphAlgo extends Thread { } // end of if-else } + /** + * Methode für den eigentlichen Algorithmus + */ public abstract void fuehreAlgorithmusAus(); + /** + * Name des Algorithmus für die Dropdown-Auswahl + */ 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) { info(s); Platform.runLater(() -> { - Alert meldung = new Alert(AlertType.INFORMATION, s, ButtonType.OK); - meldung.setTitle("Information"); - meldung.setHeaderText(null); - meldung.showAndWait(); + Alert meldung = new Alert(AlertType.INFORMATION, s, ButtonType.OK); + meldung.setTitle("Information"); + meldung.setHeaderText(null); + meldung.showAndWait(); }); } + /** + * Text in das Hilfefenster einfügen + * Ist für die Verwendung im Algorithmus gedacht. + * @param s Hilfetext + */ public void info(String s) { if(hilfe != null) hilfe.append(s+"\n"); } + /** + * Löscht das Hilfefenster + */ public void resetInfo() { if(hilfe != null) hilfe.loescheAlles(); } + /** + * Rückt im Hilfefenster eine Ebene tiefer ein. + * Ist für die Verwendung im Algorithmus gedacht. + */ public void infoIndentMore() { if(hilfe != null) hilfe.indentMore(); } + /** + * Rückt im Hilfefenster eine Ebene aus. + * Ist für die Verwendung im Algorithmus gedacht. + */ public void infoIndentLess() { 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"}; + } + } } diff --git a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_BellmanFord.java b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_BellmanFord.java index 2319f4b..812fc5f 100644 --- a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_BellmanFord.java +++ b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_BellmanFord.java @@ -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 public void fuehreAlgorithmusAus() { if (g.getAnzahlKnoten()==0) { return; } - for(Knoten k : g.getAlleKnoten()) { - k.setWert(1000); - } - info("Setze alle Entfernungen auf unendlich (1000)"); + getStartKnoten().setWert(0); info("Setze Startknoten auf Entfernung 0"); step(); diff --git a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_Dijkstra.java b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_Dijkstra.java index 164793f..009fdf2 100644 --- a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_Dijkstra.java +++ b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_Dijkstra.java @@ -22,6 +22,13 @@ public class GraphAlgo_Dijkstra extends GraphAlgo { 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() { @@ -50,13 +57,10 @@ public class GraphAlgo_Dijkstra extends GraphAlgo { if(!n.isMarkiert()){ info("- ist noch nicht markiert"); 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()) { List 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); diff --git a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_DijkstraMitVorgaenger.java b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_DijkstraMitVorgaenger.java new file mode 100644 index 0000000..015ceee --- /dev/null +++ b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_DijkstraMitVorgaenger.java @@ -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 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 toDo = new ArrayList(); + 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 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 + +} + diff --git a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_toplogischeSortierung.java b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_toplogischeSortierung.java index ed5107e..ed02226 100644 --- a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_toplogischeSortierung.java +++ b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/GraphAlgo_toplogischeSortierung.java @@ -43,26 +43,28 @@ public class GraphAlgo_toplogischeSortierung extends GraphAlgo { info("Sortiere die noch nicht markierten Knoten nach ihrem Wert"); Knoten k = knoten.get(0); 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) { - melde("Fehler: Wert ist nicht 0 - Zyklus vorhanden"); + melde("Fehler: Wert ist nicht 0 - Zyklus vorhanden - Keine topologische Sortierung möglich"); knoten.clear(); return; } else { reihenfolge += " "+g.getKnoteninfo(k, false); info("Füge ihn der Liste hinzu: "+reihenfolge); knoten.remove(k); + info("Reduziere den Wert aller Nachbarn von "+g.getKnoteninfo(k,false)+" um 1"); + infoIndentMore(); for(Knoten k2 : g.getNachbarknoten(k)) { 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(); } melde("Topologische Sortierung: "+reihenfolge); - } // end // Ende Methoden diff --git a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/package.bluej b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/package.bluej index 90f6cf8..7ed1910 100644 --- a/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/package.bluej +++ b/3_vorlagen_tauschordner/2_graphentester_jar/algorithmen/package.bluej @@ -1,20 +1,20 @@ #BlueJ package file -dependency1.from=GraphAlgo_DominatingSetGreedyE +dependency1.from=GraphAlgo_DominatingSetGreedyF dependency1.to=GraphAlgo dependency1.type=UsesDependency -dependency2.from=GraphAlgo_DominatingSetGreedyE +dependency2.from=GraphAlgo_DominatingSetGreedyF dependency2.to=GraphAlgo_Moore dependency2.type=UsesDependency -dependency3.from=GraphAlgo_DominatingSetGreedyF +dependency3.from=GraphAlgo_DominatingSetGreedyG dependency3.to=GraphAlgo dependency3.type=UsesDependency -dependency4.from=GraphAlgo_DominatingSetGreedyF +dependency4.from=GraphAlgo_DominatingSetGreedyG dependency4.to=GraphAlgo_Moore dependency4.type=UsesDependency -dependency5.from=GraphAlgo_DominatingSetGreedyG +dependency5.from=GraphAlgo_DominatingSetGreedyE dependency5.to=GraphAlgo dependency5.type=UsesDependency -dependency6.from=GraphAlgo_DominatingSetGreedyG +dependency6.from=GraphAlgo_DominatingSetGreedyE dependency6.to=GraphAlgo_Moore dependency6.type=UsesDependency dependency7.from=GraphAlgo_DominatingSetGreedyH @@ -23,18 +23,18 @@ dependency7.type=UsesDependency dependency8.from=GraphAlgo_DominatingSetGreedyH dependency8.to=GraphAlgo_Moore dependency8.type=UsesDependency -objectbench.height=133 -objectbench.width=750 +objectbench.height=66 +objectbench.width=1428 package.divider.horizontal=0.6003172085646312 -package.divider.vertical=0.8309178743961353 -package.editor.height=668 -package.editor.width=1133 -package.editor.x=533 -package.editor.y=122 -package.frame.height=928 -package.frame.width=1297 +package.divider.vertical=0.9027962716378163 +package.editor.height=671 +package.editor.width=1292 +package.editor.x=100 +package.editor.y=118 +package.frame.height=852 +package.frame.width=1452 package.numDependencies=8 -package.numTargets=31 +package.numTargets=32 package.showExtends=true package.showUses=true readme.height=60 @@ -46,216 +46,223 @@ target1.height=50 target1.name=GraphAlgo_ColoringGreedyRandom target1.showInterface=false target1.type=ClassTarget -target1.width=250 -target1.x=600 +target1.width=290 +target1.x=740 target1.y=590 target10.height=50 target10.name=GraphAlgo_DominatingSetGreedyF target10.showInterface=false target10.type=ClassTarget -target10.width=240 -target10.x=290 +target10.width=280 +target10.x=430 target10.y=420 target11.height=50 target11.name=GraphAlgo_DominatingSetGreedyG target11.showInterface=false target11.type=ClassTarget -target11.width=250 -target11.x=290 +target11.width=290 +target11.x=430 target11.y=470 target12.height=50 target12.name=GraphAlgo_TSPGreedy target12.showInterface=false target12.type=ClassTarget target12.width=230 -target12.x=600 +target12.x=740 target12.y=160 target13.height=50 target13.name=GraphAlgo_DominatingSetGreedyD target13.showInterface=false target13.type=ClassTarget -target13.width=250 -target13.x=290 +target13.width=290 +target13.x=430 target13.y=320 target14.height=50 target14.name=GraphAlgo_TSPGenetisch target14.showInterface=false target14.type=ClassTarget target14.width=230 -target14.x=600 +target14.x=740 target14.y=340 target15.height=50 target15.name=GraphAlgo_DominatingSetGreedyE target15.showInterface=false target15.type=ClassTarget -target15.width=240 -target15.x=290 +target15.width=280 +target15.x=430 target15.y=370 target16.height=50 target16.name=GraphAlgo_DominatingSetGenetisch target16.showInterface=false target16.type=ClassTarget -target16.width=250 -target16.x=290 +target16.width=300 +target16.x=430 target16.y=640 target17.height=50 target17.name=GraphAlgo_ZyklusBacktracking target17.showInterface=false target17.type=ClassTarget -target17.width=220 -target17.x=20 -target17.y=640 +target17.width=230 +target17.x=160 +target17.y=410 target18.height=50 target18.name=GraphAlgo_DominatingSetGreedyH target18.showInterface=false target18.type=ClassTarget -target18.width=250 -target18.x=290 +target18.width=290 +target18.x=430 target18.y=520 target19.height=50 target19.name=GraphAlgo_DominatingSetGreedyI target19.showInterface=false target19.type=ClassTarget -target19.width=240 -target19.x=290 +target19.width=280 +target19.x=430 target19.y=570 target2.height=50 target2.name=GraphAlgo_Tiefensuche target2.showInterface=false target2.type=ClassTarget target2.width=210 -target2.x=20 -target2.y=170 +target2.x=160 +target2.y=160 target20.height=50 target20.name=GraphAlgo_Moore target20.showInterface=false target20.type=ClassTarget target20.width=210 -target20.x=20 -target20.y=440 +target20.x=150 +target20.y=480 target21.height=50 target21.name=GraphAlgo_BellmanFord target21.showInterface=false target21.type=ClassTarget target21.width=210 -target21.x=20 -target21.y=560 +target21.x=150 +target21.y=660 target22.height=50 target22.name=GraphAlgo_Breitensuche target22.showInterface=false target22.type=ClassTarget target22.width=210 -target22.x=20 -target22.y=290 +target22.x=160 +target22.y=280 target23.height=50 target23.name=GraphAlgo_toplogischeSortierung target23.showInterface=false target23.type=ClassTarget -target23.width=240 -target23.x=20 -target23.y=370 +target23.width=250 +target23.x=160 +target23.y=350 target24.height=50 target24.name=GraphAlgo_DominatingSetBacktracking target24.showInterface=false target24.type=ClassTarget -target24.width=270 -target24.x=290 +target24.width=320 +target24.x=430 target24.y=100 target25.height=50 target25.name=GraphAlgo_ColoringGreedy target25.showInterface=false target25.type=ClassTarget target25.width=240 -target25.x=600 +target25.x=740 target25.y=530 target26.height=50 -target26.name=GraphAlgo_EulerkreisExistenz +target26.name=GraphAlgo_DijkstraMitVorgaenger target26.showInterface=false target26.type=ClassTarget -target26.width=210 -target26.x=20 -target26.y=100 +target26.width=250 +target26.x=150 +target26.y=600 target27.height=50 -target27.name=GraphAlgo_TiefensucheRek +target27.name=GraphAlgo_EulerkreisExistenz target27.showInterface=false target27.type=ClassTarget -target27.width=210 -target27.x=20 -target27.y=230 +target27.width=220 +target27.x=160 +target27.y=100 target28.height=50 -target28.name=GraphAlgo_TSPGreedy2 +target28.name=GraphAlgo_TiefensucheRek target28.showInterface=false target28.type=ClassTarget -target28.width=230 -target28.x=600 +target28.width=210 +target28.x=160 target28.y=220 target29.height=50 -target29.name=GraphAlgo_ColoringBacktracking +target29.name=GraphAlgo_TSPGreedy2 target29.showInterface=false target29.type=ClassTarget -target29.width=240 -target29.x=600 -target29.y=470 +target29.width=230 +target29.x=740 +target29.y=220 target3.height=50 -target3.name=GraphAlgo_MST_Prim +target3.name=GraphAlgo_TSPBacktracking target3.showInterface=false target3.type=ClassTarget -target3.width=230 -target3.x=890 +target3.width=240 +target3.x=740 target3.y=100 target30.height=50 -target30.name=GraphAlgo_Dijkstra +target30.name=GraphAlgo_ColoringBacktracking target30.showInterface=false target30.type=ClassTarget -target30.width=210 -target30.x=20 -target30.y=500 +target30.width=270 +target30.x=740 +target30.y=470 target31.height=50 -target31.name=GraphAlgo_TSPGreedyOpt +target31.name=GraphAlgo_Dijkstra target31.showInterface=false target31.type=ClassTarget -target31.width=230 -target31.x=600 -target31.y=280 +target31.width=210 +target31.x=150 +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.name=GraphAlgo_TSPBacktracking +target4.name=GraphAlgo_MST_Prim target4.showInterface=false target4.type=ClassTarget target4.width=230 -target4.x=600 +target4.x=1030 target4.y=100 target5.height=50 target5.name=GraphAlgo_DominatingSetGreedyB target5.showInterface=false target5.type=ClassTarget -target5.width=240 -target5.x=290 +target5.width=290 +target5.x=430 target5.y=220 target6.height=50 target6.name=GraphAlgo target6.showInterface=false target6.type=AbstractTarget -target6.width=90 -target6.x=310 +target6.width=100 +target6.x=450 target6.y=10 target7.height=50 target7.name=GraphAlgo_DominatingSetGreedyC target7.showInterface=false target7.type=ClassTarget -target7.width=240 -target7.x=290 +target7.width=290 +target7.x=430 target7.y=270 target8.height=50 target8.name=GraphAlgo_MST_Kruskal target8.showInterface=false target8.type=ClassTarget target8.width=230 -target8.x=890 +target8.x=1030 target8.y=160 target9.height=50 target9.name=GraphAlgo_DominatingSetGreedyA target9.showInterface=false target9.type=ClassTarget -target9.width=250 -target9.x=290 +target9.width=290 +target9.x=430 target9.y=170 diff --git a/3_vorlagen_tauschordner/2_graphentester_jar/beispielgraphen/02_topologischesortierung/02_aufbausimulation2.csv b/3_vorlagen_tauschordner/2_graphentester_jar/beispielgraphen/02_topologischesortierung/02_aufbausimulation2.csv index 8c6f82f..347b375 100644 --- a/3_vorlagen_tauschordner/2_graphentester_jar/beispielgraphen/02_topologischesortierung/02_aufbausimulation2.csv +++ b/3_vorlagen_tauschordner/2_graphentester_jar/beispielgraphen/02_topologischesortierung/02_aufbausimulation2.csv @@ -3,7 +3,7 @@ showWeights,0 # Knoteninfo anzeigen 1,Knoteninfo nicht anzeigen 0 showInfoText,1 # 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! 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. list,infotext Farm,285,101,1,3 -Mühle,531,105,2 -Bäckerei,694,159 +Mühle,531,105,2 +Bäckerei,694,159 Schweinefarm,119,239,4 Metzger,167,409 Kohlemine,423,445,7,8 Erzmine,724,314,7 Eisenschmelze,537,326,8 Werkzeugmacher,389,246,0,4 -Fischerhütte,741,456,6,5 \ No newline at end of file +Fischerhütte,741,456,6,5 \ No newline at end of file diff --git a/3_vorlagen_tauschordner/2_graphentester_jar/graphentester.jar b/3_vorlagen_tauschordner/2_graphentester_jar/graphentester.jar index c764473..5249924 100644 Binary files a/3_vorlagen_tauschordner/2_graphentester_jar/graphentester.jar and b/3_vorlagen_tauschordner/2_graphentester_jar/graphentester.jar differ diff --git a/3_vorlagen_tauschordner/2_graphentester_jar/images/KarlsruheMannheim.png b/3_vorlagen_tauschordner/2_graphentester_jar/images/KarlsruheMannheim.png new file mode 100644 index 0000000..28ce321 Binary files /dev/null and b/3_vorlagen_tauschordner/2_graphentester_jar/images/KarlsruheMannheim.png differ diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo.java index ff0ebae..3dd20e5 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo.java @@ -14,7 +14,7 @@ import javafx.application.Platform; * Abstrakte Oberklasse für alle zu simulierende Algorithmen * Diese müssen die Methode getBezeichnung(): String und fuehreAlgorithmusAus() überschreiben. * - * @version 6.7 (Dez. 2020) + * @version 7.1 12.02.2025 * @author Thomas Schaller */ @@ -78,10 +78,9 @@ public abstract class GraphAlgo extends Thread { /** * Muss vom Algorithmus aufgerufen werden, um einen Haltepunkt zu setzen */ - public void step() { + public void step() throws InterruptedException { if(gp == null) return; try{ - //System.out.println("Step"); gp.updateImage(); aktuellerZustand = g.getStatus(); waitforclick = true; @@ -95,9 +94,13 @@ public abstract class GraphAlgo extends Thread { if (hilfe != null) hilfe.setReviewAllowed(false); g.setStatus(aktuellerZustand); aktuellerZustand = null; + if(Thread.interrupted()){ + throw new InterruptedException(); + } }catch(Exception e) { // 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); fuehreAlgorithmusAus(); gp.updateImage(); - // System.out.println("Algorithmus beendet"); - } catch( ThreadDeath e){ - // System.out.println("Algorithmus vorzeitig beendet."+e); + //System.out.println("Algorithmus beendet"); + } catch( InterruptedException 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 @@ -184,7 +183,7 @@ public abstract class GraphAlgo extends Thread { /** * Methode für den eigentlichen Algorithmus */ - public abstract void fuehreAlgorithmusAus(); + public abstract void fuehreAlgorithmusAus() throws InterruptedException; /** * Name des Algorithmus für die Dropdown-Auswahl @@ -257,3 +256,4 @@ public abstract class GraphAlgo extends Thread { } } + diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_BellmanFord.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_BellmanFord.java index 812fc5f..9d221fc 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_BellmanFord.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_BellmanFord.java @@ -9,7 +9,7 @@ import graph.*; * Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen. * Algorithmus: Bellman-Ford * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -37,7 +37,7 @@ public class GraphAlgo_BellmanFord extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Breitensuche.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Breitensuche.java index d9c992e..b49704d 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Breitensuche.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Breitensuche.java @@ -10,7 +10,7 @@ import graph.*; * Dieser Algorithmus nummeriert alle Knoten des Graphen. * Algorithmus: Breitensuche mit ToDo-Liste (Schlange) * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -23,7 +23,7 @@ public class GraphAlgo_Breitensuche extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringBacktracking.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringBacktracking.java index e2d7cec..c061679 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringBacktracking.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringBacktracking.java @@ -10,7 +10,7 @@ import graph.*; * die gleiche Farbe haben und möglichst wenige Farben benutzt werden. * Algorithmus: Backtracking * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -25,7 +25,7 @@ public class GraphAlgo_ColoringBacktracking extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } @@ -35,7 +35,7 @@ public class GraphAlgo_ColoringBacktracking extends GraphAlgo { step(); } - private void bestimmeColoring(int benutzteFarben) { + private void bestimmeColoring(int benutzteFarben) throws InterruptedException { int min = Integer.MAX_VALUE; List knoten = g.getAlleKnoten(k->k.getFarbe()<=0); diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringGreedy.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringGreedy.java index d8e0980..1ba1217 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringGreedy.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringGreedy.java @@ -9,7 +9,7 @@ import graph.*; * die gleiche Farbe haben und möglichst wenige Farben benutzt werden. * Algorithmus: Näherungslösung mit Greedy-Algorithmus * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ public class GraphAlgo_ColoringGreedy extends GraphAlgo { @@ -26,7 +26,7 @@ public class GraphAlgo_ColoringGreedy extends GraphAlgo { // Ende Attribute // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { List knoten = g.getAlleKnoten(); info("Wiederhole für jeden Knoten"); for (Knoten aktuellerKnoten: knoten ) { diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringGreedyRandom.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringGreedyRandom.java index dece2df..3c5292c 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringGreedyRandom.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ColoringGreedyRandom.java @@ -10,7 +10,7 @@ import graph.*; * die gleiche Farbe haben und möglichst wenige Farben benutzt werden. * 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 */ @@ -28,7 +28,7 @@ public class GraphAlgo_ColoringGreedyRandom extends GraphAlgo { // Ende Attribute // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { List knoten = g.getAlleKnoten(); Collections.shuffle(knoten); info("Wiederhole für jeden Knoten"); diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Dijkstra.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Dijkstra.java index 009fdf2..1e69680 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Dijkstra.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Dijkstra.java @@ -10,7 +10,7 @@ import graph.*; * Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen. * Algorithmus: Dijkstra * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -31,7 +31,7 @@ public class GraphAlgo_Dijkstra extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DijkstraMitVorgaenger.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DijkstraMitVorgaenger.java index 015ceee..30768c9 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DijkstraMitVorgaenger.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DijkstraMitVorgaenger.java @@ -11,7 +11,7 @@ import graph.*; * Dieser Algorithmus findet die kürzesten Pfade in einem gewichteten Graphen. * Algorithmus: Dijkstra * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -34,7 +34,7 @@ public class GraphAlgo_DijkstraMitVorgaenger extends GraphAlgo { gp.getGraphOptions().knotenLangtext = new String[]{"Infotext","Entfernung","Vorgänger","Markiert","Besucht"}; } - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetBacktracking.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetBacktracking.java index 181f52e..8cbf781 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetBacktracking.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetBacktracking.java @@ -10,7 +10,7 @@ import graph.*; * und bestimmt den Zeitbedarf. * Algorithmus: Backtracking * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -26,7 +26,7 @@ public class GraphAlgo_DominatingSetBacktracking extends GraphAlgo { // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { long starttime = System.currentTimeMillis(); if (g.getAnzahlKnoten()==0) { return; @@ -41,7 +41,7 @@ public class GraphAlgo_DominatingSetBacktracking extends GraphAlgo { - private void bestimmeDominierendeMenge(int knoten) { + private void bestimmeDominierendeMenge(int knoten) throws InterruptedException { List status = g.getStatus(); List markierte = g.getAlleKnoten(kn->kn.isMarkiert()); diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGenetisch.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGenetisch.java index a4dd669..73fcfb5 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGenetisch.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGenetisch.java @@ -11,7 +11,7 @@ import graph.*; * Dieser Algorithmus bestimmt die kleinste dominierende Menge in einem Graphen * und bestimmt den Zeitbedarf. * Algorithmus: Genetischer Algorithmus - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -31,7 +31,7 @@ public class GraphAlgo_DominatingSetGenetisch extends GraphAlgo { // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { population = new int[popGroesse][g.getAnzahlKnoten()]; double[] bewertungen = new double[popGroesse]; for(int i=0; i knoten = g.getAlleKnoten(k->!k.isMarkiert()); info("Wiederhole für jeden noch nicht markierten Knoten"); @@ -49,7 +49,7 @@ public class GraphAlgo_DominatingSetGreedyC extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyD.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyD.java index fdb1a3c..ec008ba 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyD.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyD.java @@ -14,7 +14,7 @@ import graph.*; * Algorithmus: Greedy mit Strategie: * Nimm den Knoten mit den meisten Nachbarn * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -49,7 +49,7 @@ public class GraphAlgo_DominatingSetGreedyD extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyE.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyE.java index 67b250f..39d47c3 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyE.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyE.java @@ -14,7 +14,7 @@ import graph.*; * Algorithmus: Greedy mit Strategie: * 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 */ @@ -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 */ - private Knoten bestimmeBesten() { + private Knoten bestimmeBesten() throws InterruptedException { Random r= new Random(); List markierte = g.getAlleKnoten(k->k.isMarkiert() ); @@ -68,7 +68,7 @@ public class GraphAlgo_DominatingSetGreedyE extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyF.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyF.java index 21673c2..9e834c1 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyF.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyF.java @@ -14,7 +14,7 @@ import graph.*; * Algorithmus: Greedy mit Strategie: * 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 */ @@ -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 */ - private Knoten bestimmeBesten() { + private Knoten bestimmeBesten() throws InterruptedException { Random r= new Random(); List markierte = g.getAlleKnoten(k->k.isMarkiert() ); @@ -68,7 +68,7 @@ public class GraphAlgo_DominatingSetGreedyF extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyG.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyG.java index cb4e7cf..37492f0 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyG.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyG.java @@ -14,7 +14,7 @@ import graph.*; * Algorithmus: Greedy mit Strategie: * 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 */ @@ -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 */ - private Knoten bestimmeBesten() { + private Knoten bestimmeBesten() throws InterruptedException { Random r= new Random(); List markierte = g.getAlleKnoten(k->k.isMarkiert() ); @@ -68,7 +68,7 @@ public class GraphAlgo_DominatingSetGreedyG extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyH.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyH.java index b1d7c8d..5879d49 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyH.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyH.java @@ -14,7 +14,7 @@ import graph.*; * Algorithmus: Greedy mit Strategie: * 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 */ @@ -29,7 +29,7 @@ public class GraphAlgo_DominatingSetGreedyH extends GraphAlgo { /** Bestimmt besten Knoten nach Strategie: * 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(); List markierte = g.getAlleKnoten(k->k.isMarkiert() ); List nichtabgedeckte = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht() ); @@ -71,7 +71,7 @@ public class GraphAlgo_DominatingSetGreedyH extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyI.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyI.java index cdcf6d9..7cbdf8c 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyI.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_DominatingSetGreedyI.java @@ -14,7 +14,7 @@ import graph.*; * Algorithmus: Greedy mit Strategie: * 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 */ @@ -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 */ - private Knoten bestimmeBesten() { + private Knoten bestimmeBesten() throws InterruptedException { Random r = new Random(); List markierte = g.getAlleKnoten(k->k.isMarkiert() ); List nichtabgedeckte = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht() ); @@ -84,7 +84,7 @@ public class GraphAlgo_DominatingSetGreedyI extends GraphAlgo { // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_EulerkreisExistenz.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_EulerkreisExistenz.java index a14d026..3ce0cd3 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_EulerkreisExistenz.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_EulerkreisExistenz.java @@ -8,7 +8,7 @@ import graph.*; * Algorithmus: Zunächst wird auf geraden Grad der Knoten getestet, danach * 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 */ @@ -18,7 +18,7 @@ public class GraphAlgo_EulerkreisExistenz extends GraphAlgo { return "Eulerkreis (Existenz)"; } - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_MST_Kruskal.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_MST_Kruskal.java index 48d8c33..6e3a5bf 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_MST_Kruskal.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_MST_Kruskal.java @@ -25,7 +25,7 @@ public class GraphAlgo_MST_Kruskal extends GraphAlgo { // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { int farbe = 1; List kanten = g.getAlleKanten(); List knoten = g.getAlleKnoten(); diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_MST_Prim.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_MST_Prim.java index df91cac..e646654 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_MST_Prim.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_MST_Prim.java @@ -24,7 +24,7 @@ public class GraphAlgo_MST_Prim extends GraphAlgo { return "MST (Prim)"; } - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { int markiert = 0; List knoten; List kanten; diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Moore.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Moore.java index cad7715..14cdc43 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Moore.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Moore.java @@ -10,7 +10,7 @@ import graph.*; * Dieser Algorithmus findet die kürzesten Pfade in einem ungewichteten Graphen. * Algorithmus: Algorithmus A von Moore * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -23,7 +23,7 @@ public class GraphAlgo_Moore extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPBacktracking.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPBacktracking.java index c484856..0952ab4 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPBacktracking.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPBacktracking.java @@ -32,7 +32,7 @@ public class GraphAlgo_TSPBacktracking extends GraphAlgo { // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { start = this.getStartKnoten(); probiere(start); g.setStatus(besteLoesung); @@ -40,7 +40,7 @@ public class GraphAlgo_TSPBacktracking extends GraphAlgo { melde("beste Route gefunden:" +getInfo()); } // end of for - public void probiere(Knoten akt) { + public void probiere(Knoten akt) throws InterruptedException { boolean fertig = true; infoIndentMore(); akt.setMarkiert(true); diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPGenetisch.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPGenetisch.java index 527a2ef..2259941 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPGenetisch.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPGenetisch.java @@ -30,7 +30,7 @@ public class GraphAlgo_TSPGenetisch extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { population = new int[popGroesse][g.getAnzahlKnoten()+1]; double[] rundreiseLaenge = new double[popGroesse]; for(int i=0; i kanten = g.getAlleKanten(); diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPGreedyOpt.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPGreedyOpt.java index c56e7fb..c64c126 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPGreedyOpt.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TSPGreedyOpt.java @@ -27,7 +27,7 @@ public class GraphAlgo_TSPGreedyOpt extends GraphAlgo { } // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { Knoten start = this.getStartKnoten(); Knoten akt = start; List reihung = new ArrayList(); diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Tiefensuche.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Tiefensuche.java index 7d20241..fc10d4c 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Tiefensuche.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_Tiefensuche.java @@ -10,7 +10,7 @@ import graph.*; * Dieser Algorithmus nummeriert alle Knoten des Graphen. * Algorithmus: Tiefensuche mit ToDo-Liste (Stapel) * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -24,7 +24,7 @@ public class GraphAlgo_Tiefensuche extends GraphAlgo { // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TiefensucheRek.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TiefensucheRek.java index 8616a61..598366c 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TiefensucheRek.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_TiefensucheRek.java @@ -10,7 +10,7 @@ import graph.*; * Dieser Algorithmus nummeriert alle Knoten des Graphen. * Algorithmus: Tiefensuche rekursiv * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -24,14 +24,14 @@ public class GraphAlgo_TiefensucheRek extends GraphAlgo { // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { if (g.getAnzahlKnoten()==0) { return; } nummeriere(getStartKnoten(), 0); } // end - private int nummeriere(Knoten k, int nr) { + private int nummeriere(Knoten k, int nr) throws InterruptedException { // Abbruchbedingung if(k.isBesucht()) { info("Untersuche "+g.getKnoteninfo(k,false)+" => ist schon besucht"); diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ZyklusBacktracking.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ZyklusBacktracking.java index 596da2f..9302526 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ZyklusBacktracking.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_ZyklusBacktracking.java @@ -10,7 +10,7 @@ import graph.*; * Er sucht einen Zyklus im Graphen. * Algorithmus: Backtracking * - * @version 1.0 from 10.12.2020 + * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ @@ -22,13 +22,13 @@ public class GraphAlgo_ZyklusBacktracking extends GraphAlgo { return "Zyklensuche (Backtracking)"; } - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { List loesung = backtracking(getStartKnoten()); if(loesung != null) g.setStatus(loesung); step(); } - public List backtracking(Knoten k){ + public List backtracking(Knoten k) throws InterruptedException { List loesung = null; diff --git a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_toplogischeSortierung.java b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_toplogischeSortierung.java index ed02226..9fb723c 100644 --- a/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_toplogischeSortierung.java +++ b/Quellcodes/alg_ds_graphentester/algorithmen/GraphAlgo_toplogischeSortierung.java @@ -8,7 +8,7 @@ import graph.*; /** * 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 */ @@ -23,7 +23,7 @@ public class GraphAlgo_toplogischeSortierung extends GraphAlgo { // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { String reihenfolge = ""; if (g.getAnzahlKnoten()==0) { return; diff --git a/Quellcodes/alg_ds_graphentester/beispielgraphen/02_topologischesortierung/01_aufbausimulation1.csv b/Quellcodes/alg_ds_graphentester/beispielgraphen/02_topologischesortierung/01_aufbausimulation1.csv index b52d928..0ce28e5 100644 --- a/Quellcodes/alg_ds_graphentester/beispielgraphen/02_topologischesortierung/01_aufbausimulation1.csv +++ b/Quellcodes/alg_ds_graphentester/beispielgraphen/02_topologischesortierung/01_aufbausimulation1.csv @@ -1,5 +1,5 @@ # Anzeigeoptionen:# Gewichte anzeigen 1, Gewichte nicht anzeigen 0 -showWeights,0 +showWeights,1 # Knoteninfo anzeigen 1,Knoteninfo nicht anzeigen 0 showInfoText,1 # Knoten leer 0, Knotenname anzeigen 1, Wert des Knoten anzeigen 2 diff --git a/Quellcodes/alg_ds_graphentester/beispielgraphen/02_topologischesortierung/02_aufbausimulation2.csv b/Quellcodes/alg_ds_graphentester/beispielgraphen/02_topologischesortierung/02_aufbausimulation2.csv index 347b375..844cb4d 100644 --- a/Quellcodes/alg_ds_graphentester/beispielgraphen/02_topologischesortierung/02_aufbausimulation2.csv +++ b/Quellcodes/alg_ds_graphentester/beispielgraphen/02_topologischesortierung/02_aufbausimulation2.csv @@ -1,5 +1,5 @@ # Anzeigeoptionen:# Gewichte anzeigen 1, Gewichte nicht anzeigen 0 -showWeights,0 +showWeights,1 # Knoteninfo anzeigen 1,Knoteninfo nicht anzeigen 0 showInfoText,1 # Knoten leer 0, Knotenname anzeigen 1, Wert des Knoten anzeigen 2 diff --git a/Quellcodes/alg_ds_graphentester/control/Controller.java b/Quellcodes/alg_ds_graphentester/control/Controller.java index 2df4018..7ce3344 100644 --- a/Quellcodes/alg_ds_graphentester/control/Controller.java +++ b/Quellcodes/alg_ds_graphentester/control/Controller.java @@ -32,13 +32,14 @@ import javafx.collections.ObservableList; * Die Klasse Controller stellt den Controller des Hauptfensters / Menu dar. * * @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.1: Verzeichnisauswahl für Laden/Speichern verbessert + * v7.4: Unterbrechen von Simulieren-Thread neu geregelt. */ 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 @FXML diff --git a/Quellcodes/alg_ds_graphentester/control/SimulationTabMitController.java b/Quellcodes/alg_ds_graphentester/control/SimulationTabMitController.java index 76f2786..eefd186 100644 --- a/Quellcodes/alg_ds_graphentester/control/SimulationTabMitController.java +++ b/Quellcodes/alg_ds_graphentester/control/SimulationTabMitController.java @@ -40,7 +40,8 @@ import javafx.collections.ObservableList; * durchgeführt werden. * * @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.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. @@ -189,7 +190,7 @@ public class SimulationTabMitController extends TabMitController implements Hilf } public void changeAlgorithm() { - if(aktAlgo != null && aktAlgo.isAlive()) aktAlgo.stop(); + if(aktAlgo != null && aktAlgo.isAlive() && !aktAlgo.isInterrupted()) aktAlgo.interrupt(); graph.initialisiereAlleKnoten(); graph.initialisiereAlleKanten(); diff --git a/Quellcodes/alg_ds_graphentester/eigeneAlgorithmen/GraphAlgo_Coloring_Schueler.java b/Quellcodes/alg_ds_graphentester/eigeneAlgorithmen/GraphAlgo_Coloring_Schueler.java index e6e8822..372ca60 100644 --- a/Quellcodes/alg_ds_graphentester/eigeneAlgorithmen/GraphAlgo_Coloring_Schueler.java +++ b/Quellcodes/alg_ds_graphentester/eigeneAlgorithmen/GraphAlgo_Coloring_Schueler.java @@ -13,7 +13,7 @@ import algorithmen.*; * die gleiche Farbe haben und möglichst wenige Farben benutzt werden. * 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 */ @@ -28,9 +28,9 @@ public class GraphAlgo_Coloring_Schueler extends GraphAlgo { // Ende Attribute // Anfang Methoden - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { gr = getGraph(); - getStartKnoten().setFarbe(3); + getStartKnoten().setFarbe(3); // Hole alle Knoten vom Graph g diff --git a/Quellcodes/alg_ds_graphentester/eigeneAlgorithmen/GraphAlgo_Dijkstra_Eigener.java b/Quellcodes/alg_ds_graphentester/eigeneAlgorithmen/GraphAlgo_Dijkstra_Eigener.java index 55aaedf..3d3cbcf 100644 --- a/Quellcodes/alg_ds_graphentester/eigeneAlgorithmen/GraphAlgo_Dijkstra_Eigener.java +++ b/Quellcodes/alg_ds_graphentester/eigeneAlgorithmen/GraphAlgo_Dijkstra_Eigener.java @@ -9,7 +9,7 @@ import algorithmen.*; /** * Beschreibung des Algos * - * @version 1.0 from ??? + * @version 7.1 from 12.02.2025 * @author Schueler */ @@ -21,7 +21,7 @@ public class GraphAlgo_Dijkstra_Eigener extends GraphAlgo { return "02_Dijkstra_Eigener"; } - public void fuehreAlgorithmusAus() { + public void fuehreAlgorithmusAus() throws InterruptedException { gr = getGraph(); //# Hier kommt dein Quelltext zum loesen des Graphenproblems hin: