mirror of
https://codeberg.org/qg-info-unterricht/zpg-graphentester.git
synced 2026-03-25 04:58:24 +01:00
First Commit (Fobi)
This commit is contained in:
commit
2bff291a51
336 changed files with 88781 additions and 0 deletions
80
algorithmen/GraphAlgo_ZyklusBacktracking.java
Normal file
80
algorithmen/GraphAlgo_ZyklusBacktracking.java
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
package algorithmen;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Collections;
|
||||
import java.nio.file.*;
|
||||
|
||||
import graph.*;
|
||||
/**
|
||||
* Dieser Algorithmus ist ein Beispiel für einen Backtracking-Algorithmus.
|
||||
* Er sucht einen Zyklus im Graphen.
|
||||
* Algorithmus: Backtracking
|
||||
*
|
||||
* @version 1.0 from 10.12.2020
|
||||
* @author Thomas Schaller
|
||||
*/
|
||||
|
||||
public class GraphAlgo_ZyklusBacktracking extends GraphAlgo {
|
||||
|
||||
// Anfang Attribute
|
||||
|
||||
public String getBezeichnung() {
|
||||
return "Zyklensuche (Backtracking)";
|
||||
}
|
||||
|
||||
public void fuehreAlgorithmusAus() {
|
||||
List<String> loesung = backtracking(getStartKnoten());
|
||||
if(loesung != null) g.setStatus(loesung);
|
||||
step();
|
||||
}
|
||||
|
||||
public List<String> backtracking(Knoten k){
|
||||
|
||||
List<String> loesung = null;
|
||||
|
||||
info("Untersuche Knoten "+g.getNummer(k));
|
||||
|
||||
// Abbruchbedingung
|
||||
if (k.isMarkiert()) {
|
||||
// Ausführung unterbrechen
|
||||
info("Knoten ist schon bearbeitet => Zyklus gefunden");
|
||||
step();
|
||||
loesung = g.getStatus();
|
||||
} else {
|
||||
|
||||
List<String> aktuellerZustand = g.getStatus();
|
||||
info("Knoten ist noch nicht bearbeitet => Speichere Zustand des Graphen");
|
||||
|
||||
// Aktion mit Knoten durchführen, z.B. markieren
|
||||
k.setMarkiert(true);
|
||||
info("Markiere den Knoten und betrachte alle nicht markierten, ausgehenden Kanten");
|
||||
// Ausführung unterbrechen
|
||||
step();
|
||||
|
||||
// Probiere alle Möglichkeiten (
|
||||
// hier alle nicht markierten, ausgehenden Kanten
|
||||
List<Kante> ausgehend = g.getAusgehendeKanten(k, ka->!ka.isMarkiert());
|
||||
infoIndentMore();
|
||||
int nr=1;
|
||||
for(Kante ausgehendeKante : ausgehend) {
|
||||
k.setMarkiert(true);
|
||||
ausgehendeKante.setMarkiert(true);
|
||||
info("Probiere Kante "+nr);
|
||||
infoIndentMore();
|
||||
Knoten nachbar = ausgehendeKante.getAnderesEnde(k);
|
||||
loesung = backtracking(nachbar);
|
||||
infoIndentLess();
|
||||
g.setStatus(aktuellerZustand);
|
||||
info("Kehre zurück");
|
||||
step();
|
||||
if(loesung != null) break;
|
||||
nr++;
|
||||
}
|
||||
infoIndentLess();
|
||||
}
|
||||
return loesung;
|
||||
}
|
||||
// Ende Methoden
|
||||
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue