Kakuro
Einleitung
Kakuro (oder auch Cross Sums) ist ein altes Logikrätsel aus Japan. In vielen Zeitschriften, in denen Sudokus oder Kreuzworträtsel veröffentlicht werden sind auch Kakuro Rätsel zu finden. In der heutigen Zeit kann man außerdem auch ganz entspannt online auf Platformen wie zum Beispiel auf Janko an Kakuros, in verschiedenen Größen und Schwierigkeitsstufen, knobeln.
Regeln
Kakuro ist sehr einfach gehalten, es gibt nur drei Regeln:
- Die weißen Felder müssen mit Zahlen zwischen 1 und 9 gefüllt werden.
- Die schwarzen Felder geben die Summen an, die die Werte der weißen Felder in den Reihen links, bzw. den Spalten unter den jeweiligen schwarzen Feldern aufsummiert ergeben müssen.
- In den Summen darf jede Zahl nur ein einziges mal vorkommen.
Ein Kakuro Puzzel ist dabei immer eindeutig lösbar.
Komplexität
Das Problem der Kakuro Puzzel wurde in The Computational Complexity of the Kakuro Puzzle, Revisited [2] als NP-Komplett bewiesen. Damit werden die Kakuro Rätsel für Informatiker umso spannender. Wir wollen uns im Weiteren damit beschäftigen, wie wir trotz der Komplexität einen effizienten Lösungsweg entwickeln können.
Constraint Satisfaction Problem
Der simple Aufbau und den einzigen drei Regeln machen die Kakuro Puzzel sehr geeignet, um sie als Constraint Satisfaction Problem zu modellieren und mit Constraint Programming effizient eine Lösung zu suchen. Die Grundlagen des Constraint Programming werden auf der Wiki-Seite für Constraint Programming erklärt.
Zuerst wollen wir ein Kakuro Puzzel als ein Paar von zwei Mengen definieren
G=\{x_1,...,x_i\}
stellt die Menge der weißen, zu befüllenden, Felder dar. Die Menge:
H=\{<v_1,I_1>,...,<v_j,I_j>\}
definiert die durch die schwarzen Felder vorgegebenen Summen. Dabei gibt
Kakuro, mit einem
- Variablen
X=G , die die weißen Felder darstellen, die gefüllt werden müssen. - Domänen
D=\{[1,9],...,[1,9]\} , jede Variable, bzw. jedes weiße Feld kann mit Zahlen zwischen 1 und 9 belegt werden. - Constraints
C , die die drei Grundregeln modellieren.
Die Regel, dass alle weißen Felder mit Zahlen zwischen 1 und 9 belegt werden können haben wir schon durch die Domänen defieniert. Die weiten zwei Regeln wollen wir durch folgenden zwei Constraints definieren:
- Vorgegebenen Summen müssen eingehalten werden:
\forall_{<I,v> \in H}:\sum_{i \in I}x_i=v
- Die Werte in den Summen sollen alle einzigartig sein:
\forall_{<I,v> \in H}: alldifferent(\{x_i|i \in I\})
alldifferent(x_1,...,x_n) := \{(d_1,...,d_n) | d_i \neq d_j \ for \ i \neq j\}
Mit dieser Definition haben wir ein Constraint Satisfaction Problem modelliert und können nun mit dem Suchalgorithmus eines Constraint Solver auf effizienter Weise eine Lösungsmenge suchen.
Auswertung
In Kakuro as a constraint problem[3:1] wird ein Kakuro Puzzel wie oben beschrieben in der Constraint Logic Programming Plattform ECLiPSe[4] als Constraint Satisfaction Problem modelliert und gegen verschieden Mengen an Kakuro Puzzeln getestet.
Schema:
Set: Getestetes Set an Puzzel
X, Y: Größe der Puzzel
K: Größe des Set
Setup: Prozent der nach dem Setup gelösten Puzzel
Shave: Prozent der nach dem Shaving gelösten Puzzel
Total: Prozent der gelösten Puzzel - begrenzt auf 500.000 Knoten in der Suche
Avg Time: Durchnittliche gebrauchte Zeit
Max Time: Maximal gebrauchte Zeit
Avg Back: Durchschnittlich gebrauchte Backtracking-Schritte
Max Back: Maximal gebrauchte Backtracking-Schritte
n/a: Es gab kein erfolgreichen Durchlauf
Im ersten Durchlauf wurde ein reiner Backtracking-Algorithmus ohne jegliche Optimierung genutzt. Es wird deutlich, dass dieser Ansatz nicht effizient ist und für viele größeren Puzzel gar keine Löung innerhalb der Grenze gefunden wird.
Im zweiten Durchlauf wird die Suche durch die Domänreduktion des Forward Checking genutzt, wodurch der Suchbaum stark reduziert wird und eine deutliche Steigerung in der Effizienz erreicht wird. Bis auf das größte Kakuro wird nun für alle Puzzeln eine Lösung gefunden.
Im dritten Durchlauf wird das globale
Referenzen
Abbildungen
- Abbildung 1: Aus den Beispielen von Janko [1:1]
- Abbildung 2: Aus den Beispielen von Janko [1:2]
- Abbildung 3,4,5: Aus Kakuro as a constraint problem [3:2]
Janko, Karl. Kakuro Rätsel. Janko.at, https://www.janko.at/Raetsel/Kakuro/index.htm. Zugriff am 22.01.2025. ↩︎ ↩︎ ↩︎
Ruepp, Oliver, und Markus Holzer. „The Computational Complexity of the Kakuro Puzzle, Revisited“. Fun with Algorithms, herausgegeben von Paolo Boldi und Luisa Gargano, Bd. 6099, Springer Berlin Heidelberg, 2010, S. 319–30. DOI.org (Crossref), https://doi.org/10.1007/978-3-642-13122-6_31. ↩︎
Simonis, Helmut. "Kakuro as a constraint problem." Proc. seventh Int. Works. on Constraint Modelling and
Reformulation (2008).pdf ↩︎ ↩︎ ↩︎Wallace, Mark, u. a. ECLiPSe : A Platform for Constraint Logic Programming.pdf ↩︎