+ All Categories
Home > Documents > Backtracking

Backtracking

Date post: 06-Jan-2016
Category:
Upload: glain
View: 50 times
Download: 0 times
Share this document with a friend
Description:
Backtracking. Suchen in Bäumen. Baumbegriffe. Der Suchraum ist die Menge aller für ein Problem bestehenden Lösungskandidaten . Der Suchbaum erzeugt den Suchraum und ermöglicht eine Ordnung. Wurzel. Vater. Kante. (innerer) Knoten. Blatt. Sohn. Suchraum für Mini-Sudoku. - PowerPoint PPT Presentation
13
Backtracking Suchen in Bäumen
Transcript
Page 1: Backtracking

Backtracking

Suchen in Bäumen

Page 2: Backtracking

Baumbegriffe

• Der Suchraum ist die Menge aller für ein Problem bestehenden Lösungskandidaten.

• Der Suchbaum erzeugt den Suchraum und ermöglicht eine Ordnung.

Wurzel

(innerer) Knoten

Blatt

Kante

Sohn

Vater

Page 3: Backtracking

Suchraum für Mini-Sudoku

Hier: 4^3 = 64 Möglichkeiten

Anzahl möglicher Sudokus?• Mini (4er):• Komplett (9er):

Page 4: Backtracking

Möglichkeiten für ein Tennismatch?(drei Gewinnsätze)

Page 5: Backtracking

TripleZeichnen Sie einen Suchbaum, der alle Möglichkeiten generiert, wie aus der Zahlenmenge M = {1, 2, 3, 4, 5, 6} Tripel (i, j, k) zusammengesetzt werden können, so dass jede Zahl um mindestens 2 grösser als ihr Vorgänger ist

Beschreiben Sie zu beiden Bäumen einen Algorithmus (als Struktigramm), der die Kindknoten eines inneren Knotens generiert

Page 6: Backtracking

Permutationen

• a) Schreiben Sie ein Programm, das Ihnen alle vierstelligen Zahlen ausgibt, die mit den Ziffern 1,2,3 gebildet werden können.

• b) Wie kann das Programm erweitert werden, dass es ohne grosse Änderung für n-stellige Zahlen (mit den gleichen Ziffern 1,2,3) funktioniert?

Page 7: Backtracking

Lösung a)int[] zahl = new int[4]; int i, j, k, l; for (i=1; i<=3; i++) {

zahl[0]= i;for (j=1; j<=3; j++) { zahl[1] = j;for (k=1; k<=3; k++) { zahl[2] = k;for (l=1; l<=3; l++) { zahl[3] = l; println(join(nf(zahl, 0), ", ")); ␣ // Ausgabe des Arrays } } }

}

Page 8: Backtracking

Lösung b)int[] zahl = new int[4]; // global definiert void setup() {

generiereZiffernfolge(0); } void generiereZiffernfolge(int momTiefe) {

int i;for(i=1; i<=3; i++) { // Ziffern von 1 bis 3

zahl[momTiefe] = i;if (momTiefe==3) { // sind bei zahl[3], also der vierten Stelle angelangt

println(join(nf(zahl, 0), ", ")); ␣ // Ausgabe des Arrays } else {

generiereZiffernfolge(momTiefe+1); //rekursiver Aufruf}

} }

Page 9: Backtracking

Lösung b)int[] zahl = new int[n]; // global definiert void setup() {

generiereZiffernfolge(0); } void generiereZiffernfolge(int momTiefe) {

int i;for(i=1; i<=3; i++) { // Ziffern von 1 bis 3

zahl[momTiefe] = i;if (momTiefe==n-1) { // sind bei zahl[3], also der vierten Stelle angelangt

println(join(nf(zahl, 0), ", ")); ␣ // Ausgabe des Arrays } else {

generiereZiffernfolge(momTiefe+1); //rekursiver Aufruf}

} }

Page 10: Backtracking

Suchbäume und Rekursion

Die rekursive Programmierung eignet sich gut, um eine Baumstruktur des Suchraums aufzubauen, da sie erlaubt, nur die Anweisungen für die Generierung der Kindknoten auf einer Tiefe anzugeben. Oft übergibt man dabei eine Variable (hier momTiefe), mit deren Hilfe man die Rekursion irgendwann abbricht Es ist jedoch durchaus möglich, den Suchbaum auch iterativ (statt rekursiv) aufzubauen.

Page 11: Backtracking

Backtracking

• Häufig kann ein Baum nicht direkt so konstruiert werden, dass nur Lösungen entstehen. Wir generieren dann einen grösseren Baum aller in Frage kommenden Möglichkeiten und testen diese, ob sie auch wirklich Lösungen sind.

• Bemerken wir beim Generieren einer Teilmöglichkeiten, dass diese unter keinen Umständen zu einer vollen Lösung ausgebaut werden kann, verfolgen wir den entsprechenden Ast im Baum auch nicht mehr weiter.

Page 12: Backtracking

DamenproblemWie viele Möglichkeiten gibt es, 8 Damen auf einem Schachbrett so aufzustellen, dass keine

Dame eine andere bedroht? Etwas überschaubarer: 4 Damen auf 4x4 Brett

Wie viele Möglichkeiten hätten wir uns mit

Backtracking sparen können?

Struktogramm für diesen

Algorithmus (rekursiv?)

Page 13: Backtracking

Sudoku mit Backtracking

Zeichnen Sie ein (grobes) Struktogramm für einen Algorithmus, der mittels Backtracking beliebige Sudokus lösen kann.

Lösungsansatz:1. Trage alle Singletons ein.2. Breche ab, wenn es für eine Zelle

keine Kandidaten gibt.3. Trage in eine leere Zelle einen

Probewert ein.4. Rufe das Programm rekursiv auf.


Recommended