Sync with upstream

This commit is contained in:
Frank Schiebel 2024-03-12 17:34:56 +01:00
parent 39a2f13410
commit 66e8fa72bf
135 changed files with 38902 additions and 37757 deletions

View file

@ -8,25 +8,24 @@ import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.application.Platform;
import javafx.scene.control.TextInputDialog;
import java.util.Optional;
/**
*
* 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;
@ -35,6 +34,9 @@ public abstract class GraphAlgo extends Thread {
// Ende Attribute
// Anfang Methoden
/**
* Erzeugt neues Algorithmus-Objekt
*/
public GraphAlgo() {
stepping = true;
waitforrepaint = false;
@ -43,6 +45,11 @@ 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();
@ -50,15 +57,31 @@ public abstract class GraphAlgo extends Thread {
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;
@ -68,6 +91,7 @@ public abstract class GraphAlgo extends Thread {
Thread.sleep(10);
i++;
}
if (hilfe != null) hilfe.setReviewAllowed(false);
g.setStatus(aktuellerZustand);
aktuellerZustand = null;
@ -77,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)
@ -110,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;
@ -125,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;
@ -137,24 +181,22 @@ 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();
public void eingabe() {
Platform.runLater(() -> {
TextInputDialog dialog = new TextInputDialog(); // create an instance
dialog.setTitle("Title");
// other formatting etc
Optional<String> result = dialog.showAndWait();
// this shows the dialog, waits until it is closed, and stores the result
});
}
/**
* Ö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(() -> {
@ -165,22 +207,53 @@ public abstract class GraphAlgo extends Thread {
});
}
/**
* 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"};
}
}
}

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
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();

View file

@ -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<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);

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

@ -18,7 +18,7 @@ import graph.*;
* @author Thomas Schaller
*/
public class GraphAlgo_DominatingSetGreedyA extends GraphAlgo_DominatingSetGreedy {
public class GraphAlgo_DominatingSetGreedyA extends GraphAlgo {
// Anfang Attribute
@ -29,7 +29,7 @@ public class GraphAlgo_DominatingSetGreedyA extends GraphAlgo_DominatingSetGreed
/** Bestimmt besten Knoten nach Strategie:
* Nimm den Knoten mit den meisten Nachbarn
*/
public Knoten bestimmeBesten() {
private Knoten bestimmeBesten() {
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert());
info("Wiederhole für jeden noch nicht markierten Knoten");
@ -47,5 +47,32 @@ public class GraphAlgo_DominatingSetGreedyA extends GraphAlgo_DominatingSetGreed
return bester;
}
// Anfang Methoden
public void fuehreAlgorithmusAus() {
if (g.getAnzahlKnoten()==0) {
return;
}
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht());
info("Solange es noch nicht überdeckte Knoten gibt, wiederhole...");
int nr = 1;
while(knoten.size() > 0) {
info("Bestimme "+(nr++)+". hinzuzufügenden Knoten");
infoIndentMore();
Knoten bester = bestimmeBesten();
bester.setMarkiert(true);
bester.setBesucht(false);
info("Markiere diesen Knoten ...");
List<Knoten> nachbarn = g.getNachbarknoten(bester,kn->!kn.isMarkiert() && !kn.isBesucht());
for(Knoten k : nachbarn) {
k.setBesucht(true);
}
info("... und setze alle bisher nicht überdeckten Nachbarn auf besucht");
knoten = g.getAlleKnoten(kn->!kn.isMarkiert() && !kn.isBesucht());
step();
infoIndentLess();
}// end of while
}
// Ende Methoden
}

View file

@ -17,7 +17,7 @@ import graph.*;
* @author Thomas Schaller
*/
public class GraphAlgo_DominatingSetGreedyB extends GraphAlgo_DominatingSetGreedy {
public class GraphAlgo_DominatingSetGreedyB extends GraphAlgo {
// Anfang Attribute
@ -28,7 +28,7 @@ public class GraphAlgo_DominatingSetGreedyB extends GraphAlgo_DominatingSetGreed
/** Bestimmt besten Knoten nach Strategie:
* Nimm den Knoten mit den wenigsten Nachbarn
*/
protected Knoten bestimmeBesten() {
private Knoten bestimmeBesten() {
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert());
info("Wiederhole für jeden noch nicht markierten Knoten");
@ -46,4 +46,32 @@ public class GraphAlgo_DominatingSetGreedyB extends GraphAlgo_DominatingSetGreed
return bester;
}
// Anfang Methoden
public void fuehreAlgorithmusAus() {
if (g.getAnzahlKnoten()==0) {
return;
}
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht());
info("Solange es noch nicht überdeckte Knoten gibt, wiederhole...");
int nr = 1;
while(knoten.size() > 0) {
info("Bestimme "+(nr++)+". hinzuzufügenden Knoten");
infoIndentMore();
Knoten bester = bestimmeBesten();
bester.setMarkiert(true);
bester.setBesucht(false);
info("Markiere diesen Knoten ...");
List<Knoten> nachbarn = g.getNachbarknoten(bester,kn->!kn.isMarkiert() && !kn.isBesucht());
for(Knoten k : nachbarn) {
k.setBesucht(true);
}
info("... und setze alle bisher nicht überdeckten Nachbarn auf besucht");
knoten = g.getAlleKnoten(kn->!kn.isMarkiert() && !kn.isBesucht());
step();
infoIndentLess();
}// end of while
}
// Ende Methoden
}

View file

@ -18,7 +18,7 @@ import graph.*;
* @author Thomas Schaller
*/
public class GraphAlgo_DominatingSetGreedyC extends GraphAlgo_DominatingSetGreedy {
public class GraphAlgo_DominatingSetGreedyC extends GraphAlgo {
// Anfang Attribute
@ -29,7 +29,7 @@ public class GraphAlgo_DominatingSetGreedyC extends GraphAlgo_DominatingSetGreed
/** Bestimmt besten Knoten nach Strategie:
* Nimm den Knoten mit den meisten Nachbarn
*/
protected Knoten bestimmeBesten() {
private Knoten bestimmeBesten() {
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert());
info("Wiederhole für jeden noch nicht markierten Knoten");
@ -48,5 +48,32 @@ public class GraphAlgo_DominatingSetGreedyC extends GraphAlgo_DominatingSetGreed
return bester;
}
// Anfang Methoden
public void fuehreAlgorithmusAus() {
if (g.getAnzahlKnoten()==0) {
return;
}
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht());
info("Solange es noch nicht überdeckte Knoten gibt, wiederhole...");
int nr = 1;
while(knoten.size() > 0) {
info("Bestimme "+(nr++)+". hinzuzufügenden Knoten");
infoIndentMore();
Knoten bester = bestimmeBesten();
bester.setMarkiert(true);
bester.setBesucht(false);
info("Markiere diesen Knoten ...");
List<Knoten> nachbarn = g.getNachbarknoten(bester,kn->!kn.isMarkiert() && !kn.isBesucht());
for(Knoten k : nachbarn) {
k.setBesucht(true);
}
info("... und setze alle bisher nicht überdeckten Nachbarn auf besucht");
knoten = g.getAlleKnoten(kn->!kn.isMarkiert() && !kn.isBesucht());
step();
infoIndentLess();
}// end of while
}
// Ende Methoden
}

View file

@ -18,7 +18,7 @@ import graph.*;
* @author Thomas Schaller
*/
public class GraphAlgo_DominatingSetGreedyD extends GraphAlgo_DominatingSetGreedy {
public class GraphAlgo_DominatingSetGreedyD extends GraphAlgo {
// Anfang Attribute
@ -29,7 +29,7 @@ public class GraphAlgo_DominatingSetGreedyD extends GraphAlgo_DominatingSetGreed
/** Bestimmt besten Knoten nach Strategie:
* Nimm den Knoten mit den meisten Nachbarn
*/
protected Knoten bestimmeBesten() {
private Knoten bestimmeBesten() {
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert());
info("Wiederhole für jeden noch nicht markierten Knoten");
@ -48,4 +48,32 @@ public class GraphAlgo_DominatingSetGreedyD extends GraphAlgo_DominatingSetGreed
return bester;
}
// Anfang Methoden
public void fuehreAlgorithmusAus() {
if (g.getAnzahlKnoten()==0) {
return;
}
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht());
info("Solange es noch nicht überdeckte Knoten gibt, wiederhole...");
int nr = 1;
while(knoten.size() > 0) {
info("Bestimme "+(nr++)+". hinzuzufügenden Knoten");
infoIndentMore();
Knoten bester = bestimmeBesten();
bester.setMarkiert(true);
bester.setBesucht(false);
info("Markiere diesen Knoten ...");
List<Knoten> nachbarn = g.getNachbarknoten(bester,kn->!kn.isMarkiert() && !kn.isBesucht());
for(Knoten k : nachbarn) {
k.setBesucht(true);
}
info("... und setze alle bisher nicht überdeckten Nachbarn auf besucht");
knoten = g.getAlleKnoten(kn->!kn.isMarkiert() && !kn.isBesucht());
step();
infoIndentLess();
}// end of while
}
// Ende Methoden
}

View file

@ -18,7 +18,7 @@ import graph.*;
* @author Thomas Schaller
*/
public class GraphAlgo_DominatingSetGreedyE extends GraphAlgo_DominatingSetGreedy {
public class GraphAlgo_DominatingSetGreedyE extends GraphAlgo {
// Anfang Attribute
@ -30,7 +30,7 @@ public class GraphAlgo_DominatingSetGreedyE extends GraphAlgo_DominatingSetGreed
* ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
*/
protected Knoten bestimmeBesten() {
private Knoten bestimmeBesten() {
Random r= new Random();
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
@ -67,5 +67,32 @@ public class GraphAlgo_DominatingSetGreedyE extends GraphAlgo_DominatingSetGreed
return bester;
}
// Anfang Methoden
public void fuehreAlgorithmusAus() {
if (g.getAnzahlKnoten()==0) {
return;
}
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht());
info("Solange es noch nicht überdeckte Knoten gibt, wiederhole...");
int nr = 1;
while(knoten.size() > 0) {
info("Bestimme "+(nr++)+". hinzuzufügenden Knoten");
infoIndentMore();
Knoten bester = bestimmeBesten();
bester.setMarkiert(true);
bester.setBesucht(false);
info("Markiere diesen Knoten ...");
List<Knoten> nachbarn = g.getNachbarknoten(bester,kn->!kn.isMarkiert() && !kn.isBesucht());
for(Knoten k : nachbarn) {
k.setBesucht(true);
}
info("... und setze alle bisher nicht überdeckten Nachbarn auf besucht");
knoten = g.getAlleKnoten(kn->!kn.isMarkiert() && !kn.isBesucht());
step();
infoIndentLess();
}// end of while
}
// Ende Methoden
}

View file

@ -18,7 +18,7 @@ import graph.*;
* @author Thomas Schaller
*/
public class GraphAlgo_DominatingSetGreedyF extends GraphAlgo_DominatingSetGreedy {
public class GraphAlgo_DominatingSetGreedyF extends GraphAlgo {
// Anfang Attribute
@ -30,7 +30,7 @@ public class GraphAlgo_DominatingSetGreedyF extends GraphAlgo_DominatingSetGreed
* ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
*/
protected Knoten bestimmeBesten() {
private Knoten bestimmeBesten() {
Random r= new Random();
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
@ -67,4 +67,32 @@ public class GraphAlgo_DominatingSetGreedyF extends GraphAlgo_DominatingSetGreed
return bester;
}
// Anfang Methoden
public void fuehreAlgorithmusAus() {
if (g.getAnzahlKnoten()==0) {
return;
}
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht());
info("Solange es noch nicht überdeckte Knoten gibt, wiederhole...");
int nr = 1;
while(knoten.size() > 0) {
info("Bestimme "+(nr++)+". hinzuzufügenden Knoten");
infoIndentMore();
Knoten bester = bestimmeBesten();
bester.setMarkiert(true);
bester.setBesucht(false);
info("Markiere diesen Knoten ...");
List<Knoten> nachbarn = g.getNachbarknoten(bester,kn->!kn.isMarkiert() && !kn.isBesucht());
for(Knoten k : nachbarn) {
k.setBesucht(true);
}
info("... und setze alle bisher nicht überdeckten Nachbarn auf besucht");
knoten = g.getAlleKnoten(kn->!kn.isMarkiert() && !kn.isBesucht());
step();
infoIndentLess();
}// end of while
}
// Ende Methoden
}

View file

@ -18,7 +18,7 @@ import graph.*;
* @author Thomas Schaller
*/
public class GraphAlgo_DominatingSetGreedyG extends GraphAlgo_DominatingSetGreedy {
public class GraphAlgo_DominatingSetGreedyG extends GraphAlgo {
// Anfang Attribute
@ -30,7 +30,7 @@ public class GraphAlgo_DominatingSetGreedyG extends GraphAlgo_DominatingSetGreed
* ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
*/
protected Knoten bestimmeBesten() {
private Knoten bestimmeBesten() {
Random r= new Random();
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
@ -67,4 +67,32 @@ public class GraphAlgo_DominatingSetGreedyG extends GraphAlgo_DominatingSetGreed
return bester;
}
// Anfang Methoden
public void fuehreAlgorithmusAus() {
if (g.getAnzahlKnoten()==0) {
return;
}
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht());
info("Solange es noch nicht überdeckte Knoten gibt, wiederhole...");
int nr = 1;
while(knoten.size() > 0) {
info("Bestimme "+(nr++)+". hinzuzufügenden Knoten");
infoIndentMore();
Knoten bester = bestimmeBesten();
bester.setMarkiert(true);
bester.setBesucht(false);
info("Markiere diesen Knoten ...");
List<Knoten> nachbarn = g.getNachbarknoten(bester,kn->!kn.isMarkiert() && !kn.isBesucht());
for(Knoten k : nachbarn) {
k.setBesucht(true);
}
info("... und setze alle bisher nicht überdeckten Nachbarn auf besucht");
knoten = g.getAlleKnoten(kn->!kn.isMarkiert() && !kn.isBesucht());
step();
infoIndentLess();
}// end of while
}
// Ende Methoden
}

View file

@ -18,7 +18,7 @@ import graph.*;
* @author Thomas Schaller
*/
public class GraphAlgo_DominatingSetGreedyH extends GraphAlgo_DominatingSetGreedy {
public class GraphAlgo_DominatingSetGreedyH extends GraphAlgo {
// Anfang Attribute
@ -29,7 +29,7 @@ public class GraphAlgo_DominatingSetGreedyH extends GraphAlgo_DominatingSetGreed
/** Bestimmt besten Knoten nach Strategie:
* ein nicht abgedeckten Knoten, der von möglichst vielen schon ausgewählten Knoten die Entfernung 3 hat
*/
protected Knoten bestimmeBesten() {
private Knoten bestimmeBesten() {
Random r = new Random();
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
List<Knoten> nichtabgedeckte = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht() );
@ -70,4 +70,32 @@ public class GraphAlgo_DominatingSetGreedyH extends GraphAlgo_DominatingSetGreed
return bester;
}
// Anfang Methoden
public void fuehreAlgorithmusAus() {
if (g.getAnzahlKnoten()==0) {
return;
}
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht());
info("Solange es noch nicht überdeckte Knoten gibt, wiederhole...");
int nr = 1;
while(knoten.size() > 0) {
info("Bestimme "+(nr++)+". hinzuzufügenden Knoten");
infoIndentMore();
Knoten bester = bestimmeBesten();
bester.setMarkiert(true);
bester.setBesucht(false);
info("Markiere diesen Knoten ...");
List<Knoten> nachbarn = g.getNachbarknoten(bester,kn->!kn.isMarkiert() && !kn.isBesucht());
for(Knoten k : nachbarn) {
k.setBesucht(true);
}
info("... und setze alle bisher nicht überdeckten Nachbarn auf besucht");
knoten = g.getAlleKnoten(kn->!kn.isMarkiert() && !kn.isBesucht());
step();
infoIndentLess();
}// end of while
}
// Ende Methoden
}

View file

@ -18,7 +18,7 @@ import graph.*;
* @author Thomas Schaller
*/
public class GraphAlgo_DominatingSetGreedyI extends GraphAlgo_DominatingSetGreedy {
public class GraphAlgo_DominatingSetGreedyI extends GraphAlgo {
// Anfang Attribute
@ -30,7 +30,7 @@ public class GraphAlgo_DominatingSetGreedyI extends GraphAlgo_DominatingSetGreed
* ein nicht abgedeckten Knoten, der von den ausgewählten Knoten eine möglichst große Entfernung hat
*/
protected Knoten bestimmeBesten() {
private Knoten bestimmeBesten() {
Random r = new Random();
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
List<Knoten> nichtabgedeckte = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht() );
@ -82,4 +82,33 @@ public class GraphAlgo_DominatingSetGreedyI extends GraphAlgo_DominatingSetGreed
return bester;
}
// Anfang Methoden
public void fuehreAlgorithmusAus() {
if (g.getAnzahlKnoten()==0) {
return;
}
List<Knoten> knoten = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht());
info("Solange es noch nicht überdeckte Knoten gibt, wiederhole...");
int nr = 1;
while(knoten.size() > 0) {
info("Bestimme "+(nr++)+". hinzuzufügenden Knoten");
infoIndentMore();
Knoten bester = bestimmeBesten();
bester.setMarkiert(true);
bester.setBesucht(false);
info("Markiere diesen Knoten ...");
List<Knoten> nachbarn = g.getNachbarknoten(bester,kn->!kn.isMarkiert() && !kn.isBesucht());
for(Knoten k : nachbarn) {
k.setBesucht(true);
}
info("... und setze alle bisher nicht überdeckten Nachbarn auf besucht");
knoten = g.getAlleKnoten(kn->!kn.isMarkiert() && !kn.isBesucht());
step();
infoIndentLess();
}// end of while
}
// Ende Methoden
}

View file

@ -1,261 +1,268 @@
#BlueJ package file
dependency1.from=GraphAlgo_DominatingSetGreedyF
dependency1.to=GraphAlgo
dependency1.type=UsesDependency
dependency2.from=GraphAlgo_DominatingSetGreedyF
dependency2.to=GraphAlgo_Moore
dependency2.type=UsesDependency
dependency3.from=GraphAlgo_DominatingSetGreedyG
dependency3.to=GraphAlgo
dependency3.type=UsesDependency
dependency4.from=GraphAlgo_DominatingSetGreedyG
dependency4.to=GraphAlgo_Moore
dependency4.type=UsesDependency
dependency5.from=GraphAlgo_DominatingSetGreedyE
dependency5.to=GraphAlgo
dependency5.type=UsesDependency
dependency6.from=GraphAlgo_DominatingSetGreedyE
dependency6.to=GraphAlgo_Moore
dependency6.type=UsesDependency
dependency7.from=GraphAlgo_DominatingSetGreedyH
dependency7.to=GraphAlgo
dependency7.type=UsesDependency
dependency8.from=GraphAlgo_DominatingSetGreedyH
dependency8.to=GraphAlgo_Moore
dependency8.type=UsesDependency
objectbench.height=157
objectbench.width=1896
package.divider.horizontal=0.6003172085646312
package.divider.vertical=0.829698857736241
package.editor.height=792
package.editor.width=1774
package.editor.x=1919
package.editor.y=0
package.frame.height=1054
package.frame.width=1922
package.numDependencies=8
package.numTargets=31
package.showExtends=true
package.showUses=true
readme.height=60
readme.name=@README
readme.width=49
readme.x=10
readme.y=10
target1.height=50
target1.name=GraphAlgo_ColoringGreedyRandom
target1.showInterface=false
target1.type=ClassTarget
target1.width=260
target1.x=600
target1.y=590
target10.height=50
target10.name=GraphAlgo_DominatingSetGreedyF
target10.showInterface=false
target10.type=ClassTarget
target10.width=260
target10.x=290
target10.y=420
target11.height=50
target11.name=GraphAlgo_DominatingSetGreedyG
target11.showInterface=false
target11.type=ClassTarget
target11.width=260
target11.x=290
target11.y=470
target12.height=50
target12.name=GraphAlgo_TSPGreedy
target12.showInterface=false
target12.type=ClassTarget
target12.width=230
target12.x=600
target12.y=160
target13.height=50
target13.name=GraphAlgo_DominatingSetGreedyD
target13.showInterface=false
target13.type=ClassTarget
target13.width=260
target13.x=290
target13.y=320
target14.height=50
target14.name=GraphAlgo_TSPGenetisch
target14.showInterface=false
target14.type=ClassTarget
target14.width=230
target14.x=600
target14.y=340
target15.height=50
target15.name=GraphAlgo_DominatingSetGreedyE
target15.showInterface=false
target15.type=ClassTarget
target15.width=260
target15.x=290
target15.y=370
target16.height=50
target16.name=GraphAlgo_DominatingSetGenetisch
target16.showInterface=false
target16.type=ClassTarget
target16.width=270
target16.x=290
target16.y=640
target17.height=50
target17.name=GraphAlgo_ZyklusBacktracking
target17.showInterface=false
target17.type=ClassTarget
target17.width=230
target17.x=20
target17.y=640
target18.height=50
target18.name=GraphAlgo_DominatingSetGreedyH
target18.showInterface=false
target18.type=ClassTarget
target18.width=260
target18.x=290
target18.y=520
target19.height=50
target19.name=GraphAlgo_DominatingSetGreedyI
target19.showInterface=false
target19.type=ClassTarget
target19.width=250
target19.x=290
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
target20.height=50
target20.name=GraphAlgo_Moore
target20.showInterface=false
target20.type=ClassTarget
target20.width=210
target20.x=20
target20.y=440
target21.height=50
target21.name=GraphAlgo_BellmanFord
target21.showInterface=false
target21.type=ClassTarget
target21.width=210
target21.x=20
target21.y=560
target22.height=50
target22.name=GraphAlgo_Breitensuche
target22.showInterface=false
target22.type=ClassTarget
target22.width=210
target22.x=20
target22.y=290
target23.height=50
target23.name=GraphAlgo_toplogischeSortierung
target23.showInterface=false
target23.type=ClassTarget
target23.width=250
target23.x=20
target23.y=370
target24.height=50
target24.name=GraphAlgo_DominatingSetBacktracking
target24.showInterface=false
target24.type=ClassTarget
target24.width=290
target24.x=290
target24.y=100
target25.height=50
target25.name=GraphAlgo_ColoringGreedy
target25.showInterface=false
target25.type=ClassTarget
target25.width=240
target25.x=600
target25.y=530
target26.height=50
target26.name=GraphAlgo_EulerkreisExistenz
target26.showInterface=false
target26.type=ClassTarget
target26.width=220
target26.x=20
target26.y=100
target27.height=50
target27.name=GraphAlgo_TSPGreedy2
target27.showInterface=false
target27.type=ClassTarget
target27.width=230
target27.x=600
target27.y=220
target28.height=50
target28.name=GraphAlgo_TiefensucheRek
target28.showInterface=false
target28.type=ClassTarget
target28.width=210
target28.x=20
target28.y=230
target29.height=50
target29.name=GraphAlgo_ColoringBacktracking
target29.showInterface=false
target29.type=ClassTarget
target29.width=250
target29.x=600
target29.y=470
target3.height=50
target3.name=GraphAlgo_MST_Prim
target3.showInterface=false
target3.type=ClassTarget
target3.width=230
target3.x=890
target3.y=100
target30.height=50
target30.name=GraphAlgo_Dijkstra
target30.showInterface=false
target30.type=ClassTarget
target30.width=210
target30.x=20
target30.y=500
target31.height=50
target31.name=GraphAlgo_TSPGreedyOpt
target31.showInterface=false
target31.type=ClassTarget
target31.width=230
target31.x=600
target31.y=280
target4.height=50
target4.name=GraphAlgo_TSPBacktracking
target4.showInterface=false
target4.type=ClassTarget
target4.width=230
target4.x=600
target4.y=100
target5.height=50
target5.name=GraphAlgo_DominatingSetGreedyB
target5.showInterface=false
target5.type=ClassTarget
target5.width=260
target5.x=290
target5.y=220
target6.height=50
target6.name=GraphAlgo
target6.showInterface=false
target6.type=AbstractTarget
target6.width=90
target6.x=310
target6.y=10
target7.height=50
target7.name=GraphAlgo_DominatingSetGreedyC
target7.showInterface=false
target7.type=ClassTarget
target7.width=260
target7.x=290
target7.y=270
target8.height=50
target8.name=GraphAlgo_MST_Kruskal
target8.showInterface=false
target8.type=ClassTarget
target8.width=230
target8.x=890
target8.y=160
target9.height=50
target9.name=GraphAlgo_DominatingSetGreedyA
target9.showInterface=false
target9.type=ClassTarget
target9.width=260
target9.x=290
target9.y=170
#BlueJ package file
dependency1.from=GraphAlgo_DominatingSetGreedyF
dependency1.to=GraphAlgo
dependency1.type=UsesDependency
dependency2.from=GraphAlgo_DominatingSetGreedyF
dependency2.to=GraphAlgo_Moore
dependency2.type=UsesDependency
dependency3.from=GraphAlgo_DominatingSetGreedyG
dependency3.to=GraphAlgo
dependency3.type=UsesDependency
dependency4.from=GraphAlgo_DominatingSetGreedyG
dependency4.to=GraphAlgo_Moore
dependency4.type=UsesDependency
dependency5.from=GraphAlgo_DominatingSetGreedyE
dependency5.to=GraphAlgo
dependency5.type=UsesDependency
dependency6.from=GraphAlgo_DominatingSetGreedyE
dependency6.to=GraphAlgo_Moore
dependency6.type=UsesDependency
dependency7.from=GraphAlgo_DominatingSetGreedyH
dependency7.to=GraphAlgo
dependency7.type=UsesDependency
dependency8.from=GraphAlgo_DominatingSetGreedyH
dependency8.to=GraphAlgo_Moore
dependency8.type=UsesDependency
objectbench.height=140
objectbench.width=750
package.divider.horizontal=0.6003172085646312
package.divider.vertical=0.822463768115942
package.editor.height=661
package.editor.width=1133
package.editor.x=234
package.editor.y=49
package.frame.height=928
package.frame.width=1297
package.numDependencies=8
package.numTargets=32
package.showExtends=true
package.showUses=true
readme.height=60
readme.name=@README
readme.width=49
readme.x=10
readme.y=10
target1.height=50
target1.name=GraphAlgo_ColoringGreedyRandom
target1.showInterface=false
target1.type=ClassTarget
target1.width=290
target1.x=600
target1.y=590
target10.height=50
target10.name=GraphAlgo_DominatingSetGreedyF
target10.showInterface=false
target10.type=ClassTarget
target10.width=280
target10.x=290
target10.y=420
target11.height=50
target11.name=GraphAlgo_DominatingSetGreedyG
target11.showInterface=false
target11.type=ClassTarget
target11.width=290
target11.x=290
target11.y=470
target12.height=50
target12.name=GraphAlgo_TSPGreedy
target12.showInterface=false
target12.type=ClassTarget
target12.width=230
target12.x=600
target12.y=160
target13.height=50
target13.name=GraphAlgo_DominatingSetGreedyD
target13.showInterface=false
target13.type=ClassTarget
target13.width=290
target13.x=290
target13.y=320
target14.height=50
target14.name=GraphAlgo_TSPGenetisch
target14.showInterface=false
target14.type=ClassTarget
target14.width=230
target14.x=600
target14.y=340
target15.height=50
target15.name=GraphAlgo_DominatingSetGreedyE
target15.showInterface=false
target15.type=ClassTarget
target15.width=280
target15.x=290
target15.y=370
target16.height=50
target16.name=GraphAlgo_DominatingSetGenetisch
target16.showInterface=false
target16.type=ClassTarget
target16.width=300
target16.x=290
target16.y=640
target17.height=50
target17.name=GraphAlgo_ZyklusBacktracking
target17.showInterface=false
target17.type=ClassTarget
target17.width=210
target17.x=20
target17.y=410
target18.height=50
target18.name=GraphAlgo_DominatingSetGreedyH
target18.showInterface=false
target18.type=ClassTarget
target18.width=290
target18.x=290
target18.y=520
target19.height=50
target19.name=GraphAlgo_DominatingSetGreedyI
target19.showInterface=false
target19.type=ClassTarget
target19.width=280
target19.x=290
target19.y=570
target2.height=50
target2.name=GraphAlgo_Tiefensuche
target2.showInterface=false
target2.type=ClassTarget
target2.width=210
target2.x=20
target2.y=160
target20.height=50
target20.name=GraphAlgo_Moore
target20.showInterface=false
target20.type=ClassTarget
target20.width=210
target20.x=10
target20.y=480
target21.height=50
target21.name=GraphAlgo_BellmanFord
target21.showInterface=false
target21.type=ClassTarget
target21.width=210
target21.x=10
target21.y=660
target22.height=50
target22.name=GraphAlgo_Breitensuche
target22.showInterface=false
target22.type=ClassTarget
target22.width=210
target22.x=20
target22.y=280
target23.height=50
target23.name=GraphAlgo_toplogischeSortierung
target23.showInterface=false
target23.type=ClassTarget
target23.width=210
target23.x=20
target23.y=350
target24.height=50
target24.name=GraphAlgo_DominatingSetBacktracking
target24.showInterface=false
target24.type=ClassTarget
target24.width=320
target24.x=290
target24.y=100
target25.height=50
target25.name=GraphAlgo_ColoringGreedy
target25.showInterface=false
target25.type=ClassTarget
target25.width=240
target25.x=600
target25.y=530
target26.height=50
target26.name=GraphAlgo_DijkstraMitVorgaenger
target26.showInterface=false
target26.type=ClassTarget
target26.width=210
target26.x=10
target26.y=600
target27.height=50
target27.name=GraphAlgo_EulerkreisExistenz
target27.showInterface=false
target27.type=ClassTarget
target27.width=210
target27.x=20
target27.y=100
target28.height=50
target28.name=GraphAlgo_TiefensucheRek
target28.showInterface=false
target28.type=ClassTarget
target28.width=210
target28.x=20
target28.y=220
target29.height=50
target29.name=GraphAlgo_TSPGreedy2
target29.showInterface=false
target29.type=ClassTarget
target29.width=230
target29.x=600
target29.y=220
target3.height=50
target3.name=GraphAlgo_MST_Prim
target3.showInterface=false
target3.type=ClassTarget
target3.width=230
target3.x=890
target3.y=100
target30.height=50
target30.name=GraphAlgo_ColoringBacktracking
target30.showInterface=false
target30.type=ClassTarget
target30.width=270
target30.x=600
target30.y=470
target31.height=50
target31.name=GraphAlgo_Dijkstra
target31.showInterface=false
target31.type=ClassTarget
target31.width=210
target31.x=10
target31.y=540
target32.height=50
target32.name=GraphAlgo_TSPGreedyOpt
target32.showInterface=false
target32.type=ClassTarget
target32.width=230
target32.x=600
target32.y=280
target4.height=50
target4.name=GraphAlgo_TSPBacktracking
target4.showInterface=false
target4.type=ClassTarget
target4.width=240
target4.x=600
target4.y=100
target5.height=50
target5.name=GraphAlgo_DominatingSetGreedyB
target5.showInterface=false
target5.type=ClassTarget
target5.width=290
target5.x=290
target5.y=220
target6.height=50
target6.name=GraphAlgo
target6.showInterface=false
target6.type=AbstractTarget
target6.width=100
target6.x=310
target6.y=10
target7.height=50
target7.name=GraphAlgo_DominatingSetGreedyC
target7.showInterface=false
target7.type=ClassTarget
target7.width=290
target7.x=290
target7.y=270
target8.height=50
target8.name=GraphAlgo_MST_Kruskal
target8.showInterface=false
target8.type=ClassTarget
target8.width=230
target8.x=890
target8.y=160
target9.height=50
target9.name=GraphAlgo_DominatingSetGreedyA
target9.showInterface=false
target9.type=ClassTarget
target9.width=290
target9.x=290
target9.y=170