Я разрабатываю маджонг-solitaire solver и до сих пор, я делаю довольно хорошо. Тем не менее, не так быстро, как хотелось бы, поэтому я прошу дополнительной оптимизации техники, о которых вы, ребята, знаете.Маджонг-solitaire алгоритм решения, который нуждается в ускорении
Все плитки известны из макетов, но решения нет. На данный момент у меня мало правил , которые гарантируют безопасное удаление определенных пар одинаковых плит (что не может быть препятствием для возможного решения).
Для наглядности, плитка свободна, когда ее можно выбрать в любое время, а плитка свободна, когда она не связывает какие-либо другие плитки.
- Если доступно четыре бесплатных плитки, немедленно удалите их.
- Если есть три плитки, которые можно подобрать, и по крайней мере один из них - свободная плитка, удалите незакрепленные.
- Если есть три плитки, которые можно подобрать, и только одна свободная плитка (две потери), удалите свободный и один случайный свободный.
- Если есть три свободные плитки, удалите два из них (не важно, какие из них).
- Поскольку в четыре раза больше одной и той же плитки, если два из них оставлены, удалите их, так как они остались единственными.
Мой алгоритм ищет решение в нескольких потоках рекурсивно. Как только ветка закончена (в положение, где больше нет движений), и это не привело к решению, оно помещает позицию в вектор, содержащий плохие. Теперь, всякий раз, когда запускается новая ветка, она будет перебираться через плохие позиции, чтобы проверить, была ли эта конкретная позиция уже проверена.
Этот процесс продолжается до тех пор, пока не будет найдено решение или не будут проверены все возможные позиции.
Это хорошо работает на макете, который содержит, скажем, 36 или 72 плитки. Но когда этого больше, , этот алгоритм становится практически бесполезным из-за огромного количества позиций для поиска.
Итак, я прошу вас еще раз, если у вас есть хорошие идеи, как реализовать больше правил для безопасного удаления фрагментов или любого другого ускорения в отношении алгоритма.
С наилучшими пожеланиями, nhaa123
Похоже, вы генерируете все возможные последовательности удаления плитки и исключаете те, которые приводят к решению. Это определенно будет очень медленным. – sharptooth
+1 для использования правильного имени пасьянса маджонг, а не просто «маджонг». –