Das Acht-Damenproblem



Ähnliche Dokumente
Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Erstellen von x-y-diagrammen in OpenOffice.calc

Professionelle Seminare im Bereich MS-Office

Zeichen bei Zahlen entschlüsseln

Primzahlen und RSA-Verschlüsselung

Was meinen die Leute eigentlich mit: Grexit?

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Übungen für Woche 10

Wir machen neue Politik für Baden-Württemberg

Umgekehrte Kurvendiskussion

SUDOKU - Strategien zur Lösung

Computeria Rorschach Mit Excel Diagramme erstellen

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Was ist Sozial-Raum-Orientierung?

Abschlussprüfung Realschule Bayern II / III: 2009 Haupttermin B 1.0 B 1.1

Anleitung: Sammel-Rechnungen für Lizenzen bei Swiss Basketball

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Eva Douma: Die Vorteile und Nachteile der Ökonomisierung in der Sozialen Arbeit

Lineare Funktionen. 1 Proportionale Funktionen Definition Eigenschaften Steigungsdreieck 3

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

Im Folgenden wird Ihnen an einem Beispiel erklärt, wie Sie Excel-Anlagen und Excel-Vorlagen erstellen können.

ARCO Software - Anleitung zur Umstellung der MWSt

Lichtbrechung an Linsen

Leichte-Sprache-Bilder

Sollsaldo und Habensaldo

Zahlen auf einen Blick

EINFACHES HAUSHALT- KASSABUCH

Jede Zahl muss dabei einzeln umgerechnet werden. Beginnen wir also ganz am Anfang mit der Zahl,192.

Informationsblatt Induktionsbeweis

Zahlenwinkel: Forscherkarte 1. alleine. Zahlenwinkel: Forschertipp 1

IBIS Professional. z Dokumentation zur Dublettenprüfung

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Windows 7: Neue Funktionen im praktischen Einsatz - Die neue Taskleiste nutzen

Gleichungen Lösen. Ein graphischer Blick auf Gleichungen

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Windows XP Jugendschutz einrichten. Monika Pross Molberger PC-Kurse

Professionelle Seminare im Bereich MS-Office

Was man mit dem Computer alles machen kann

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen

B: bei mir war es ja die X, die hat schon lange probiert mich dahin zu kriegen, aber es hat eine Weile gedauert.

Geld Verdienen im Internet leicht gemacht

1. Einführung. 2. Die Abschlagsdefinition

Erklärung zu den Internet-Seiten von

5. Bildauflösung ICT-Komp 10

ONLINE-AKADEMIE. "Diplomierter NLP Anwender für Schule und Unterricht" Ziele

Die Post hat eine Umfrage gemacht

Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Wichtige Forderungen für ein Bundes-Teilhabe-Gesetz

Plotten von Linien ( nach Jack Bresenham, 1962 )

Menü auf zwei Module verteilt (Joomla 3.4.0)

1 topologisches Sortieren

TYPO3-Zusatzkurs für

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen?

Lineare Gleichungssysteme

Qualitätsbedingungen schulischer Inklusion für Kinder und Jugendliche mit dem Förderschwerpunkt Körperliche und motorische Entwicklung

Das Persönliche Budget in verständlicher Sprache

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Eigenen Farbverlauf erstellen

So gehts Schritt-für-Schritt-Anleitung

Sich einen eigenen Blog anzulegen, ist gar nicht so schwer. Es gibt verschiedene Anbieter. ist einer davon.

Einstellungen für SEPA-Lastschriften in der VR-NetWorld-Software

Alle gehören dazu. Vorwort

Antrag für ein Schlichtungs-Verfahren

EINMALEINS BEZIEHUNGSREICH

Informationen zum Ambulant Betreuten Wohnen in leichter Sprache

Erklärung zum Internet-Bestellschein

Sonderrundschreiben. Arbeitshilfe zu den Pflichtangaben in Immobilienanzeigen bei alten Energieausweisen

Dossier: Rechnungen und Lieferscheine in Word

Satzhilfen Publisher Seite Einrichten

Zwischenablage (Bilder, Texte,...)

-Inhalte an cobra übergeben

Prozentrechnung. Wir können nun eine Formel für die Berechnung des Prozentwertes aufstellen:

Wie halte ich Ordnung auf meiner Festplatte?

Was ist das Budget für Arbeit?

Catherina Lange, Heimbeiräte und Werkstatträte-Tagung, November

a n auf Konvergenz. Berechnen der ersten paar Folgenglieder liefert:

Serienbrieferstellung in Word mit Kunden-Datenimport aus Excel

Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut wird, dass sie für sich selbst sprechen können Von Susanne Göbel und Josef Ströbl

Kommentartext Medien sinnvoll nutzen

Anwendungsbeispiele Buchhaltung

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

2.1 Präsentieren wozu eigentlich?

PowerMover. Ein halbautomatischer Sortierer für Outlook-PowerUser. Ein Add-In für die Versionen 2007 und 2010

Rekursionen. Georg Anegg 25. November Methoden und Techniken an Beispielen erklärt

s zu Hause lesen

9 Auto. Rund um das Auto. Welche Wörter zum Thema Auto kennst du? Welches Wort passt? Lies die Definitionen und ordne zu.

6.2 Scan-Konvertierung (Scan Conversion)

Urlaubsregel in David

Wichtig ist die Originalsatzung. Nur was in der Originalsatzung steht, gilt. Denn nur die Originalsatzung wurde vom Gericht geprüft.

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

UserManual. Handbuch zur Konfiguration einer FRITZ!Box. Autor: Version: Hansruedi Steiner 2.0, November 2014

Berechnungen in Access Teil I

1. Weniger Steuern zahlen

Anwendungsbeispiele Buchhaltung

Microsoft Excel 2010 Mehrfachoperation

Wie melde ich meinen Verein bei BOOKANDPLAY an?

Transkript:

Das 8-Damen Problem v. 8/23 Das Acht-Damenproblem Es handelt sich hier um ein Schachproblem, das erstmals von M. Bezzel 845 in einer Schachzeitung veröffentlicht wurde, aber vorerst unbeachtet blieb. Erst als die Aufgabe 85 vom blinden Schachexperten Dr. Nauk erneut zur Diskussion gestellt wurde, fand sie breites Echo. Als Nauk 3 Monate später alle 92 Lösungen publizierte, hatte der berühmte C.F. Gauss erst 72 Lösungen gefunden! Die Aufgabe: Man finde alle Möglichkeiten, 8 Damen auf einem Schachbrett so zu platzieren, dass keine eine andere bedroht. (Eine Dame kann auf allen Feldern waagrecht, senkrecht und diagonal schlagen) Eine Lösung ist etwa: Wir werden die Aufgabe aber verallgemeinern: Es sind alle Lösungen zu suchen, wie man n Damen auf einem n mal n großen Schachbrett platzieren kann, ohne dass sie einander bedrohen. Als Lösungsstrategie bietet sich hier das Backtracking an..)wir beginnen mit dem leeren Brett 2.)Die Platzierung wird schrittweise immer um eine Dame erweitert, es entsteht eine hierarchische Baumstruktur 3.)Wird bei der Positionierung einer weiteren Dame festgestellt, dass sie auf einem bedrohten Feld steht, werden mit dieser Platzierung keine weiteren Schritte mehr unternommen (Backtracking zur letzten gültigen Platzierung) 4.)Wenn n Damen zu platzieren versucht wurden, sind wir fertig Wie beschreiben wir das Brett: Da n Damen auf dem nxn Brett sein müssen, ist klar, dass in jeder Zeile und in jeder Spalte genau eine Dame stehen muss. (Zwei würden einander schon bedrohen) Arbeiten wir zeilenweise. Dann müssen wir angeben, an welcher Position die Dame in dieser Zeile stehen soll. Dazu ist eine Numerierung der waagrechten Positionen mit,,2,3,4,...n- geeignet, die die Koordinate der Dame angibt. Und diese Werte stecken wir in eine Liste, die die Zeilen des Bretts von unten nach oben darstellt. Wolfgang Urban, HIB Wien

Das 8-Damen Problem v. 8/23 Obige Lösung entspräche somit der Liste [,4,7,5,2,7,,3] Nebenbei: Das n-damenproblem scheint (es gibt aber noch keinen Beweis) ein NP-schwieriges Problem (not polynomial time solvable) zu sein. Das heißt, dass es keinen Lösungsalgorithmus gibt, der die Aufgabe in polynomialer Zeit lösen kann. Die Rechenzeit steigt also exponentiell mit der Zahl n, und dieses Verhalten dürfte wahrscheinlich nicht verbesserbar sein. Beachte: Bereits auf dem n=8 Schachbrett gibt es 8 8 = 677726 mögliche Stellungen von 8 Damen! Ein geniales Programm, das alles in einem Schlag löst, können wir nicht erwarten. Welche Funktionen benötigen wir? eine Funktion, die feststellt, ob ein gewisses Feld von einer der bisher aufgestellten Damen bedroht wird. Wir nennen sie bedroht und übergeben ihr die zu testende Position der Dame und die Liste teilloesung der bereits aufgestellten Damen. eine Funktion die für jede Zeile des Bretts versuchsweise eine Dame aufstellt. Ist dies nach Spielregel möglich, wird die nächste Dame nach den selben Regeln (Rekursion!) zu setzen versucht. Ist es nicht möglich, werden dieser Ort und damit auch alle mit dieser Positionierung folgenden Platzierungen sofort verworfen. Wir nennen diese Funktion solve und übergeben ihr die Zahl der zu setzenden Damen. Damit ist dann ja auch die Brettgröße klar. Weiters nehmen wir für die Rekursion die Liste der bereits gesetzten Damen mit. Diese soll loesung heißen, weil sie sich dieser immer mehr annähert. Bange Frage: wird die Rekursion enden? Ja, denn bei jedem Aufruf ist eine Dame weniger übrig. Sind alle positioniert, sind wir fertig. Die Funktion 'bedroht': Wann ist die Position pos bedroht? pos selbst ist ja eine Zahl von bis n- und gibt die waagrechte Koordinate einer Position an. Die vertikale Koordinate ist die über der letzten bearbeiteten Zeile, deren Nummer wir aus der Länge der übergebenen Teilliste erfahren können. Eine Test-Dame ist bedroht, wenn eine bereits gesetzte Dame.)senkrecht drunter steht. (Drüber kann nicht passieren, da wir zeilenweise nach oben aufbauen.) Was heißt senkrecht drunter: pos hat den selben Zahlenwert wie eine bereits gesetzte Dame. 2.)in der selben Zeile steht. Das kann aber nie passieren, da wir immer genau eine Dame pro Zeile setzen. 3.)auf der selben Diagonale links oder rechts hinunter steht. Das wird schwierig und verlangt Vektorrechnung: Die Koordinaten der Testdame sind xtest = pos und ytest = len(teilloesung), also die neue aktuelle y-koordinate, da die Länge der Liste immer um eins über dem Index des letzten Elements steht,. (Eine Liste der Länge N hat die Bestandteile L[], L[],...L[N-]) Die bereits gesetzten Damen haben die Koordinaten xqueen = teilloesung[queen] und y=queen, wenn wir mit queen den Index in der Liste bezeichnen. Wann liegen nun beide auf der selben Diagonale? Der Unterschied ihrer x-werte ist bis aufs Vorzeichen gleich dem Unterschied ihrer y-werte (Mathematiker sprechen von Anstieg oder -). Wolfgang Urban, HIB Wien 2

Das 8-Damen Problem v. 8/23 def bedroht(pos,teilloesung): # falls das Brett noch leer war if teilloesung==[]: return # vertikale Koordinate ist bereits vergeben if pos in teilloesung: return # diagonal xtest = pos ytest = len(teilloesung) # teste alle bereits gesetzten Damen for queen in range(len(teilloesung)): xqueen = teilloesung[queen] yqueen = queen if abs(ytest-yqueen)==abs(xtest-xqueen): return return eine einzelne Dame ist nie bedroht eine andere Dame steht genau darunter und bedroht Übereinstimmung bedeutet Bedrohung keine Bedrohung vorgefunden Testen wir die Funktion sofort! Zuerst eine senkrechte Bedrohung, dann eine diagonale, dann keine. >>> bedroht(2,[3,,2,]) >>> bedroht(4,[3,,2,]) >>> bedroht(8,[3,,2,]) Die Funktion 'solve': Sie probiert alle Möglichkeiten durch und verfolgt nur richtige Teillösungen weiter. Da wir mehrere Lösungen erwarten und die Funktion rekursiv sein wird, nehmen wir eine globale Variable antwort, in der wir alle gefundenen Lösungen protokollieren. Aufrufparameter: Die Anzahl n der zu setzenden Damen, was der Brettgröße gleichkommt. Die (bisherige Teil-)Lösung solution müssen wir auch übergeben. def solve(n,solution): global antwort # wenn alle n Damen in der Liste sind if len(solution)==n: antwort.append(solution) return # jede moegliche x-position for x in range(n): if not bedroht(x,solution): solve(n,solution+[x]) wenn wir fertig sind sonst: jede waagrechte Koordinate testen, nur eine unbedrohte Position wird weiter bearbeitet return Wolfgang Urban, HIB Wien 3

Das 8-Damen Problem v. 8/23 Jetzt noch eine freundliche Startfunktion, und wir können die Lösung unserer gestellten Aufgabe angehen! def queens(anzahl): global antwort antwort = [] anfangs ist die Lösung leer solve(anzahl,[]) for i in range(len(antwort)): print '%3d: '%(i+),antwort[i] die Ausgabe der Zählung soll mit beginnen Ein Beispiellauf: >>> queens(5) : [, 2, 4,, 3] 2: [, 3,, 4, 2] 3: [, 3,, 2, 4] 4: [, 4, 2,, 3] 5: [2,, 3,, 4] 6: [2, 4,, 3, ] 7: [3,, 2, 4, ] 8: [3,, 4, 2, ] 9: [4,, 3,, 2] : [4, 2,, 3, ] Das 5-Damenproblem hat also unterschiedliche Lösungen. Für Neugierige, die nicht warten wollen: Die Lösungsanzahl des n-damenproblems: n Anzahl 2 3 4 5 6 7 8 9 2 2 4 4 92 352 724 268 42 (Für diese Experimente solltest Du die print-anweisung in queens aber besser entfernen, und nur die Länge der Antwort zurückgeben. Und beachte: eine Dame mehr bedeutet ab n=8 nicht 'etwas' mehr Rechenzeit, sondern 'deutlich viel' mehr!) Wolfgang Urban, HIB Wien 4

Das 8-Damen Problem v. 8/23 Perfektion: Wenn Du die beiden Lösungen von queens(4) berechnest und vergleichst wirst Du feststellen, dass sie zwar unterschiedlich sind, aber nicht wirklich anders die eine ist das Spiegelbild der anderen! Wir können nun fragen, wie viele Lösungen das n-damenproblem besitzt, wenn wir alle durch Symmetrieoperationen entstandenen Lösungen weglassen. Etwas Mathe-Nachhilfe: Das Brettquadrat hat für uns 8 gleichwertige Ansichten. (Wenn das Brett richtig liegen soll mit dem weißen Eckfeld rechts - sind es nur 4). Wie können wir die Transformation des 'nullten' Zustandes in die anderen beschreiben? Wir sehen uns das in Koordinaten an. Original Drehung 9 Drehung 8 Drehung 27 x / y n-y / x n-x / n-y y / n-x Spiegelung x-achse Spiegelung y-achse Spiegel. Diagonale Spiegel 2. Diagonale x / n-y n-x / y y / x n-y / n-x Nun braucht man Funktionen, die eine entsprechend transformierte Lösung zurückliefern. Ist l die zu bearbeitende Liste, so brauchen wir nur x/y durch x/l[x] zu ersetzen, und haben die passenden Koordinaten. Die umgerechneten Werte tragen wir in die vorbereitete Rückgabeliste ein. Wolfgang Urban, HIB Wien 5

Das 8-Damen Problem v. 8/23 def mirrorx(l): lnew = l[:] lnew.reverse() def mirrory(l): n = len(l)- lnew[x]=n-l[x] das geht mit Listenmethode am schnellsten Brettgröße n ermitteln Rückgabeliste vorbereiten jedes Element der alten Liste in die neue eintragen def turn8(l): n = len(l)- lnew[n-x]=n-l[x] def mirrord(l): n = len(l)- lnew[l[x]]=x def mirrord(l): n = len(l)- lnew[n-l[x]]=n-x def turn9(l): n = len(l)- lnew[n-l[x]]=x def turn27(l): n = len(l)- lnew[l[x]]=n-x In der Hauptfunktion distinctqueens fügen wir antwort[] in dist ein entfernen alle symmetrischen Bilder von antwort[] aus antwort, falls sie dort noch vorhanden sind (manche Lösungen bleiben gleich, wenn man sie dreht oder spiegelt dann sind sie bereits vorher entfernt. Denke an die zwei Lösungen von queens(4)). Wir machen so weiter, bis antwort leer ist. Wolfgang Urban, HIB Wien 6

Das 8-Damen Problem v. 8/23 def distinctqueens(anzahl): global antwort antwort = [] solve(anzahl,[]) dist = [] while antwort!= []: solution,antwort = antwort[],antwort[:] dist.append(solution) Lösungen bestimmen unterschiedliche Lösungen die erste ist sicher neu for f in [mirrorx,mirrory,turn8, \ mirrord,mirrord,turn9,turn27]: symm = f(solution) if symm in antwort: antwort.remove(symm) for i in range(len(dist)): print "%3d:"%(i+),dist[i] alle symmetrischen Bilder erzeugen wenn vorhanden, entfernen Bildschirmausgabe Ein Testlauf: >>> distinctqueens(8) : [, 4, 7, 5, 2, 6,, 3] 2: [, 5, 7, 2, 6, 3,, 4] 3: [, 3, 5, 7, 2,, 6, 4] 4: [, 4, 6,, 2, 7, 5, 3] 5: [, 4, 6, 3,, 7, 5, 2] 6: [, 5,, 6, 3, 7, 2, 4] 7: [, 5, 7, 2,, 3, 6, 4] 8: [, 6, 2, 5, 7, 4,, 3] 9: [, 6, 4, 7,, 3, 5, 2] : [2, 4,, 7,, 6, 3, 5] : [2, 4, 7, 3,, 6,, 5] 2: [2, 5,, 4, 7,, 6, 3] Du erkennst vielleicht die erste Lösung wieder sie ist am Anfang des Textes abgebildet! Jetzt kennen wir die Lösung genau: Wolfgang Urban, HIB Wien 7

Das 8-Damen Problem v. 8/23 n Anzahl 2 3 4 5 6 7 8 9 2 6 2 46 92 Das 8-Damenproblem hat 92 verschiedene Lösungen. 2 davon sind tatsächlich unterschiedlich, die übrigen 8 gehen durch Drehung oder Spiegelung aus ihnen hervor. Alternative Version: Man könnte auch einen Lösungsweg versuchen: Belege alle Felder des Brettes mit der Markierung 'sicher'. Setze eine Dame in die erste Zeile. Alle bedrohten Felder des Brettes werden mit 'bedroht' gekennzeichnet. Beim Setzen der weiteren Damen braucht man nun nicht wie oben alle möglichen horizontalen Koordinaten durchzuprobieren, sondern nur diejenigen, deren Markierung 'sicher' lautet. Vorteil: viel weniger Tests, seltenere Rückzüge im Backtracking (nur dann, wenn eine gesamte Zeile 'bedroht' ist und keine Dame aufnehmen kann). Nachteil: bei jedem Rekursionsschritt muss die gesamte Brettstruktur mit übergeben werden (Schachcomputer müssen dies tun und verwenden trickreich komprimierte (spart Speicherplatz) Feldinformationen, die allerdings immer wieder aus- und eingepackt werden müssen (kostet Rechenzeit). Weitere Aufgabenstellungen: Was ist die kleinste Zahl von Damen auf einem nxn-brett, sodass alle Felder des Bretts entweder besetzt oder bedroht sind? (n=8 Antwort=5) Was ist die kleinste Zahl von Damen auf einem nxn-brett, sodass alle Felder des Bretts besetzt oder bedroht sind, wobei keine Dame eine andere Dame bedrohen darf? Und wieviele unterschiedliche Stellungen gibt es dabei jeweils? Wie viele andere Schachfiguren lassen sich derart positionieren? Und jewqeils in wie vielen Möglichkeiten? Leider sind alle diese Fragestellungen vermutlich NP-schwere Probleme mit exponentieller Laufzeit. Aber vielleicht findest ja Du einen polynomialen Algorithmus! Wolfgang Urban, HIB Wien 8