Posts mit dem Label Algorithmus werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Algorithmus werden angezeigt. Alle Posts anzeigen

8.11.25

Übersicht: Software und Algorithmen

Hier finden Sie alle systematischen Übersichten.

Eigentlich sind Geduldspiele dazu gemacht, dass Menschen sie lösen und dabei eine tiefe Befriedigung empfinden. Wenn man aber die Lösung nicht findet oder sich Fragen stellt wie "Ist das die kürzeste Lösung?" oder "Wieviel verschiedenen Lösungen gibt es?", dann kann möglicherweise nur der Computer helfen. Für bestimmte Typen von Geduldspielen gibt es Webseiten oder Programme, die helfen. Wenn man selber programmieren will, gibt es möglicherweise fertige Bibliotheken. Die folgende Zusammenstellung ist nach den Typen der Geduldspiele sortiert. Neben den im Blog besprochenen Programmen und Bibliotheken sind auch noch einige weitere aufgeführt.

 Grundlegende Algorithmen

Bei ganz verschiedenen Typen von Puzzles laufen Lösungsversuche darauf hinaus, verschiedene Möglichkeiten durchzuprobieren. Die theoretisch mögliche Anzahl dieser Möglichkeiten kann astronomisch hoch sein. Es gibt einige wichtige Algorithmen, welche diese Anzahl schnell reduzieren, indem sie große Anteile ausschließen können.

Legespiele (Edge Matching)

Karten sollen so aneinandergelegt werden, dass die Bilder an den Kanten jeweils zusammenpassen. Schon für 3x3 Karten wird es schwierig.

Polyformen

Spielsteine werden aus jeweils mehreren Exemplaren einer Grundform (meist ein Quadrat) gebildet und mehrere solche Steine sollen in einen Rahmen gepackt werden. Das bekannteste Beispiel sind Pentominos.

Schiebespiele

Eine Leerstelle im Rahmen erlaubt, dass einzelne Steine verschoben werden können. Die Steine sind meist einzelne Elementarquadrate oder aus mehreren Elementarquadraten zusammengesetzt..

Teufelsnoten

Teufelsknoten (Burrs) tragen ihren Namen völlig zu Recht und sind manchmal teuflisch schwer. 
  • Software für Konstruktion und Lösung: BurrTools (bisher kein Post)

3D-Druck

Auch zum 3D-Druck von Geduldspielen gibt es Unterstützung.

11.6.25

Mehrere gleiche oder ähnliche Figuren aus einem Satz Polyominos legen

Wir haben schon Hexominos und Heptominos in Kisten gepackt, indem wir mehrere Quadrate gelegt haben und diese übereinander in eine Box packten. Wir hatten 

  • Heptominos in einer 8x8-Box, gestapelt in 12 Schichten mit jeweils einem Loch an der gleichen Stelle, sowie
  • Pentominos und Hexominos in einer 6x9-Box, gestapelt in fünf Schichten.

Die Überlegungen hier wollen wir später benutzen, um (wie im Bild) sechs Rahmen der Größe 6x6 mit Hexominos und Trominos zu füllen.

Wenn man keine Lösung kennt, wie findet man eine? Und wie findet man weitere Lösungen? Von Hand sind solche Aufgaben wirklich kaum mehr zu schaffen, und auch der Computer bekommt Probleme. Im Unterschied zu den üblichen Aufgaben mit nur einem großen Rahmen gibt es hier viel weniger Lösungen, und deshalb müssen viel mehr Möglichkeiten durchprobiert werden, bevor die erste Lösung gefunden wird. Die bisher betrachteten Algorithmen und Lösungsstrategien führen in vertretbarer Zeit nicht zum Ziel, weil die entsprechende Software mit der Komplexität der Aufgabe überfordert war oder auch nur nicht die passenden Einstellungen gefunden wurden.

Aber wir können noch einen zusätzlichen Trick anwenden und die schwierige Aufgabe, mehrere gleiche Rahmen mit allen Steinen zu füllen, in zwei einfachere Teilaufgaben zerlegen, von denen jede viel einfacher gelöst werden kann.

Angenommen, wir haben n gleiche Rahmen, die mit den Steinen gefüllt werden sollen.

1. Teilaufgabe: Fülle nur einen Rahmen vollständig mit Steinen und suche dafür nach allen Lösungen. Für jede Lösung notieren wir nur die verwendeten Steine, nicht deren tatsächliche Anordnung im Rahmen. Danach sortieren wir diese Liste der Lösungen und entfernen dabei Dubletten. Das Ergebnis ist eine Liste L aller Teilmengen von Steinen, mit denen sich ein Rahmen füllen lässt. Diese erste Teilaufgabe lässt sich mit verschiedenen Computerprogrammen schnell lösen.

2. Teilaufgabe: Suche in der Liste L nach n verschiedenen Zeilen, so dass insgesamt kein Stein doppelt vorkommt. Wenn wir n solche Zeilen finden, dann haben wir genügend verschiedene Steine, um alle n Rahmen zu füllen. Dabei müssen wir auch alle unsere Steine verwenden, da keine überzähligen Steine vorhanden sind. 

Für die zweite Teilaufgabe finden wir keine vorgefertigte Lösungssoftware und wir müssen selbst programmieren. Zur Auswahl stehen (mindestens) zwei verschiedene Lösungsansätze: Wir können wieder einmal einen SMT-Solver einsetzen. Als zweite Möglichkeit bietet sich an, die Aufgabenstellung als Problem der exakten Überdeckung (siehe [1]) zu betrachten. Auf dieses Exact Cover Problem und den dazugehörigen Algorithmus X von Donald Knuth soll in einen eigenen Post eingegangen werden.

Zur Lösung mit einem SMT-Solver verwenden wir die Liste L. in jeder Zeile stehen die Namen einiger Steine, die zusammen den Rahmen füllen. Wir benutzen die Namen der Steine als Variablen und wollen jeder von ihnen als Wert eine Zahl zwischen 1 und n zuweisen, je nachdem, im wievielten Rahmen der Stein verwendet wird. Dazu nehmen wir n Kopien unserer Liste L und nennen sie L1, L2, .. Ln. Nun machen wir folgendes. Wir suchen mit dem SMT-Solver nach einer Belegung der Variablen mit den Werten 1,..., n mit den folgenden Bedingungen.

(Alle Variablen in der ersten Zeile von L1 haben den Wert 1
ODER alle Variablen in der zweiten Zeile von L1 haben den Wert 1
ODER ...
ODER alle Variablen in der letzten Zeile von L1 haben den Wert 1)
UND
(Alle Variablen in der ersten Zeile von L2 haben den Wert 2
ODER alle Variablen in der zweiten Zeile von L2 haben den Wert 2
ODER ...

ODER alle Variablen in der letzten Zeile von L2 haben den Wert 2)
UND
...
UND
(Alle Variablen in der ersten Zeile von Ln haben den Wert n
ODER alle Variablen in der zweiten Zeile von Ln haben den Wert n
ODER ...
ODER alle Variablen in der letzten Zeile von Ln haben den Wert n)

Mit anderen Worten lassen wir den Solver nach einer Belegung mit Werten, so dass es für jede Zahl zwischen 1 und n eine Zeile in der Liste gibt, deren Variable alle diesen gleichen Wert haben. Mit diesen n Zahlen haben wir n disjunkte Lösungen für unsere n Rahmen. Jeder Stein wird nur einmal verwendet, da jede Variable mit nur einem Wert belegt werden kann.

Das Verfahren soll an einigen Aufgaben demonstriert werden:

Mehr Infos

[1] https://en.wikipedia.org/wiki/Exact_cover

Hexominos und Trominos in 6 Rahmen 6x6

Nimmt man zu den 35 Hexominos noch die zwei Trominos hinzu, so belegen diese 36*6+2*3 = 216 Elementarquadrate. Lässt sich daraus ein 18x12-Rechteck legen? Ja, aber diese Aufgabe ist uns heute viel zu einfach. Wir fragen uns: Lassen sich sechs Quadrate der Größe 6x6 mit den gegebenen Steinen füllen? Falls ja, brauchen wir diese 6 großen Quadrate nur in einem Rechteck der Größe 3x2 anzuordnen und fertig ist das 18x12-Rechteck mit einer sehr eleganten Unterteilung.

Um eine Lösung zu finden, gehen wir folgendermaßen in zwei Schritten vor, wie allgemein beschrieben, um mehrere gleiche oder ähnliche Figuren aus einem Satz Polyominos legen.

Für die erste Teilaufgabe erzeugen wir die Liste aller Lösungen für jeden einzelnen Rahmen. Da alle sechs Rahmen gleich sind, ergibt das nur eine Liste, die sich beispielsweise einfach mit mops.exe erzeugen lässt. Zuerst benötigt mops.exe die Steinmenge aus Trominos und Hexominos. Das geht am einfachsten, indem man zunächst die Hexominos als Steinmenge erzeugt und abspeichert. Danach erzeugt man die Trominos und lädt die Hexominos dazu. Damit verfügt man über die 37 Steine.

Als Rahmen (pattern) nimmt man ein 6x6-Quadrat und sucht nach allen Lösungen (>pack>all solutions). Dabei werden 2.574.456 Lösungen gefunden und diese werden automatisch abgespeichert. Danach wird die Liste mit einem kleinen Skript umformatiert, dass nur noch die Steinnummern enthalten sind und diese innerhalb der Zeile sortiert sind. Dann wird diese Liste zeilenweise sortiert und Dubletten werden entfernt (sort -u). Danach liegt die Liste L vor. Sie hat 84.614 Einträge.

Aus dieser Liste L erstellen wir nun die 6 Listen L1 bis L6 für die sechs Rahmen. Wir können ohne Beschränkung der Allgemeinheit die beiden Trominos in den ersten Rahmen packen, denn beide Trominos müssen ja in denselben Rahmen. Damit besteht L1 aus allen Einträgen von L, welche die Trominos enthalten, dies sind 70.904 Zeilen. Die Listen L2 bis L6 sind identisch und bestehen aus dem Rest von L, nachdem L1 entfernt wurde. Sie enthalten jeweils 13.710 Zeilen.

Für die zweite Teilaufgabe werden die Listen in eine logische Formel umgesetzt, für die später nach einer Lösung gesucht wird. Dies passiert genau wie in diesem Post beschrieben. Die Namen der Steine werden als Variablen betrachtet und ein langer logischer Ausdruck wird exakt genauso konstruiert:

(Alle Variablen in der ersten Zeile von L1 haben den Wert 1
ODER alle Variablen in der zweiten Zeile von L1 haben den Wert 1
ODER ...
ODER alle Variablen in der letzten Zeile von L1 haben den Wert 1)
UND
(Alle Variablen in der ersten Zeile von L2 haben den Wert 2
ODER alle Variablen in der zweiten Zeile von L2 haben den Wert 2
ODER ...

ODER alle Variablen in der letzten Zeile von L2 haben den Wert 2)
UND
...
UND
(Alle Variablen in der ersten Zeile von Ln haben den Wert n
ODER alle Variablen in der zweiten Zeile von Ln haben den Wert n
ODER ...
ODER alle Variablen in der letzten Zeile von Ln haben den Wert n)

Diesen Ausdruck übergeben wir dem SMT-Solver Z3 und hoffen, dass er in vertretbarer Zeit eine Lösung findet. Wenn wir die Größe des Ausdrucks betrachten, dann besteht er aus 768.174 UND-Verknüpfungen (jede ODER-Zeile hat weitere 5 bzw. 6 UND-Verknüpfungen) und 139448 ODER-Verknüpfungen mit 37 Variablen. Wir haben zunächst keinerlei Vorstellungen, ob die Laufzeit einige Minuten, einige Tage oder gar Jahre betragen wird. Versuchen wir, es herauszufinden: Wir starten den Versuch auf einem normalen PC und binnen einiger Minuten und auch Stunden passiert erst einmal gar nichts. Aber nach knapp drei Tagen Laufzeit kommt die erste Lösung. Hier die Nummern der Rahmen für die 37 Steine.

1 1 1 5 3 4 5 6 3 3 2 4 1 4 2 2 6 3 6 5 3 6 5 4 6 1 2 2 6 5 2 3 1 4 4 5 1 

Dies bedeutet: Stein Nummer 1 erscheint im Rahmen1, ebenso die Steine 2 und 3. Stein Nummer 4 erscheint in Rahmen 5, Stein Nr. 5 in Rahmen 3 usw. Nach weiteren knapp 2 Tagen gibt es eine weitere Lösung 

1 1 2 2 4 6 5 5 2 6 1 4 3 5 5 2 3 5 6 3 6 4 5 1 1 3 2 6 3 4 2 3 4 6 1 4 1

und gleich darauf eine dritte, die allerdings nur die Steine in den Rahmen 2 und 4 vertauscht. Danach wurde der Prozess abgebrochen.

Um diese Nummern in eine echte Lösung für die sechs Rahmen zu verwandeln, müssen wir noch einmal die vergleichsweise einfache Aufgabe lösen, die Steine tatsächlich in den entsprechenden Rahmen zu packen. Hier ist das Ergebnis für die erste Lösung:

Historisches: Die Aufgabe wurde 1999 von Michael Reid gestellt. Da wusste man schon, dass es nicht möglich ist, sechs Rahmen der Größe 6x6 mit den 35 verschiedenen Hexominos sowie einem weiteren, doppelt verwendeten Hexomino zu füllen. Deshalb vermutet man nur vergleichsweise wenige Lösungen für die gestellte Aufgabe. Die erste Lösung wurde von Patrick Hamlyn gefunden [1] 

Mehr Infos:

[1] https://www.mathpuzzle.com/6x6x6.html

30.4.25

Volumentest: Schwierigere Aufgaben für Hexominos (Nr. 11-13)

Obwohl einige Aufgaben nicht schwieriger aussehen als andere, bereiten sie manchen Computerprogrammen große Schwierigkeiten. Wir erwarten eine Lösungszeit innerhalb von Sekunden, erhalten aber auch nach einer Stunde noch keine einzige Lösung. Wohlgemerkt sprechen wir durchaus von lösbaren Aufgaben, die auch eine vergleichbar große Anzahl von Lösungen haben

Wir wollen uns das Problem an einem Beispiel und dem Lösungsversuch mit dem PolySolver anschauen.

Aufgabe 11: Rechteck 15x15 mit U-förmigem Loch der Breite 13

Im 15x15-Quadrat bleiben 15 Elementarquadrate durch Hexominos unbelegt, wie wir bereits bei den Aufgaben 3-7 aus den Aufgaben für Hexominos (Nr. 1-10) gesehen haben. Diesmal formen wir aus den 15 überzähligen Elementarquadraten ein U-förmiges Loch der Breite 13 (im Bild schwarz) und versuchen den verbleibenden Platz mit den Hexominos zu füllen. Obwohl der PolySolver normalerweise weniger als 10 Sekunden für eine derartige Aufgabe benötigt, wird hier so schnell keine Lösung gefunden. Zwischendurch sieht der Zustand beispielsweise folgendermaßen aus:

Wenn keine Steine mehr einzufügen gehen, macht das Programm Backtracking. Dabei werden die zuletzt eingefügten Steine wieder entfernt und es wird anders versucht, die jetzt größeren Lücken zu füllen.

Wo ist das Problem? Schauen Sie sich die Größe der beiden verbliebenen Restflächen an: Diese betragen 11 (oben) bzw. 13 (unten). Sie lassen sich nicht mit Steinen der Größe 6 füllen, auch wenn man einige Steine herausnimmt und umsortiert. Man müsste mindestens soviel Steine herausnehmen, so dass die beiden Restflächen verschmelzen. Erst dann hat man wieder eine Chance. Wenn man die beiden dünnen Lücken unten am rechten und linken Rand aber gleich zu Beginn des Lösungsprozesses verschließt, kommt man beim klassischen Backtracking in vertretbarer Zeit nie wieder dahin zurück. Deshalb löst der PolySolver dieses Geduldspiel nicht.

Welcher zusätzliche Schritt würde hier helfen? Wir könnten aufpassen, dass auftretende Restflächen immer ein Vielfaches von 6 als Größe besitzen und sonst sofort abgebrochen und mit dem Backtracking begonnen wird. Dieser zusätzliche Schritt wird Volumentest genannt (weil er analog auch für dreidimensionale Probleme funktioniert) und ist ist bei einigen Solvern implementiert. Bei Polycube [1] gibt es auf der Kommandozeile den Parameter -v, und -v10 schaltet beispielsweise den Volumentest ein, sobald die Restfläche kleiner als 10 Steine groß ist. Mei mops.exe kann man im Menü Pack ein Häkchen bei Void Check setzen, um den Volumentest einzuschalten. Danach finden beide Programme wie erwartet Lösungen innerhalb Sekunden.


Aufgabe 12: Rechteck 33x7 mit Loch der Größe 7x3 in der Mitte

Hier ist die Situation analog zur Aufgabe 11: Das 33x7-Rechteck wird durch das große leere Rechteck in der Mitte nur durch zwei dünne Verbindungen (diese haben hier die Breite 2) oben und unten zusammengehalten. Wenn diese geschlossen werden und nicht auf die Größe der verbleibenden Restflächen geachtet wird, landet man schnell in einer Sackgasse. Mit dem Volumentest gibt es aber kein Problem.


Aufgabe 13: Rechteck 15x15 mit 15 Löchern in Fünfergruppen auf der Diagonale

Bei dieser Aufgabe ist nicht klar, ob der Volumentest hilft. Aber ein einfacher Versuch zeigt: Ohne Volumentest findet Polycube so schnell keine Lösung, mit Volumentest geht es blitzschnell.

Mehr Infos:

[1] www.mattbusche.org

19.4.25

Lösungsstrategien für Polyformen 3: Mensch und Maschine gemeinsam

Im ersten Teil dieser Reihe haben wir versucht, die Steine eines Polyformpuzzles mit Hilfe einer (gefühlten oder gemessenen) Nützlichkeit zu ordnen und zuerst mit den am wenigsten nützlichsten Steinen zu beginnen. Im zweiten Teil haben wir Wege kennengelernt, die allerletzten Lücken zu füllen. Mit diesen zwei Methoden kann man wirklich extrem große Polyomino-Puzzles lösen, wie die folgende fast übermenschliche Leistung zeigt: Auf [1] finden Sie ganz unten eine Lösung, wie man die 1285 verschiedenen Enneominos (bestehend aus jeweils 9 Elementarquadraten) zusammen mit 60 Löchern (in symmetrischer Anordnung) in ein Rechteck der Größe 93x125 packen kann. Der Autor Lewis Patterson löste dieses Puzzle vollständig per Hand und benötigte dazu nach eigenen Angaben zwischen 11 und 12 Stunden. Im Bild sieht man sehr schön, dass zuletzt der Bereich oben in der Mitte und oben rechts gelöst wurde, dafür wurden die besonders nützlichen Steine mit Blöcken der Größe 2x2 und 2x3 aufgehoben.
Dieses Vorgehen funktioniert, weil die Anzahl von verschiedenen Lösungen derartig groß ist, dass man am Ende mit einer akzeptablen Anzahl von Substitutionsschritten eine Lösung findet. Mit anderen Worten, wenn man das Geduldspiel beinahe fertig gelöst hat  und nur wenige Steine nicht passen (wir sprechen von einer Beinahe-Lösung), dann kann man diesen Mangel mit wenigen Veränderungen korrigieren und findet eine Lösung.

Teil 3: Mensch und Maschine gemeinsam

Wenn es für eine Aufgabe vergleichsweise weniger Lösungen gibt, dann befindet man sich mit einer Beinahe-Lösung nicht so nahe an einer vollständigen Lösung und man muss so viele Veränderungen vornehmen, dass man als Mensch überfordert ist. Dabei kann die Anzahl der Lösungen immer noch gigantisch groß sein, aber kleiner im Vergleich zu allen denkbaren Anordnungen der Steine.
Bei der Substitutionsmethode wurden nur ganz wenige Steine (1-3 Stück) entfernt und anders wieder eingefügt, um Platz für einen verbliebenen Stein zu schaffen. Wir können aber auch mehr Steine entfernen und versuchen, alle restlichen Steine passend einzufügen. Hier kann uns der Computer helfen. Wir benutzen den Computer also nur für die letzten Steine. Deren genaue Anzahl muss noch festgelegt werden, und zwar so, dass mit diesen Steinen (darunter möglichst viele nützliche Steine) fast jede Form passender Größe gefüllt werden kann. Dann sollte es doch auch für die Restfläche des Puzzles reichen.
Mit diesem Vorgehen hat man den Vorteil, dass der Computer sich nur mit wenigen Steinen beschäftigen muss, unabhängig von der Gesamtanzahl der Steine.
Für welche Polyformpuzzles ist dieser Ansatz erfolgversprechend? Sicher nicht für alle, denn wenn ein solches Polyformpuzzle nur eine einzige Lösung besitzt, kann man diese niemals durch Umlegen weniger Steine aus einer Beinahe-Lösung erzeugen. Dann müssen im typischen Fall alle Steine an eine andere Position gebracht werden. 
Ein Beispiel von Livio Zucca [2] ist der quadratische Rahmen der Größe 210x210, gefüllt mit 4410 Decominos (aus je 10 Elementarquadraten) ohne Löcher. Es gibt insgesamt 4655 verschiedene Decominos, davon haben 4460 Decominos keine Löcher [3]. Es wurden also nicht alle Decominos verwendet. Wieder sieht man viele der nützlicheren Decominos in der rechten unteren Ecke. Wie üblich wurden die Decominos nach Nützlichkeit sortiert und dann in dieser Reihenfolge (die nützlichsten zuletzt) in den Rahmen von links oben nach rechts unten eingefügt. Wenn das Programm in einer Sackgasse landete, wurden manuell einiger der Steine anders positioniert und das Programm versuchte dann, mit dieser Hilfe eine Lösung zu finden. Nach einigen Dutzend solcher Versuche wurde die Lösung gefunden.

Ein zweites Beispiel stammt wieder von Lewis Patterson: Die 369 Oktominos sollen in neun Rechtecke der Größe 9x37 gepackt werden. Dabei befinden sich in jedem der neun Rechtecke 41 Oktominos und fünf Elementarquadrate bleiben frei. Diese freien Felder sollen sich wie im Bild in der Mitte jedes Rechtecks an der gleichen Stelle befinden. 


Chris Patterson beschreibt seinen Lösungsvorgang in [4] so: Er konnte acht der neun Rechtecke per Hand füllen und war sich relativ sicher, dass sich mit den verbleibenden Steinen das letzte Rechteck füllen lässt. Allerdings gelang dies nicht per Hand und er bat die Community um Hilfe. Patrick Hamlyn gelang es schließlich mit Hilfe seines Computerprogramms, auch das letzte Rechteck zu füllen. Bevor dies aber gelungen war, scheiterte das Programm rund 866.000 mal mit entsprechend vielen Beinahe-Lösungen, bei denen jeweils 40 der 41 verbliebenen Oktominos in den Rahmen gepackt wurden. Hier war die Entscheidung, den Computer zu Hilfe zu nehmen, offensichtlich angebracht.

Mehr Quellen


1.1.25

Lösungsstrategien für Polyformen 2: Substitution

Im ersten Teil dieser Reihe haben wir versucht , die Steine eines Polyformpuzzles mit Hilfe einer (gefühlten oder gemessenen) Nützlichkeit zu ordnen und zuerst die am wenigsten nützlichsten Steine zu benutzen. Dies entspricht der Eröffnung aus dem Schachspiel. Hier wollen wir uns dem Äquivalent des Endspiels widmen: Wie bringt man die allerletzten Steine unter? 

Teil 2: Die Substitutionsmethode für die letzten Steine

Zunächst wollen wir uns dem allerletzten Stein bei den Pentominos zuwenden: Elf der zwölf Steine befinden sich im Rahmen, und die fünf freien Elementarquadrate haben auch die Form eines Pentominos. Allerdings passt die Lücke nicht für das zwölfte Pentomino, sondern wir haben das fehlende Pentomino bereits verbaut. Diese Konfiguration soll in diesem Post als Beinahe-Lösung bezeichnet werden.

Wenn Sie jetzt aus Verzweiflung alle Steine wieder auf den Tisch schütten und es noch einmal von vorn versuchen, dann haben Sie vielleicht eine Chance verpasst: Vielleicht wäre die Beinahe-Lösung mit geringem Aufwand zu reparieren gewesen? Hier kommt die Substitutionsmethode ins Spiel. Sie besteht aus zwei Schritten. Die Ausgangssituation ist folgendermaßen: Die Beinahe-Lösung enthält eine Lücke in Form eines Steins A, zur Verfügung steht aber nur ein anderer Stein B.

Schritt 1: Entferne einen Stein C neben der Lücke, so dass sich die Lücke vergrößert. Prüfe, ob jetzt die beiden Steine B und C in die vergrößerte Lücke X passen. Falls ja, ist das Puzzle gelöst.

Beispiel 1: In der abgebildeten Situation haben wir eine Lücke in Form eines Y-Pentominos, der letzte vorhandene Stein ist ein F-Pentomino. Wir können die Situation aber retten, indem wir das neben der Lücke befindliche U-Pentomino entnehmen. Die entstandene größere Lücke können wir mit U und F füllen. Geschafft!

Falls dieser Schritt nicht zum Ziel führt, führe vorher eine Substitution aus: 

Schritt 2: Entferne den Stein A und füge ihn in die Lücke ein. Jetzt haben wir eine Situation wie vorher, nur dass sich Lücke in Form des Steins A an anderer Stelle befindet und wir immer noch den Stein B übrig haben. Aber wir können wieder Schritt 1 ausführen.

Beispiel 2: Nehmen wir eine andere Ausgangssituation. Angenommen, wir starten mit der unten abgebildeten Situation. Wieder  haben wir eine Lücke in Form eines Y-Pentominos, der übrige Stein ist das F-Pentomino. Der Trick aus Schritt 1, indem wir W oder Z herausnehmen, hilft an dieser Stelle nicht. Aber wenn wir zunächst die Lücke in Form eines Y mit dem Y-Pentomino füllen, haben wir die Situation auf die obige Situation aus Schritt 1 zurückgeführt und können alle Steine einfügen.


Falls wir wieder nicht zum Ziel kommen, können wir leider denselben Trick nicht noch einmal machen. Aber vielleicht können wir den Stein A in einer anderen Position in der großen Lücke einfügen, so dass eine kleine Lücke für einen anderen Stein als B bleibt. Dann können wir wieder Schritt 2 anwenden.

Wenn wir so gar nicht weiterkommen, können wir in Schritt 1 auch zwei oder mehr Steine entfernen und uns so noch viel mehr Möglichkeiten verschaffen. Wichtig ist, dass wir jetzt immer nur eine relativ kleine ungefüllte Lücke haben und nur wenige Steine bewegt werden müssen. Der Erfolg der Methode ist nicht garantiert, da man oft mehrere Möglichkeiten hat und sich für eine entscheiden muss. Im schlimmsten Fall kann man auch in einer Sackgasse landen und man hat keine weiteren Optionen. Aber verblüffend oft führt diese Strategie zum Ziel.

Dieses Vorgehen lässt sich auch gut auf den Computer übertragen. Im obigen Beispiel benötigt man ein Verzeichnis der möglichen größeren Lücken für zwei Steine sowie Paare von Steinen, die diese Lücke füllen. Beispielsweise lässt sich die Lücke

füllen durch jedes der folgenden Paare von Pentominos: F+U, L+P, P+T, P+V, P+Y, P+Z und U+Y. Daraus lassen sich jetzt die möglichen Substitutionen ableiten. Finden wir in der Lücke z.B. ein U-Pentomino, dann finden wir im Verzeichnis die folgenden Paare mit einem U: F+U und U+Y. Das bedeutet, dass wir in dieser Lücke ein F gegen ein Y substituieren können und umgekehrt. Genau das haben wir im Schritt 1 getan.

Diese Methode lässt sich genauso bei anderen Polyominos (und anderen Polyformen) verwenden, ein Beispiel für Hexominos findet sich bei [1].

Mehr Infos:

[1] polyominoes.blogspot.com/...

8.12.24

Nützlichkeit für Pentominos, Hexominos und Heptominos

Nützliche Steine werden sicher häufiger verwendet als die weniger nützlichen. Die klassischen Aufgaben für Polyominos sind hier allerdings nicht hilfreich, da stets alle Steine (egal ob nützlich oder nicht) verwendet werden müssen. Wir benötigen also kleinere zu füllende Rahmen, damit jedesmal nicht alle Steine verwendet werden. Dann können wir erwarten, dass die nützlichen Steine häufiger und die weniger nützlichen seltener genutzt werden.

Bei Pentominos verwenden wir Rahmen aus 30 Elementarquadraten (zu füllen mit 6 der 12 Pentominos). Für Hexominos und Heptominos benutzen wir Rahmen der Größe 60 bzw. 70, so dass jeweils 10 Steine benötigt werden. Neben einem rechteckigen (bzw. fast  rechteckigen) Rahmen wählen wir vier weitere Rahmen entsprechender Größe mit unregelmäßig geformten Rand. Dies soll die Situation gegen Ende eines Geduldspiels repräsentieren, bei dem das Spiel "fast gelöst" ist und nur noch eine kleine, zusammenhängende Restfläche irgendwo in der Mitte zu füllen ist.

Diese Aufgabe wird mit einem Computerprogramm gelöst, und für die gefundenen Lösungen wird gezählt, wie oft die einzelnen Pentominos verwendet wurden. Verschiedene Computerprogramme sollten dieselben Ergebnisse liefern, hier wurde das Programm mops.exe [2] von Peter Esser verwendet, welches auch diese Auszählung für uns automatisch übernimmt. 

Ein ähnliches Experiment für Pentominos im rechtwinkligen Rahmen) stammt von Lewis Patterson [1] aus dem Jahr 2019.

Hier die Ergebnisse der Experimente. Auffällig ist in jedem der Fälle, dass das Polyomino in Form eine I in den (fast) rechtwinkligen Rahmen sehr nützlich ist, in den anderen Rahmen eher weniger bis gar nicht nützlich. Daraus sollte man nicht schlussfolgern, dass das I allgemein durchschnittlich nützlich ist, sondern dass man es bei Rahmen mit langen, geraden Kanten sofort an einen solchen Rand legen sollte. Das gilt analog auch für L-förmige Steine. Eine umgekehrte Beobachtung gilt für gleichmäßig gezackte Ränder: Hier lässt sich beispielsweise das W-Pentomino sehr gut verwenden.

In den folgenden Tabellen findet sich links der zu füllende Rahmen, rechts die verwendeten Steine und dazu blau hinterlegt die Häufigkeit der Verwendung.

Pentominos: Fläche 30, 1000 Versuche, Durchschnitt: 500

Bei einer Rahmengröße von 30 werden in 1000 Versuchen jeweils 6 der 12 Pentominos verwendet, dies ergibt eine durchschnittliche Verwendungszahl von 500 pro Versuch. 

Im Durchschnitt ergeben sich folgende Zahlen:

Damit bestätigen sich in etwa die intuitiven Kriterien aus der Nützlichkeitsbetrachtung.

Hexominos: Fläche 60, 100 Versuche, Durchschnitt: 27.8

Auffällig große Nützlichkeit finden sich (wie erwartet) bei den Steinen, die einen massiven 2x2-Block enthalten (6, 15, 18 und 21-25)

Heptominos: Fläche 70, 100 Versuche, Durchschnitt: 9.25

Hier die Ergebnisse für Heptominos. Der Stein Nr. 98 mit einem Loch wird natürlich niemals verwendet.




Auch bei den Hexominos und Heptominos werden in etwa die intuitiven Kriterien aus der Nützlichkeitsbetrachtung bestätigt.

Mehr Infos:



Lösungsstrategien für Polyformen 1: Nützlichkeit

Einleitung

In dieser Serie von Posts sollen Lösungsstrategien für Geduldspiele mit Polyformen vorgestellt werden. In den Beispielen werden wir Polyominos verwenden, und zwar hauptsächlich Pentominos und Hexominos. Die meisten Aufgaben für Pentominos lassen sich zwar auch ohne solche theoretischen Hilfsmittel lösen, aber bei größeren Steinen und größeren Rahmen ist ein wenig theoretischer Hintergrund hilfreich. Und dies sowohl für den Menschen wie für den Computer. Denn auch der Computer kommt wegen des exponentiellen Wachstums der Zahl der möglichen Anordnungen schnell an seine Grenzen.

Die nachfolgenden Tipps sind nur dann nützlich, wenn es wirklich viele Möglichkeiten gibt, die Steine in den vorgegebenen Rahmen zu packen. Denn die Annahme ist immer, dass man erst gegen Ende wirklich sorgfältig vorgehen muss. Denn zunächst packt man (meist vom Rand beginnend, dann weiter nach innen) eine große Anzahl der Steine so in den Rahmen, dass nur in der Mitte ein großes Loch bleibt und keine weiteren Lücken. Irgendwann wird es schwieriger und wir hoffen nun, dass es immer noch möglich ist, dieses Loch zu füllen und somit eine Lösung zu finden, ohne allzuviel der bisher eingefügten Steine wieder anfassen zu müssen. Andererseits: Wenn es nur eine oder nur wenige Lösungen für das gesamte Puzzle gibt, wird diese Annahme sicher falsch sein. Dann gibt es für einzelne Steine nur eine (oder ganz wenige) mögliche Positionen, und Fehler zu Beginn lassen sich praktisch später nicht beheben. Die gute Nachricht ist aber, dass viele Aufgaben mit Polyformen aber sehr, sehr viele Lösungen haben und deshalb unser Ansatz funktionieren kann.

Teil 1: Für Mensch und Maschine: Nützlichkeit verschiedener Formen

Jeder, der schon mit Pentominos oder anderen ähnlich komplexen Steinen gearbeitet hat, weiß: Die Steine haben nicht nur verschiedenes Aussehen, sie verhalten sich auch anders. Manche sind "gutmütig", sie sind nützlicher als andere, weil sie sich oft auch zum Schluss noch in den Rahmen einfügen lassen. Andere wollen zum Schluss nur schlecht passen und werden deshalb gern am Anfang verbaut. Dann ist man sie los und hat nur noch die gutmütigen Steine unterzubringen.

Daraus lässt sich eine Strategie formulieren: In einem ersten Schritt werden die vorhandenen Steine in verschiedene Gruppen nach Nützlichkeit eingeteilt. Im zweiten Schritt werden die Steine  entsprechend ihrer Nützlichkeit verwendet, wobei die nützlichsten so spät wie möglich verwendet werden.

Für Menschen ist dies offensichtlich eine brauchbare Strategie, aber auch dem Computer ist damit geholfen. Bei Algorithmen wie dem Backtracking wird versucht, die Steine nacheinander in den Rahmen einzupassen. Bleiben hier zum Schluss möglichst gutmütige Steine, um die verbliebene Restfläche zu füllen, dann sind die Chancen für einen schnellen Erfolg höher.

Es bleibt die Frage, wie die Nützlichkeit ermittelt werden kann. Eine erste Möglichkeit besteht in der Auswertung der eigenen Erfahrung bei der Lösung entsprechender Aufgaben. Bei Pentominos können sich viele darauf einigen, dass P und F gutmütige Pentominos sind und das X am allerwenigsten gutmütig ist.

Wenn wir nun an größere Steine wie Hexominos, Heptominos usw. denken, benötigen wir brauchbare Kriterien, die auf der Form der Steine beruhen können oder auf wirklich messbaren Kriterien. 

Auf Grund ihrer Form gibt es vielleicht die folgenden Kriterien:

  • lange gerade Stücken in Steinen sind nützlich (z.B. bei I und L), bei gradlinig begrenzten Rahmen werden viele davon am Rand benötigt.
  • lange Stücken mit immer wiederkehrenden Formen an einer Seite lassen sich an mehreren Stellen zusammenfügen. Dies betrifft neben geraden Stücken auch treppenförmige Ränder. (W)
  • 2x2-Blöcke in Steinen sind nützlich (bei P)
  • Wenig Symmetrie erlaubt mehr verschiedene Möglichkeiten und ist nützlich (P, L, F, Y, ..)
  • Viel Symmetrie erlaubt wenige verschiedene Möglichkeiten und ist weniger nützlich (I, X)
  • Viele herausstehende "stachelige" Teile sind wenig nützlich (X)
Hier wurden Pentominos eingeordnet, aber auch bei größeren Steinen sind diese Kriterien sinnvoll. Für Pentominos, Hexominos und Heptominos erhält man so eine Einteilung der Steine in nützlich J und schwierig L. 

Gibt es eine Möglichkeit, diese Nützlichkeit automatisiert zu messen? Dem soll in einem eigenen Post über die Messung der Nützlichkeit nachgegangen werden.

Ein ähnliches Experiment stammt von Lewis Patterson [1] aus dem Jahr 2019.


Mehr Infos:

[1] https://polyominoes.blogspot.com/2019/04/the-most-useful-pentominoes-experiment.html



15.1.23

Smart Eggs (Übersicht)

Kategorie: Labyrinthe

Die Smart Eggs haben eine Höhe von 6,4 cm und einen Durchmesser von 5 cm. Sie enthalten ein innenliegendes dreidimensionales Labyrinth, durch welches mit einem Stab hindurchnavigiert werden muss. Das Labyrinth selbst ist nicht sichtbar, so dass man die möglichen Bewegungen ertasten muss. Der dazugehörige Stab hat an beiden enden Kugeln, so dass der Stab das Labyrinth nur an großen kreisförmigen Enden verlassen kann. Und an den meisten Stellen kommt nur ein Teil des Stabes aus einer kreisförmigen Öffnung heraus, die zweite Kugel bleibt innen hängen. 

Auf der Oberfläche eines solchen Smart Eggs sieht man die großen Löcher ganz oben und ganz unten sowie in zwei bis weiteren Ebenen. Manche dieser Löcher sind durch Schlitze verbunden, in denen sich der Stab bewegen kann, die aber zu dünn für die Kugeln an den Enden der Stäbe sind.

Die Aufgabe besteht für jedes Smart Egg darin, den Stab durch das ober Loche einzuführen und dann solange in dem Labyrinth zu bewegen, bis man ihn unten wieder herausziehen kann. Das dauert bei den verschiedenen Modellen unterschiedlich lange und drückt sich in der Schwierigkeit aus.

Man kann die Bewegungen noch etwas genauer beschreiben: Bei einer Bewegung tritt der Stab mit seiner vorderen Kugel und dem nachfolgenden Stab aus einem Loch heraus. Wenn man weiter an dem Stab zieht, verschwindet die hintere Kugel im Inneren des Eis. Jetzt ändert der Stab seine Bewegungsrichtung und die beiden Kugeln tauschen ihre Rolle: Die eben verschwundene hintere Kugel soll aus einem anderen Loch als vordere Kugel wieder heraustreten und die dafür die andere Kugel verschwinden usw. Und das solange, bis der gesamte Stab aus dem unteren Loch herausgezogen werden kann.

Das war jetzt eine etwas umständliche Erklärung aufeinanderfolgender Züge, aber diese kann prima benutzt werden, um einen Lösungsalgorithmus zu beschreiben. 

Lösungsalgorithmus: Das Verfahren beruht darauf, dass es in den inneren Labyrinthen der Smart Eggs nur wenige und kurze Sackgassen gibt. Man muss also nur auf dem richtigen Weg bleiben und kommt relativ einfach durch die meisten Smart Eggs.

Was bei den Lösungsversuchen immer wieder passiert und in die Irre führt, ist das versehentliche Wenden auf dem Weg im Labyrinth. Man kehrt aus Versehen irgendwann um und bewegt sich zurück zur Startposition. Das kann man ganz einfach auf folgende Art verhindern: Wenn die hintere Kugel wie oben beschrieben durch ein Loch verschwunden ist, dann halten Sie mit einem Finger dieses Loch zu, damit Sie nicht aus Versehen wenden. Finden Sie nur ein Loch, aus dem jetzt die Kugel wieder austreten kann, dann ist das automatisch der richtige Zug. Und das wird fast immer der Fall sein!

Schwierigkeit: Eine Liste mit der Anzahl der nötigen Züge und dem Schwierigkeitsgrad gibt es bei ruwix.com [1] oder auf der Herstellerseite [2].

Ähnliche Geduldspiele: Außer diesen Smart Eggs ohne bewegliche Teile gibt es auch die kompliziertere Variante der zweischichtigen (2-layered) Smart Eggs. Diese enthalten entlang der senkrechten Achse einen beweglichen Zylinder mit weiteren Teilen des Labyrinths.

Design:  András Zagyvai
Hersteller: Smart Eggs
Erscheinungsjahr: ab 2012

Google: Smart Egg
Shopping: Lieferbar, Preis ca. 10-15€

Mehr Infos:

9.1.22

Backtracking für Anlegepuzzles

Am folgenden einfachen Geduldspiel soll Backtracking erklärt werden: Gegeben sind vier Karten für ein 2x2-Anlegepuzzle. Da hier eine Rotation der Karten erlaubt ist, muss dies auch beim Backtracking berücksichtigt werden.

Diese Karten sollen so in ein 2x2-Quadrat gelegt werden, dass sich an den Trennlinien jeweils einfarbige Dreiecke ergeben. Diese Quadrate mit den Nummern 1 bis 4 können noch mehrfach um 90 Grad (im Uhrzeigersinn) gedreht werden, diese Orientierungen werden mit a (wie abgebildet), b, c und d bezeichnet. Die Karte 2c ist also die Karte Nr. 2 um 180 Grad gedreht.

Die Felder des Geduldspiels sind ebenfalls mit 1 bis 4 durchnummeriert und sollen in dieser Reihenfolge nacheinander belegt werden:

Der Backtracking-Algorithmus startet mit dem leeren Rahmen und einer Reihe zunächst aller Karten. in alphabetischer Reihenfolge (Bild 1:  - 1a 2a 3a 4a). Das Minuszeichen in der Liste steht vor der aktuellen Bearbeitungsposition, bisher ist nichts eingefügt.

Die vorderste Karte der Reihe wird (in der aktuellen Orientierung) in das erste (freie) Feld im 2x2-Rahmen erfolgreich eingefügt. (Bild 2: 1a - 2a 3a 4a)

Danach ist die Bearbeitungsposition um eins nach rechts verschoben. Wieder soll die nun vorderste Karte nach der Bearbeitungsposition (in der aktuellen Orientierung) in das nächste freie Feld (also Feld Nummer 2) eingefügt werden. Das funktioniert nicht wegen des falschen Bildes an der linken Kante. Also wird die nächste Orientierung der aktuellen (also der zweiten) Karte versucht. Diese und die dritte funktionieren auch nicht, aber die vierte Orientierung funktioniert. Bild 3: 1a 2d - 3a 4a

Nun soll die nächste (dritte) Karte in das nächste (dritte) Feld eingefügt werden. Das klappt weder in der angegebenen ersten Orientierung noch in einer anderen. Außerdem ist noch die vierte Karte in der Liste, diese könnten wir auch an Position drei legen. Aber auch das passt in keiner Orientierung. Damit sind wir in einer Sackgasse und jetzt beginnt das eigentliche Backtracking:

Da wir an der dritten Position keine Karte mehr einfügen können, ist schon vorher eine unlösbare Situation eingetreten. War dies bei der zweiten Karte der Fall? Nein, da haben wir alle Orientierungen durchprobiert. Also müssen wir gleich bei der ersten Karte etwas ändern. Diese haben wir an dieser Stelle noch nicht in allen Orientierungen benutzt und wir drehen sie deshalb um 90 Grad (Bild 4: 1b - 2a 3a 4a).

Jetzt muss wieder Position 2 gefüllt werden. Die zweite Karte in der aktuellen Orientierung (2a) passt nicht, ebensowenig 2b und 2c. Allerdings passt wieder 2d (Bild 5: 1b 2d - 3a 4a).

Jetzt muss Position 3 gefüllt werden. Die nächste Karte passt sofort unter die erste Karte (Bild 6:  1b 2d 3a - 4a). 

Für die verbleibende Position 4 passt zwar nicht die Karte 4a, aber nach einer Rotation der Karte passt 4b.

Damit haben wir eine Lösung gefunden: (Bild 7:  1b 2d 3a – 4b). 


In der Notation des allgemeinen Backtracking haben wir damit von den vielen Möglichkeiten in alphabetischer Reihenfolge nur die folgenden Möglichkeiten betrachtet:

1a 2a
1a 2b
1a 2c
1a 2d 3a
1a 2d 3b
1a 2d 3c
1a 2d 3d
1a 2d 4a
1a 2d 4b
1a 2d 4c
1a 2d 4d
1b 2a
1b 2b
1b 2c
1b 2d 3a 4a
1b 2d 3a 4b

Falls alle Lösungen gesucht werden sollen, muss man dieses Verfahren einfach weiter fortsetzen.





Backtracking (Algorithmus)

Backtracking ist ein Algorithmus, der zur Lösung vieler Geduldspiele angewendet werden kann. Dazu gehören viele Legespiele und Packprobleme, solange sie auf einem regelmäßigen Gitter im zwei- oder dreidimensionalen Raum stattfinden. Als Beispiel sollen uns ein kleines Edge-Matching Puzzle sowie eine kleine Pentomino-Aufgabe dienen. Aber Backtracking ist beispielweise auch auf Sudoku anwendbar oder für das Acht-Damen-Problem auf dem Schachbrett.

Die zu lösenden Probleme müssen folgende Eigenschaften haben: 

  • Es gibt ein Feld (meist ein Teil aus einem regelmäßigen Gitter, z.B. ein Rechteck mit ganzzahligen Seitenlängen), welches mit Objekten belegt werden soll.
  • Dazu gibt es eine Menge von Objekten. Jedes Objekt füllt entsprechend seiner Form eines oder mehrere Elementarzellen des Gitters. Manchmal können die Objekte in verschiedenen Orientierungen verwendet werden, diese entstehen durch Drehen und/oder Wenden der Objekte (Wenden nur im zweidimensionalen Fall). 
  • Ein Objekt kann auf dem Feld an einer bestimmten Stelle platziert werden, wenn die entsprechenden Elementarzellen auf dem Feld frei sind (z.B. im Falle von Pentominos) und möglicherweise benachbarte Objekte zusammenpassen (wie bei Edge-Matching Puzzles).

Dazu kommen noch zwei technische Anforderungen für die Kodierung des Problems:

  • Die Elementarzellen des Feldes werden von eins beginnend durchnummeriert. Die Reihenfolge der Nummerierung ist zunächst egal, aber praktisch ist eine zeilenweise Nummerierung von oben nach unten.
  • Auch die Objekte werden nummeriert. Falls mehrere Orientierungen möglich sind, wird ein Buchstabe angefügt, der die Orientierung beschreibt (z.B. beschreibt 2a das zweite Objekt in der ersten Orientierung).

Dies ermöglicht es uns, die zu einem bestimmten Moment möglichen Züge in eine Reihenfolge zu bringen. Haben wir bereits einige Objekte auf dem Feld platziert, so verfügen wir über eine Menge noch nicht überdeckter Felder und eine Menge übriger Steine. 

Der Einfachheit halber wollen wir noch zwei weitere Annahmen machen. Diese vereinfachen den Algorithmus etwas, aber eine etwas kompliziertere Variante des Backtracking kann darauf auch verzichten.

  • Die Steine dürfen nicht rotiert oder gewendet werden, sind also in der vorliegenden Orientierung zu verwenden.
  • Außerdem soll das Feld vollständig gefüllt werden, es bleiben also keine freien Felder. Damit lassen sich sogenannte Sackgassen (s.u.) leichter erkennen.

Wir bringen die nun möglichen Züge in die folgende Reihenfolge:

  • Betrachtet werden nur Züge, die das Feld mit der kleinsten unüberdeckten Nummer bedecken.
  • Diese Züge ordnen wir nach der Nummer des jeweils verwendeten Steins (im allgemeinen Fall ggf. zusätzlich mit Orientierung), der das Feld überdecken wird.

Der nun folgende Algorithmus platziert die Objekte in allen möglichen Varianten auf dem Feld. Dadurch werden alle möglichen Lösungen gefunden. Darüber hinaus erkennt der Algorithmus Sackgassen, die es nicht weiter zu verfolgen lohnt. Dabei versteht man unter einer Sackgasse Folgendes: Wenn wir das komplette Feld bedecken sollen und beispielsweise bemerken, dass wir kein Objekt mehr zur Verfügung haben, um eine leeres Elementarzelle oben rechts zu bedecken, dann sind wir in einer Sackgasse. Da nützt es gar nichts, mit dieser Teillösung weiterzumachen und weitere Objekte an andere Stellen des Feldes zu legen, wir werden wegen der leer bleibenden Elementarzelle oben rechts niemals das ganze Feld füllen können.

Zu jedem Zeitpunkt gibt es eine Menge der noch einzufügenden Steine. Diese Steine sind immer entsprechend ihrer Nummer sortiert. Einer der Steine ist gerade ausgewählt und soll eingefügt werden. Wenn das nicht möglich ist (weil er nicht da nächste freie Feld bedecken kann), muss eine neue Auswahl getroffen werden, dies ist der nächste Stein aus der Menge der noch einzufügenden Steine.

Wir wollen uns zuerst eine etwas umständlichere Variante des Algorithmus ansehen. Das eigentliche Backtracking werden wir erst später einbauen. Zunächst schauen wir uns alle möglichen Reihenfolgen in ihrer natürlichen Reihenfolge an, in welcher wir die Steine verwenden können. Diese Reihenfolge sagt uns dann, wohin jeder Stein gelegt wird, weil immer das nächste freie Feld überdeckt werden soll.

Nehmen wir an, wir haben neun Steine; dann gibt es eine lange Reihe von 9!=362.880 verschiedene Reihenfolgen, die wir nacheinander durchprobieren könnten:

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 8 7 9
...
9 8 7 6 5 4 3 2 1

Die allermeisten von diesen Reihenfolgen führen nicht zu einer Lösung, und in der Regel merken wir das relativ schnell. Betrachten wir ein Beispiel: Wir beginnen mit der Reihenfolge 1 2 3 4 5 6 7 8 9 und nehmen an, dass wir zwar die ersten zwei Steine korrekt platzieren können, aber der Stein Nummer 3 nicht passt. Dann brauchen wir uns die Steine 4 bis 9 gar nicht mehr vorzunehmen:
Wenn Stein 3 nicht passt, dann sind die folgenden Reihenfolgen sämtlich keine Lösung:
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 9 8
...
1 2 3 9 8 7 6 5 4

Dies sind 6!=720 Zeilen, die in der oben erwähnten langen Reihe unmittelbar hintereinander stehen. Diese können alle übersprungen werden. Durch diesen Trick sparen wir sehr viele Versuche und der Algorithmus kommt in der langen Reihe schnell voran: Wenn der Anfang 1 2 3... nicht zu einer Lösung führt, probieren wir den nächsten Anfang 1 2 4... Jetzt nehmen wir einmal an, auch das passt nicht und die nachfolgenden Versuche mit 1 2 5..., 1 2 6..., 1 2 7...,1 2 8... und 1 2 9... passen auch nicht. Dann konnten wir nach dem ersten Stein zwar den zweiten einfügen, aber es ging nicht weiter. Also versuchen wir in unserer langen Reihe den nächsten möglichen Anfang, das ist 1 3.... Die erste Zeile in der langen Reihe mit diesem Anfang ist 1 3 2 4 5 6 7 8 9, dies ist die Zeile mit der Nummer 5040. Wir haben bisher sieben (vergebliche) Versuche gemacht und schon mehr als fünftausend Zeilen aus der langen Liste abgearbeitet. Je schneller sich eine Reihenfolge als unbrauchbar herausstellt, desto größer ist der übersprungene Block in der langen Liste. Falls also beispielsweise 1 3... nicht passt, geht es gleich weiter mit 1 4... und mit einem Versuch wurden weitere 5040 Zeilen übersprungen. Und wenn es eine Reihenfolge gibt, die zu einer Lösung führt, wird diese natürlich auch gefunden.

Der Backtracking-Algorithmus legt nun nicht wie im obigen Beispiel zuerst die sehr lange Liste an, sondern erzeugt nacheinander nur die wirklich zu betrachtenden Anfänge, in unserem Beispiel von oben wäre das

1 2 3
1 2 4
1 2 5
1 2 6
1 2 7
1 2 8
1 2 9
1 3
1 4
...

Wir wollen uns das genaue Verhalten von Backtracking noch an einem einfachen Edge Matching Puzzle ansehen.

Mehr Infos:


29.12.21

Äquivalente Anlegepuzzles: Fingerabdruck

Geduldspiele mit ausgetauschten Figuren

Es gibt viele mit unterschiedlichen Motiven bedruckt 3x3-Anlegepuzzles, aber sind die auch wirklich verschieden? Das Foto zeigt, dass die nicht so ist: Die beiden Geduldspiele haben eine völlig gleiche Struktur, Köpfe sind oben oder links. Und wo im linken Bild bei Das verflixte Tom & Jerry Spiel eine orange Figur steht, finden wir bei Duckula der Verflixte eine dunkelblaue Figur. Ebenso entsprechen sich andere Paare von Figuren. Wir können also die Geduldspiele ineinander überführen, indem wir einfach die Bilder passend austauschen. Das ist einfach zu machen und auch vergleichsweise einfach wieder herauszufinden.

Geduldspiele mit ausgetauschten Figuren und Rotation

Aber es geht auch komplizierter: Wir hätten bei der Ersetzung auch teilweise die Orientierung ändern können und Oberteile eines Bildes durch Unterteile des anderen Bildes ersetzen können und umgekehrt (natürlich nicht nur an einer Stelle, sondern an allen Vorkommen des Bildes). Das würde immer noch dieselben Lösungen liefern, aber die Äquivalenz wäre den Karten aber nicht mehr so einfach anzusehen.

Einfache Invarianten für Anlegepuzzles

Als Invarianten wollen wir hier Eigenschaften der Anlegepuzzles betrachten, die sich bei den oben genannten Austauschmöglichkeiten nicht ändern. Sind beispielsweise zwei Karten eines Anlegepuzzles identisch, so bleibt diese Eigenschaft auch beim Austausch von Figuren (mit oder ohne Änderung der Orientierung) erhalten. 

Invariante 1: Das Vorhandensein von Paaren (oder auch Dreiergruppen) identischer Karten.

Enthält eine Karte Halbbilder von allen vier Bildern, dann bleibt auch diese Eigenschaft beim Austausch von Figuren (mit oder ohne Änderung der Orientierung) erhalten. Deshalb:

Invariante 2: Die Anzahl der Karten mit Halbbildern von allen vier Bildern, dazu noch die Anzahl der Karten mit Halbbildern von nur drei Bildern, usw.

Invariante 3: Die Anzahl der Lösungen. Doch die muss man erst einmal kennen. Um sicher zu gehen, kann man den Legespiel-Solver von A. Keilhauer benutzen.

Diese Invarianten haben die Eigenschaft, dass zwei Anlegepuzzles mit sich unterscheidenden Invarianten nicht äquivalent sein können. Die Umkehrung gilt jedoch nicht, Geduldspiele mit gleichen Invarianten können durchaus nicht-äquivalent sein.

Der Fingerabdruck

Deshalb soll einem Anlegespiel ein sogenannter Fingerabdruck zugeordnet werden, der für äquivalente Puzzles derselbe ist, sich bei Austauschen und Umorientieren der Einzelbilder also nicht ändert. Damit können wir einfach entscheiden, ob wir ein neues oder ein bekanntes Geduldspiel vor uns liegen haben.

Das grundlegende Vorgehen ist folgendermaßen: Den Halbbildern auf den Karten werden Symbole aus der Menge ABCDabcd zugeordnet: Zusammenpassende Teile an den Kanten sind Aa, Bb, Cc und Dd. Groß- bzw. Kleinbuchstabe haben nichts mit Ober- / Unterteil eines geteilten Bildes zu tun, da die Zuordnung auf einem anderen Geduldspiel auch anders sein könnte. Strings aus diesen Buchstaben haben eine alphabetische Ordnung: Diese Ordnung solcher Strings ergibt sich aus der natürlich Ordnung der acht Zeichen wie angegeben, groß vor klein, dann alphabetisch. Alles zeichenweise von links nach rechts.

Wir betrachten jetzt eine dieser Zuordnungen. Mit ihr verfügen wir jetzt über eine Beschreibung einer Karte in einer vorgegebenen Orientierung, bestehend aus vier Buchstaben zu den Halbbildern oben, rechts, unten und links. Bei Rotation der Karte um 90 Grad ändert sich diese Beschreibung. Als minimale Beschreibung bezeichnen wir die alphabetisch kleinste dieser vier Möglichkeiten. Wenn wir diese minimalen Beschreibungen aller neun Karten in der eben erklärten alphabetischen Reihenfolge hintereinanderschreiben (der Übersichtlichkeit halber durch Minuszeichen getrennt), haben wir eine Beschreibung aller neun Karten in einem String. Dies ist die Beschreibung des Spiels entsprechend der gewählten Zuordnung.

Jetzt müssen wir nur noch aus den vielen möglichen Zuordnungen diejenige auswählen, welche die in alphabetischer Ordnung kleinste Beschreibung des Spieles liefert. Dies nennen wir den Fingerabdruck des Spiels.

Etwas ausführlicher ist der Fingerabdruck in [1] erklärt.

Solch ein typischer Fingerabdruck ist


Die neun Buchstabengruppen beschreiben die neun Karten, und man kann mit eigenen Bildern schnell wieder ein Geduldspiel daraus basteln. Außerdem stehen im Falle zweier gleicher Karten diese im Fingerabdruck direkt hintereinander.

Es sei noch einmal wiederholt: Identische Fingerabdrücke bedeuten für verschieden Anlegespiele, dass die äquivalent sind, sich also nur durch die graphische Gestaltung unterscheiden. Und gerade der oben angegebene Fingerabdruck wird bei verschiedenen Spielen noch öfter auftauchen..

Mehr Infos:

[1] Fingerabdruck für Anlegepuzzles

Geduldwürfel, mit SMT-Solver gelöst

Wegen der großen Ähnlichkeit des Geduldwürfels zu  Golf Putting Greene  lässt sich das vorhandene Lösungsprogramm von Golf Putting Gree...