faecher:informatik:oberstufe:graphen:zpg:hilfekarten:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:graphen:zpg:hilfekarten:start [14.11.2022 17:54] Frank Schiebelfaecher:informatik:oberstufe:graphen:zpg:hilfekarten:start [17.11.2022 09:24] (aktuell) – [Bearbeiten - Panel] Frank Schiebel
Zeile 110: Zeile 110:
  
   // füge alle nicht besuchten Nachbarknoten der Liste hinzu   // füge alle nicht besuchten Nachbarknoten der Liste hinzu
-  for(Knoten nachbar : g.getNachbarKnoten(k)) {+  for(Knoten nachbar : g.getNachbarknoten(k)) {
     if(!nachbar.isMarkiert() && !toDo.contains(nachbar)) {     if(!nachbar.isMarkiert() && !toDo.contains(nachbar)) {
       toDo.add(0, n); //füge am Anfang der Liste hinzu       toDo.add(0, n); //füge am Anfang der Liste hinzu
Zeile 125: Zeile 125:
 </panel> </panel>
 <panel title="Rekursiv arbeiten"> <panel title="Rekursiv arbeiten">
-Um rekursiv zu arbeiten, benötigt man neben ''fuehreAlgorithmusAus()'' noch eine weitere Methode. Diese ist die rekursive Methode. ''fuehreAlgorithmusAus()'' ruft sie mit dem Startknoten als Parameter auf.+Standartmäßig wird beim Start des Algorithmus einmal die Methode ''fuehreAlgorithmusAus()'' aufgerufen. Um rekursiv zu arbeiten, benötigt man neben ''fuehreAlgorithmusAus()'' noch eine weitere Methode ''fuehreAlgorithmusAus()'' ruft diese mit dem Startknoten als Parameter auf, im folgenden kann diese Methode sich dann wiederum rekursiv selbst aufrufen:
  
 <code java> <code java>
Zeile 150: Zeile 150:
  
     // Rekursiver Aufruf mit allen Nachbarknoten     // Rekursiver Aufruf mit allen Nachbarknoten
-    for(Knoten nachbar : g.getNachbarKnoten(k)) {+    for(Knoten nachbar : g.getNachbarknoten(k)) {
       rekursiveMethode(nachbar);       rekursiveMethode(nachbar);
     }     }
Zeile 158: Zeile 158:
 </code> </code>
  
 +</panel>
 +
 +<panel title="Backtracking">
 +
 +Backtracking lässt sich am leichtesten rekursiv implementieren.
 +
 +<code java>
 +import java.util.ArrayList;
 +</code>
 +
 +<code java>
 +public void fuehreAlgorithmusAus() {
 +  // Starte Backtracking mit Startknoten
 +  ArrayList<String> loesung = backtracking(getStartKnoten());
 +  // Wenn Lösung gefunden, dann anzeigen
 +  if(loesung != null) g.restoreStatus(loesung);
 +  step();
 +}
 +
 +public ArrayList<String> backtracking(Knoten k){
 +  // Bisher keine Lösung gefunden
 +  ArrayList<String> loesung = null;
 +
 +  // Abbruchbedingung: Lösung gefunden
 +  if (k.isMarkiert()) {
 +    step();                       // Ausführung unterbrechen
 +    loesung = g.saveStatus();     // Lösung merken
 +  } 
 +  // Rekursionsschritt
 +  else {
 +    // aktuellen Zustand sichern
 +    ArrayList<String> aktuellerZustand = g.saveStatus();
 +
 +    // Probiere alle Möglichkeiten 
 +    // hier alle nicht markierten, ausgehenden Kanten
 +    ArrayList<Kante> ausgehend = g.getAusgehendeKanten(k);
 +    ArrayList<Kante> nichtMarkiert =  g.beschraenkeKantenAuf(ausgehend, Graph.NICHTMARKIERT, Graph.BELIEBIG);
 +
 +    for(Kante ausgehendeKante : nichtMarkiert) {
 +      // Führe Aktionen aus und anzeigen 
 +      k.setMarkiert(true);
 +      ausgehendeKante.setMarkiert(true);
 +      step();
 +
 +      // Rekursion
 +      Knoten nachbar = ausgehendeKante.getAnderesEnde(k);
 +      loesung =  backtracking(nachbar);
 +
 +      // Rückschritt
 +      g.restoreStatus(aktuellerZustand);
 +      step();
 +      if(loesung != null) break;
 +    }
 +  }
 +  return loesung;
 +}
 +</code>
 +</panel>
 +<panel title="Ausgabe von Informationen/Ergebnissen">
 +Um Informationen oder Ergebnisse eigener Algorithmen auszugeben, bietet der Graphentester drei Möglichkeiten an:
 +
 +==== Java Konsole ====
 +
 +Man kann mit ''System.out.println()'' Dinge auf die Konsole schreiben. Zu beachten ist dabei, dass die JavaFX-Applikation die Konsole nicht automatisch öffnet, wenn man etwas ausgibt - man muss diese im BlueJ-Menü ''Ansicht'' oder mit der Tastenkombination ''CTRL-T'' öffnen, um die Ausgabe sehen zu können.
 +
 +==== melde() ====
 +
 +Mit der Methode ''melde(String Ausgabe)'' erzeugt man ein Fenster mit O.K. Button, in dem der Ausgabestring angezeigt wird. Dabei kann man innerhalb des Ausgabestrings auch ''\n'' verwenden, um eine neue Zeile zu beginnen.
 +
 +   melde("Apfel\nBirne\nMango");
 +
 +{{:faecher:informatik:oberstufe:graphen:zpg:hilfekarten:okwindow.png|}}
 +
 +==== info() ====
 +
 +{{ :faecher:informatik:oberstufe:graphen:zpg:hilfekarten:help.png?320|}}
 +
 +Mit Hilfe der Methoden ''info(String s)'', ''resetInfo()'', ''infoIndentMore()'' und ''infoIndentLess()'' kann man Informationen -- auch während des Programmablaufs -- innerhalb des Hilfefensters ausgeben. Das Hilfe-Fenster kann man im Graphentester im Menü ''Hilfe->Hilfefenster anzeigen'' aktivieren
 +
 +Beispiel: 
 +
 +<code java>
 +info("Setze Eingangsgrad aller Knoten.");
 +infoIndentMore();
 +for(Knoten k: alleKnoten) {
 +    int Eingangsgrad = g.getEingehendeKanten(k).size();
 +    info("Setze Eingangsgrad von " + k.getInfotext());
 +    k.setWert(Eingangsgrad);
 +}
 +infoIndentLess();
 +info("Eingangsgrade gesetzt");
 +</code>
 +
 +{{:faecher:informatik:oberstufe:graphen:zpg:hilfekarten:hilfefenster.png |}}
 </panel> </panel>
 </accordion> </accordion>
  • faecher/informatik/oberstufe/graphen/zpg/hilfekarten/start.1668444885.txt.gz
  • Zuletzt geändert: 14.11.2022 17:54
  • von Frank Schiebel