Das Labyrinth

Der Zufalls-Held

Unser Held - ein roter Punkt - muss aus dem Labyrinth entkommen. Der Held ist nicht schlau, aber ausdauernd. An jeder Kreuzung entscheidet er einfach per Zufall, wie er weitergeht.

Start Stop Neu

Ob das zum Ziel ( = Ausgang ) führt? Überlasse den Zufall-Helden seinem Schicksal. Du kannst ja nochmals nach ihm sehen, wenn du diese Seite durchgearbeitet hast.

Du bist der Held

Hier kannst du per Pfeiltasten den Helden immer bis zur nächsten Kurve oder Kreuzung fortbewegen. Sicher bist du schneller am Ausgang als der Zufall-Held.

Start Stop Neu

Hand aufs Herz: Warum warst du besser als der Zufall-Held?
  • Ich wusste, wo der Ausgang liegt.
  • Ich konnte mir immer merken, wo ich schon war.
  • Ich habe weiter als bis zur nächsten Kreuzung geplant.

Du hattest entscheidende Informationen: du kanntest den Plan des Labyrinths und wusstest zu jedem Zeitpunkt, wo auf dem Plan du dich befindest. Das ist doch eher untypisch.

Das Labyrinth ist kleiner

Führe den Helden wieder mit den Pfeiltasten aus dem Labyrinth. Deine Sicht ist diesmal auf Fackel-Leuchtweite eingeschränkt.

Start Stop Neu

Das war jetzt nicht mehr ganz so einfach

Willst du zuvor noch kurz nach dem Zufall-Held sehen? Überrascht?
Der wahre Held braucht ein gute Systematik, die wir jetzt entwickeln. Dazu statten wir den Helden erst einmal mit Kreide aus. Damit malt er jedes begangene Feld im Labyrinth an.

Wird es jetzt einfacher, den Helden aus dem Labyrinth zu führen?

Start Stop Neu

Klar, mit den Markierungen weiß man, wo man überall schon war. Um zu vermeiden, dass man im Kreis geht, versucht man immer, auf noch nicht markierte Felder zu gehen.
Es kann vorkommen, dass man gar keine Wahl hat und ein markiertes Feld nochmals begehen muss. Sollte dies bei dir nicht der Fall gewesen sein, so hast du sehr großes Glück gehabt. Wiederhole das Experiment mit einem anderen Labyrinth.

Algorithmus 'Im Labyrinth'

Das bisherige Vorgehen können wir algorithmisch so beschreiben:
solange nicht am Ausgang 
	falls es ein angrenzendes, nicht markiertes Feld gibt 
		bewege den Helden auf dieses Feld und markiere es 
	sonst 
		bewege den Helden auf ein angrenzendes, markiertes Feld
	
Wenn man nur noch markierte Felder um sich hat, ist man auf dem Holzweg. Man will umkehren. Das ist im obigen Algorithmus allerdings so noch nicht präzisiert. Man möchte also bis zur nächsten Kreuzung zurückgehen. Wenn dort auch schon alle Felder markiert sind, möchte man noch weiter zurück usw. Um 'zurück' zu gehen, muss man immer wissen, wo man her kam.

Der Faden

In der griechischen Sage hat eine kluge Frau (Ariadne) einem wahren Helden (Theseus) erklärt, wie das geht: Man spult einfach einen Faden, den Ariadne-Faden ab.

Hier kannst du den Helden beobachten, wie er mit Kreide und Faden ganz systematisch aus dem Labyrinth findet. Der Ariadne-Faden ist durch die schwarzen Punkte dargestellt.

Start Stop Neu

Aufgabe

Im obigen Experiment arbeitet der Held die Möglichkeiten immer nach denselben Präferenzen ab. Ziehe jede Richtung auf die passende Reihenfolge.

  • Oben
  • Rechts
  • Links
  • Unten
  • Zuerst
  • danach
  • danach
  • zuletzt

Selbst mit Faden

Start Stop Neu

In unserer Darstellung wickelt der Held den Faden wieder auf, wenn er zurück geht. Wenn er das nicht tut, kann er auf die Kreide verzichten, denn besuchte Felder erkennt er dann daran, dass dort der Faden liegt. Das ist genau der originale Vorschlag Ariadnes aus der Sage.

Algorithmus 'Zum Ausgang'

solange nicht am Ausgang 
	falls es ein angrenzendes, nicht markiertes Feld gibt 
		bewege den Helden auf dieses Feld und markiere es 
	sonst 
		bewege den Helden zurück auf das zuletzt begangene Feld
	
Dieser Algorithmus ist ein erstes Beispiel für die Backtracking-Strategie. Im nächsten Abschnitt werden wir dieses Prinzip allgemein beschreiben. Beantworte zuvor noch folgende Frage.

Aufgabe

Wie oft wird jetzt jedes Feld maximal begangen?

Prinzip

Der bisherige Algorithmus verfährt nach dem Prinzip wenn möglich vorwärts, sonst rückwärts. Dieses Prinzip lässt sich auch bei vielen anderen Problemen anwenden.

Voraussetzungen:

  • Das Problem lässt sich durch eine Folge von Entscheidungen lösen
  • Zu jedem Zeitpunkt stehen nur endlich viele Entscheidungen zur Wahl
  • Manchmal - aber nicht immer - ist sofort erkennbar, dass eine mögliche Entscheidung falsch ist

Algorithmus 'Backtracking'

Nicht jede falsche Entscheidung ist sofort als eine solche erkennbar. Es ist z.B. falsch, in eine Sackgasse einzubiegen. Das erkennt man aber erst später, nämlich wenn man merkt, dass es nicht weiter geht. Man kann nun folgendermaßen eine zur Lösung führende Entscheidungsfolge aufbauen:

solange Lösung noch nicht gefunden 
	falls es jetzt eine noch nicht probierte, \
	mögliche Entscheidung gibt
		falls diese nicht erkennbar falsch ist 
			verlängere die Entscheidungsfolge um \
			diese Entscheidung 
			{'treffe die Entscheidung'} 
	sonst
		entferne die letzte Entscheidung aus der \
		Entscheidungsfolge 
		{'nimm die zuletzt getroffene Entscheidung zurück'}
	

Beim Labyrinth ist die Zuordnung so:

  • Entscheidung: Ein angrenzendes Feld, auf welches der Held bewegt wird. Je nachdem, wo sich der Held gerade befindet, gibt es bis zu vier mögliche Entscheidungen.
  • Entscheidungsfolge: Eine Folge begangener, benachbarter Felder - also ein Weg - im Labyrinth.
  • Erkennbar falsch ist eine Entscheidung, wenn sie auf ein bereits begangenes Feld führt.
  • Lösung gefunden: aktuelles Feld ist der Ausgang.

Aufgabe

Gib in den folgenden Situationen an, wieviele Entscheidungen prinzipiell möglich und wieviele davon erkennbar falsch sind.

Möglich:

Davon falsch:
Möglich:

Davon falsch:
Möglich:

Davon falsch:
Möglich:

Davon falsch:
Möglich:

Davon falsch:

Rekursion

Das Backtracking-Prinzip lässt sich elegant als rekursiver Algorithmus formulieren und dann auch so implementieren.

Ein rekursiver Algorithmus ist ein Algorithmus, der sich selbst wieder aufruft.

Algorithmus 'Backtracking Rekursiv'

EF bezeichnet eine Entscheidungsfolge.

falls EF Lösung ist 
	stop 
sonst 
	für alle jetzt möglichen Entscheidungen 
		falls Entscheidung nicht erkennbar falsch 
			verlängere Entscheidungsfolge EF \
			um diese Entscheidung, 
				(die verlängerte \
				Entscheidungsfolge heiße EF') 
			BacktrackingRek(EF')
	
Der Algorithmus wird mit der leeren Entscheidungsfolge gestartet.

Der Stack

Bei Verwendung von Rekursion muss man sich keine Gedanken mehr darüber machen, wie man eine Entscheidung zurücknimmt: der Rechner organisiert dies von sich aus beim Verwalten der rekursiven Aufrufe.

Der Rechner verwaltet eine Datenstruktur Stack ('Stapel').

  • Bei jedem rekursiven Aufruf werden die aktuellen Parameter auf den Stapel gelegt ('gemerkt').
  • Nach Rückkehr ('return') von einem rekursiven Aufruf werden die dann aktuellen Parameter wieder vom Stack eingelesen.

Der Stack

  • ZumAusgangRekursiv(EF)
  •     falls EF = Lösung
  •         stop
  •     sonst
  •         bestimme die Menge M der möglichen Richtungen
  •         für alleRichtungen X aus M
  •             falls Feld in Richtung X nicht besucht
  •                 ZumAusgangRekursiv(EF + X)
  • return

Start Nächster Schritt Stop Neu

Damen

Das N-Damen-Problem

Stelle 8 Damen so auf ein Schachbrett, dass keine Dame eine andere bedroht. Eine Dame kann horizontal, vertikal und diagonal schlagen.

Versuche es selbst

Du kannst das Schachbrett auch verkleinern. Bei Größe n musst du n Damen auf einem n*n Schachbrett unterbringen. Ein Klick auf eine Dame entfernt sie wieder.

Quinto

Über das Modul