Die einzige symmetrische Lösung für das Acht-Königinnen-Puzzle (außer Rotationen und Reflexionen von sich selbst)
Das Acht-Königinnen-Puzzle ist das Problem, acht Schachköniginnen auf einem 8 × 8-Schachbrett zu platzieren, so dass sich keine zwei Königinnen gegenseitig bedrohen. Daher erfordert eine Lösung, dass keine zwei Damen dieselbe Zeile, Spalte oder Diagonale verwenden. Das Acht-Königinnen-Puzzle ist ein Beispiel für das allgemeinere n Königinnenproblem bei dem n nicht angreifende Königinnen auf einem n × n platziert werden Schachbrett, für das Lösungen für alle natürlichen Zahlen existieren n mit Ausnahme von n = 2 und n = 3. [1]
History edit ]
Der Schachkomponist Max Bezzel veröffentlichte 1848 das Acht-Königinnen-Rätsel. Franz Nauck veröffentlichte die ersten Lösungen 1850. [2] Nauck erweiterte das Rätsel auch auf n Königinnen Problem, mit n Königinnen auf einem Schachbrett von n × n Quadraten.
Seitdem haben viele Mathematiker, darunter Carl Friedrich Gauß, sowohl an dem Acht-Königinnen-Puzzle als auch an ihrer generalisierten Version n -queens gearbeitet. 1874 schlug S. Gunther eine Methode vor, die Determinanten für die Suche nach Lösungen verwendete. [2] J.W.L. Glaisher verfeinerte Gunthers Ansatz.
Im Jahr 1972 nutzte Edsger Dijkstra dieses Problem, um die Macht dessen zu veranschaulichen, was er als strukturierte Programmierung bezeichnete. Er veröffentlichte eine sehr detaillierte Beschreibung eines tiefgreifenden Rückverfolgungsalgorithmus. 2
Konstruieren und Zählen von Lösungen [ edit ]
Das Problem, alle Lösungen zu finden. Königinnen Problem kann sehr rechenaufwendig sein, da es 4,426,165,368 (19459009, 19459023, 64 C ) mögliche Anordnungen von acht Königinnen auf einer 8 × 8-Platine gibt, aber Nur 92 Lösungen. Es ist möglich, Verknüpfungen zu verwenden, die den Rechenaufwand reduzieren oder Daumenregeln, die Brute-Force-Berechnungstechniken vermeiden. Durch Anwenden einer einfachen Regel, die jede Dame auf eine einzelne Spalte (oder Zeile) beschränkt, gilt die Anzahl der Möglichkeiten zwar noch als rohe Gewalt, aber auf 16.777.216 (d. H. 8 8 ). ) mögliche Kombinationen. Durch die Erzeugung von Permutationen werden die Möglichkeiten auf nur noch 40.320 (also 8!) Reduziert, die dann auf diagonale Angriffe geprüft werden.
Martin Richards veröffentlichte ein Programm zur Zählung von Lösungen für das n-queens-Problem mit bitweisen Operationen, [3] jedoch wurde diese Lösung bereits von Zongyan Qiu veröffentlicht. [4]
Solutions [ edit ]]
Das acht Königinnen Puzzle hat 92 verschiedene Lösungen. Wenn Lösungen, die sich nur durch die Symmetrieoperationen Rotation und Reflektion des Boards unterscheiden, als eins gezählt werden, hat das Puzzle 12 Lösungen. Diese werden als grundlegende Lösungen bezeichnet; Vertreter von jedem sind unten gezeigt.
Eine grundlegende Lösung hat normalerweise acht Varianten (einschließlich ihrer ursprünglichen Form), die durch Drehen um 90, 180 oder 270 ° und anschließendes Reflektieren der vier Rotationsvarianten in einem Spiegel in einer festen Position erzielt werden. Sollte eine Lösung jedoch ihrer eigenen 90 ° -Drehung entsprechen (wie es bei einer Lösung mit fünf Damen auf einer 5 × 5-Platine der Fall ist), hat diese grundlegende Lösung nur zwei Varianten (sich selbst und ihre Reflexion). Wenn eine Lösung ihrer eigenen 180 ° -Drehung entspricht (aber nicht ihrer 90 ° -Drehung), hat sie vier Varianten (sich selbst und ihre Reflexion, ihre 90 ° -Drehung und deren Reflexion). Wenn n > 1 ist, ist es nicht möglich, dass eine Lösung ihrem eigenen Nachdenken entspricht, da dafür zwei Königinnen einander gegenüberstehen müssten. Von den 12 grundlegenden Lösungen des Problems mit acht Damen auf einer 8 × 8-Platine ist genau eine (Lösung 12 unten) gleich ihrer eigenen 180 ° -Drehung, und keine ist gleich ihrer 90 ° -Drehung. somit ist die Anzahl der unterschiedlichen Lösungen 11 × 8 + 1 × 4 = 92 (wobei die 8 von vier 90 ° -Drehpositionen und ihren Reflexionen abgeleitet wird und die 4 von zwei 180 ° -Drehpositionen und ihren Reflexionen abgeleitet wird).
Nachfolgend sind alle grundlegenden Lösungen aufgeführt:
Lösung 10 hat die zusätzliche Eigenschaft, dass sich keine drei Damen in einer geraden Linie befinden.
Vorhandensein von Lösungen [ edit ]
Diese Brute-Force-Algorithmen zum Zählen der Anzahl von Lösungen sind rechnerisch handhabbar für n = 8 aber wäre unlösbar für Probleme von n ≥ 20 da 20! = 2,433 × 10 18 . Wenn es darum geht, eine einzige Lösung zu finden, kann man zeigen, dass Lösungen für alle n ≥ 4 ohne jegliche Suche vorhanden sind. [5] Diese Lösungen zeigen treppenförmige Muster, wie in den folgenden Beispielen für n = 8, 9 und 10:
Treppenlösung für 8 Königinnen | Treppenlösung für 9 Königinnen | Treppenlösung für 10 Königinnen Die obigen Beispiele können mit den folgenden Formeln erhalten werden: Zitat benötigt Es sei i j j Quadrat in Spalte i und Reihe j auf dem n × n Schachbrett, k eine ganze Zahl.
Ein anderer Ansatz [ ist erforderlich.
Für n = 8 ergibt dies die grundlegende Lösung 1 oben. Einige weitere Beispiele folgen.
Zähllösungen [ edit ]Die folgenden Tabelle gibt die Anzahl der Lösungen zum Platzieren von n Königinnen auf einer n × n Tafel an, beide grundlegend (Sequenz A002562 in der OEIS) und alle (Sequenz A000170 in der OEIS), für n = 1–10, 24–27.
Das Rätsel mit sechs Königinnen hat weniger Lösungen als das mit fünf Königinnen. Es gibt keine bekannte Formel für die genaue Anzahl der Lösungen oder sogar für ihr asymptotisches Verhalten. Die 27 × 27-Platine ist die Platine höchster Ordnung, die vollständig aufgezählt wurde. [6] Es ist nicht schwierig, eine einzige Lösung für eine größere Platine zu finden. Verwandte Probleme [ edit ]
Übung in Algorithmus-Design [ edit] Das Finden aller Lösungen für das Acht-Damen-Rätsel ist ein gutes Beispiel für ein einfaches, aber nicht triviales Problem. Aus diesem Grund wird es häufig als Beispielproblem für verschiedene Programmiertechniken verwendet, einschließlich nicht-traditioneller Ansätze wie z. B. Constraint-Programmierung, Logik-Programmierung oder genetische Algorithmen. Am häufigsten wird es als Beispiel für ein Problem verwendet, das mit einem rekursiven Algorithmus gelöst werden kann, indem das Problem der Königinnen n induktiv formuliert wird, indem eine einzelne Königin zu jeder Lösung des Problems der Platzierung von n −1 Damen auf einem n-by-n-Schachbrett. Die Einführung endet mit der Lösung für das 'Problem', 0 Königinnen auf das Schachbrett zu legen, das das leere Schachbrett ist. Diese Technik ist viel effizienter als der naive Brute-Force-Suchalgorithmus, der alle 64 8 = 2 48 = 281.474.976.710.656 mögliche blinde Platzierungen von acht Königinnen und dann Filter berücksichtigt Damit werden alle Platzierungen entfernt, bei denen zwei Damen entweder auf demselben Feld platziert wurden (nur 64! / 56! = 178.462.987.637.760 mögliche Platzierungen) oder in sich gegenseitig angreifenden Positionen. Dieser sehr schlechte Algorithmus wird unter anderem in allen unterschiedlichen Permutationen der Zuweisungen der acht Königinnen immer wieder die gleichen Ergebnisse erzeugen und dieselben Berechnungen für die verschiedenen Teilmengen von jeder immer wieder wiederholen Lösung. Ein besserer Brute-Force-Algorithmus setzt eine einzige Dame in jede Reihe, was nur 8 8 = 2 24 = 16.777.216 blinde Platzierungen ergibt. Man kann viel besser machen. Ein Algorithmus löst das Acht-Turm-Rätsel, indem er die Permutationen der Zahlen 1 bis 8 (von denen es 8 gibt! = 40,320 gibt) generiert, und verwendet die Elemente jeder Permutation als Indizes, um in jeder Reihe eine Dame zu platzieren. Dann lehnt es jene Bretter mit diagonalen Angriffspositionen ab. Das Backtracking-Tiefensuchprogramm, eine geringfügige Verbesserung der Permutationsmethode, erstellt den Suchbaum, indem jeweils eine Zeile der Tafel betrachtet wird, wodurch die meisten Nichtauflösungsbrettpositionen zu einem sehr frühen Zeitpunkt ihrer Konstruktion eliminiert werden. Da es Angriffe und diagonale Angriffe auch auf unvollständigen Brettern ablehnt, werden nur 15.720 mögliche Platzierungen von Damen geprüft. Eine weitere Verbesserung, die nur 5.508 mögliche Königinnen untersucht Platzierungen, ist es, die permutationsbasierte Methode mit der frühen zu kombinieren Beschneidungsmethode: Die Permutationen werden zuerst in der Tiefe generiert und der Suchraum wird beschnitten, wenn die partielle Permutation a erzeugt diagonaler Angriff. Die Constraint-Programmierung kann bei diesem Problem auch sehr effektiv sein. Eine Alternative zur erschöpfenden Suche ist ein "iterative repair" -Algorithmus, der typischerweise mit allen Königinnen auf der Tafel beginnt, beispielsweise mit einer Dame pro Spalte. [13] Dann wird die Anzahl der Konflikte (Angriffe) und deren Verwendung gezählt eine Heuristik, um zu bestimmen, wie die Platzierung der Königinnen verbessert werden kann. Die Heuristik "Minimalkonflikte" - das Stück mit der größten Anzahl von Konflikten auf das Quadrat in derselben Spalte zu verschieben, in der die Anzahl der Konflikte am geringsten ist - ist besonders effektiv: Es findet eine Lösung für das 1.000.000-Queen-Problem in weniger als 50 Schritten im Durchschnitt. Dies setzt voraus, dass die anfängliche Konfiguration "einigermaßen gut" ist. Wenn eine Million Königinnen alle in derselben Zeile beginnen, sind mindestens 999.999 Schritte erforderlich, um sie zu reparieren. Ein "einigermaßen guter" Startpunkt kann zum Beispiel gefunden werden, indem jede Dame in eine eigene Zeile und Spalte gestellt wird, so dass sie mit der kleinsten Anzahl von bereits auf der Tafel befindlichen Königinnen in Konflikt steht. Im Gegensatz zu der oben beschriebenen Backtracking-Suche garantiert iterative Reparatur keine Lösung: Wie bei allen gierigen Prozeduren kann es zu einem lokalen Optimum kommen. (In einem solchen Fall kann der Algorithmus mit einer anderen Anfangskonfiguration erneut gestartet werden.) Andererseits können Problemgrößen gelöst werden, die mehrere Größenordnungen außerhalb des Umfangs einer Tiefensuche liegen. Beispielprogramm [ edit ] Folgendes ist ein Pascal-Programm von Niklaus Wirth aus dem Jahr 1976. [14] Es findet eine Lösung für das Acht-Königinnen-Problem. program eightqueen1 ( Ausgabe ) ; var i : : ; ]: Boolean ; a : Array [ 1 8 boolean ; b : Array 2 .. 16 von 19659169]. c : Array 7 .. 7 von von 19659175] x : Array 1 .. 8 ; ] try ( i : integer ; var q : boolean ] ; j : ganze Zahl ; begin j : = 0 ; Wiederholung j : = j + 1 ; = falsch ; wenn a j und b . 19659161] j ] und c i - j dann und dann dann dann dann dann dann i ] : = j ; a j : ; b i + j : = falsch ; [19659752] - j ] : = falsch ; wenn i 8 dann dann dann dann . 19659312] try ( i + 1 q ; ; nicht ; th de Anfang a j : = richtig ; b j ] : = true ; c i - j j wahr ; Ende Ende sonst q : = wahr Ende bis q 19659362] ( j = 8 ] ; Ende ; beginnt für ] 1 bis 8 do a [ i ] : = trifft zu für i : = 2 bis 16 do b i true : für i : = - 7 bis 7 do c ] : = true ; versuchen ( 1 q ) wenn ; und dann für i : = 1 bis 8 schreiben (19659162] 19659161] i ] : 4 ] ; writeln end ]]
Externe Links [ edit ]
Subscribe to:
Post Comments (Atom)
|
No comments:
Post a Comment