Bei der Programmierung eines Zufallsgenerators für ein kachelbasiertes Spiel bin ich auf ein interessantes Problem gestoßen. Ich habe einen Brute-Force-Solver dafür implementiert, aber er ist exponentiell langsam und definitiv ungeeignet für meinen Anwendungsfall. Ich bin nicht unbedingt auf der Suche nach einer perfekten Lösung, ich bin mit einer "gut genug" Lösung, die gut funktioniert, zufrieden.
Problemstellung:
Angenommen, Sie haben alle oder eine Teilmenge der folgenden Kacheln zur Verfügung (dies ist die Kombination aller möglichen 4-Bit-Muster, die den Richtungen rechts, oben, links und unten zugeordnet sind):
Alt-Text http://img189.imageshack.us/img189/3713/basetileset.png
Sie erhalten ein Raster, in dem einige Zellen markiert sind (wahr) und andere nicht (falsch). Dies könnte zum Beispiel durch einen Perlin-Rausch-Algorithmus erzeugt werden. Ziel ist es, diesen Raum mit Kacheln zu füllen, so dass es möglichst viele komplexe Kacheln gibt. Im Idealfall sollten alle Kacheln miteinander verbunden sein. Für einige Eingabewerte (verfügbare Kacheln + Muster) gibt es möglicherweise keine Lösung. Es gibt immer mindestens eine Lösung, wenn die obere linke, unverbundene Kachel verfügbar ist (d. h. alle Musterzellen können mit dieser Kachel gefüllt werden).
Beispiel:
Bilder von links nach rechts: Verfügbarkeit von Kacheln (grüne Kacheln können verwendet werden, rote nicht), Muster zum Füllen und eine Lösung
Alt-Text http://img806.imageshack.us/img806/2391/sampletileset.png + Alt-Text http://img841.imageshack.us/img841/7/samplepattern.png \= Alt-Text http://img690.imageshack.us/img690/2585/samplesolution.png
Was ich ausprobiert habe:
Meine Brute-Force-Implementierung probiert jede mögliche Kachel überall aus und verfolgt die gefundenen Lösungen. Schließlich wählt sie die Lösung, die die Gesamtzahl der von den einzelnen Kacheln ausgehenden Verbindungen maximiert. Die benötigte Zeit hängt exponentiell von der Anzahl der Kacheln im Muster ab. Die Lösung eines Musters mit 12 Kacheln dauert ein paar Sekunden.
Anmerkungen:
Wie ich schon sagte, ist Leistung wichtiger als Perfektion. Die endgültige Lösung muss jedoch korrekt verbunden sein (keine Kachel, die auf eine Kachel zeigt, die nicht auf die ursprüngliche Kachel zeigt). Um eine Vorstellung vom Umfang zu geben, würde ich gerne ein Muster von 100 Kacheln in etwa 2 Sekunden bearbeiten.