Kakuro (auch bekannt als "Cross Sums") ist ein beliebtes japanisches Logikrätsel, das mathematisch zur Klasse der NP-vollständigen Probleme gehört. Kakuro wird dabei häufig in Zeitungen abgedruckt und analog gespielt, ähnlich wie das in Deutschland weitaus bekanntere Sudoku.
Im vorliegenden Paper[1] von Tristan Cazenave wird untersucht, wie Monte-Carlo-Methoden die traditionellen Suchverfahren verbessern können. Kakuro wird hierbei als Constraint Satisfaction Problem modelliert.

Abb. 1 - menschliche Lösung eines 7x7 Kakuro, selbst erstellt
Kakuro-Puzzle bestehen aus einer Mischung aus leeren Feldern, die es zu befüllen gilt und Hinweisfeldern die dem Spieler beim Finden der Lösung helfen. Ziel des Puzzles ist es, in jedem leeren Feld eine eindeutige Ziffer einzutragen. Dabei müssen folgende Constraints erfüllt werden:
Mathematisch gesehen gehört Kakuro zur Klasse der NP-vollständigen Probleme[2:1]. Dies bedeutet, dass es nach aktuellem Kenntnisstand keinen Algorithmus gibt, der alle Kakuro-Rätsel in effizienter (polynomieller) Zeit lösen kann.
Die Komplexität eines spezifischen Kakuro-Rätsels wird primär durch zwei Faktoren bestimmt:
Der menschliche Ansatz besteht im Wesentlichen darin, zuerst die Hinweiszahlen zu bearbeiten, die im Zusammenspiel mit den freien Feldern nur sehr wenige Kombinationen zulassen. Bei zwei freien Feldern gibt es beispielsweise die Summen 17, 16, 3 und 4, die jeweils aus einer eindeutigen Kombination aus Ziffern bestehen.
Durch die einfacheren Kombinationen erarbeitet man sich dann die Hinweise, um schwerere Zeilen/Spalten anzugehen.

Abb. 3 - Lösung für 5x5 Kakuro, Abbildung aus dem Paper [1:2]

Abb. 2 - Ein quadratisches 5x5 Kakuro, Abbildung aus dem Paper [1:3]
Im Paper "Monte-Carlo Kakuro"[1:4] vergleicht der Autor Tristan Cazenave vier aufeinander aufbauende Ansätze, um als CSP modellierte Kakuro Puzzle zu lösen. Dabei werden ganz bewusst komplett leere, quadratische Kakuro Puzzle verwendet. Mit einem solchen Aufbau ist ein Kakuro für einen Menschen nahezu unlösbar, dafür werden dort die Unterschiede zwischen verschiedenen Algorithmen im Worst-Case-Szenario deutlich.
Dies ist eine Form der Tiefensuche (Depth First Search). Nach jeder Zuweisung einer Zahl wird der Wertebereich (Domain) der verbleibenden freien Variablen reduziert. Wenn eine Zuweisung dazu führt, dass ein Feld keine möglichen Werte mehr hat oder die Summe nicht mehr erreicht werden kann, wird der Pfad als inkonsistent verworfen.
Dieser Ansatz nutzt Forward Checking zur Aktualisierung der Wertebereiche, wählt dann aber wiederholt zufällige Zuweisungen (Samples) bis eine Lösung gefunden wurde oder keine Züge mehr möglich sind.
Hierbei werden für alle möglichen Zuweisungen einer Variablen Testspiele (Samples) durchgeführt. Der Algorithmus wählt den Spielzug, der im anschließenden Sample den besten Score erzielt hat, und speichert die erfolgreichsten Sequenzen.
Der Kern des Papers ist die Anwendung von Nested Monte Carlo Search. Dieser Algorithmus treibt den Meta-Ansatz weiter, indem er mehrere rekursive Ebenen (Level) benutzt. Dabei entspricht Level 1 im Wesentlichen der Meta Monte-Carlo Search. Im Gegensatz zu klassischen Algorithmen benötigt NMCS kein spezifisches Domänenwissen und ist somit breit anwendbar. Der Nested Monte Carlo Search Algorithmus benutzt rekursive Simulationen, um mögliche Züge zu bewerten. Dabei wird die Rekursionstiefe als "Level" bezeichnet.
Niedrigere Level simulieren ein ganzes Spiel um eine Bewertung abzugeben, höhere Level nutzen diese Bewertungen um eine Vorstellung zu bekommen, wie gut ein Spielzug ist.
Pseudocode[1:5]
int nested (level)
best score = number of free variables
while true
choose a free variable var
for all values in the domain of var
assign value to var
update the domains of the free variables
if a domain is empty or inconsistent then
score = 1 + number of free variables
else if level is 1
score = sample ()
else
score = nested (level - 1)
if score < best score then
best score = score
best sequence = {{var,value},level-1 sequence}
var = pop variable of the best sequence
value = pop value of the best sequence
assign value to var
update the domains of the free variables
if a domain is empty or inconsistent then
return 1 + number of free variables
if no free variable or best score equals 0 then
return 0
Ein kritischer Aspekt des NMCS ist das Speichern der besten Sequenz. Findet eine Simulation auf einem niedrigeren Level einen Pfad, der besser als der bisherige Bestwert ist, wird diese gesamte Abfolge von Zügen auf das höhere Level übernommen. Dies verhindert, dass gute Lösungen durch spätere Zufallsentscheidungen "verloren" gehen
Obwohl NMCS auf Zufall basiert, nutzt Cazenave eine bewährte CSP-Heuristik: Bei der Entscheidung, welches Feld als nächstes befüllt wird, wählt der Algorithmus immer das Feld mit der kleinsten verbleibenden Domain (den wenigsten möglichen Ziffern). Die Ziffer selbst wird dann auf Basis der Monte-Carlo-Simulationen gewählt.

Abb. 4 -Visualisierte Beispielausführung auf einem 5x5 Grid, selbst erstellt
Neben den von Cazenave untersuchten Monte-Carlo-Methoden gibt es spezialisierte mathematische und informatische Ansätze zur Lösung von Kakuro:
SAT-Solver[2:2]: Durch die Kodierung der Kakuro-Regeln in die Aussagenlogik können hochoptimierte Solver wie MiniSat oder GlueMiniSat verwendet werden. Dabei wird jedes Feld durch binäre Variablen repräsentiert, die angeben, welche Ziffer (1–9) enthalten ist.
Constraint Programming[3]: Da sich Kakuro als klassisches Constraint Satisfaction Problem modellieren lässt, können auch moderne Constraint-Programming Solver benutzt werden. Diese Solver nutzen Sprachen wie Copris oder Z3, um die "All-Different"- und "Sum"-Constraints effizient zu verarbeiten.
Genetische Algorithmen[4]: Diese nutzen evolutionäre Prinzipien (Mutation, Selektion), um Lösungskandidaten zu verbessern. Neuere Ansätze verwenden dynamische Mutationsraten, um lokale Optima zu vermeiden.
In den Experimenten von Cazenave zeigt sich eine drastische Überlegenheit der NMCS gegenüber klassischen CSP-Lösern bei leeren Gittern.[1:6]
| Algorithmus | Gelöste 8x8 Gitter | Gesamtzeit (Sek.) |
|---|---|---|
| Nested Level 2 | 100 / 100 | 17,85 s |
| Nested Level 1 | 100 / 100 | 78,30 s |
| Iterative Sampling | 10 / 100 | 94.605,16 s |
| Forward Checking | 8 / 100 | 92.131,18 s |
Die Daten verdeutlichen, dass Kakuro mit steigender Anzahl leerer Felder (Holes) exponentiell schwieriger für Forward Checking wird, während NMCS Level 2 selbst leere 8x8 Grids effizient löst.
Nested Monte Carlo Search schneidet von den vier verglichenen Algorithmen mit Abstand am besten ab. Ein systematischer Vergleich mit den anderen Ansätzen SAT-Solver, Constraint Programming und Metaheuristiken steht noch aus. Des Weiteren erwähnt Cazenave im Paper eine vielversprechende Richtung zur Verbesserung des Algorithmus. Wenn man NMCS mit besseren Konsistenzprüfungen (Domain Specific Knowledge) kombiniert, könnte die Effizienz der Simulationen gesteigert werden, indem unmögliche Werte frühzeitig weggeschnitten werden. (Pruning)
Cazenave, Tristan. "Monte-carlo kakuro." Advances in Computer Games. Berlin, Heidelberg: Springer Berlin Heidelberg, 2009. 45-54. researchgate ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Ruepp, Oliver, and Markus Holzer. "The computational complexity of the Kakuro puzzle, revisited." International Conference on Fun with Algorithms. Berlin, Heidelberg: Springer Berlin Heidelberg, 2010. ↩︎ ↩︎ ↩︎
Simonis, Helmut. "Kakuro as a constraint problem." Proc. seventh Int. Works. on Constraint Modelling and Reformulation (2008). ↩︎
Sexton, Aaron, Erik Anderson, and James Hereford. "An improved evolutionary strategy with dynamic mutation rate applied to kakuro puzzles." 2019 SoutheastCon. IEEE, 2019. ↩︎