Sie können eine völlig zufällige Konfiguration erstellen (das ist lösbar) und dann einen Solver verwenden, um die optimale Sequenz von Zügen zu bestimmen. Wenn die Sequenz lang genug für Sie ist, gut, sonst erzeugen Sie eine neue Konfiguration und wiederholen sich.
aktualisiert & Details
Es gibt eine article auf Wikipedia über das 15-Puzzle und wenn es (und ist nicht) auflösbar. Kurz gesagt, wenn sich das leere Quadrat in der unteren rechten Ecke befindet, dann ist das Puzzle genau dann lösbar, wenn die Anzahl der Inversionen (eine Inversion ist ein Tausch zweier Elemente in der Sequenz, nicht notwendigerweise benachbarter Elemente) in Bezug auf die Zielpermutation ist gleichmäßig.
Sie können dann leicht einen lösbaren Startzustand erzeugen, indem Sie eine gerade Anzahl von Inversionen durchführen, was zu einem nicht so leicht zu lösenden Zustand führt, viel schneller als bei normalen Bewegungen, und das ist garantiert bleibt lösbar.
Tatsächlich brauchen Sie keinen Suchalgorithmus wie oben erwähnt, sondern eine zulässige Heuristik. Solch ein
immer unterschätzt
überschätzt nie die Anzahl der Züge benötigt, um das Rätsel zu lösen, d. H. Sie sind garantiert, dass es weniger Züge braucht, die die Heuristik Ihnen sagt.
Eine gute Heuristik ist die Summe der Manhattan-Abstände jeder Zahl zu ihrer Zielposition.
Zusammenfassung
Kurz gesagt, ein möglicher (sehr einfach) Algorithmus für die Startpositionen zu erzeugen könnte wie folgt aussehen:
1: current_state <- goal_state
2: swap two arbitrary (randomly selected) pieces
3: swap two arbitrary (randomly selected) pieces again (to ensure solvability)
4: h <- heuristic(current_state)
5: if h > desired threshold
6: return current_state
7: else
8: go to 2.
Um absolut sicher zu sein, wie schwierig ein Zustand ist, was Sie brauchen mit einem Solver die optimale Lösung zu finden. Heuristiken geben Ihnen nur eine Schätzung.
das scheint wirklich wie ein Overkill. Ich hatte auf einige zufällige Fliesen Position mit einigen mathematischen Eigenschaften gehofft – user151496
danke! wird mir definitiv helfen, einen besseren Randomiser zu implementieren! – user151496