Алгоритм пасьянса маджонг, который требует ускорения - PullRequest
1 голос
/ 27 мая 2009

Я занимаюсь разработкой пасьянса для маджонга и пока у меня все хорошо. Тем не мение, это не так быстро, как хотелось бы, поэтому я прошу дополнительную оптимизацию техники, о которых вы, ребята, могли бы знать.

Все тайлы известны по макетам, но решения нет. На данный момент у меня мало правила, гарантирующие безопасное удаление определенных пар одинаковых плиток (которые не могут быть препятствием для возможного решения).

Для ясности плитка свободна, когда ее можно выбрать в любое время, и плитка свободна, когда она вообще не связывает никакие другие плитки.

  • Если доступно четыре бесплатных бесплатных тайла, немедленно удалите их.
  • Если есть три плитки, которые можно собрать, и хотя бы одна из них - свободная плитка, удалите неплотные.
  • Если есть три плитки, которые можно собрать, и только одна свободная плитка (две неудачи), удалите свободную и одну случайную потерю.
  • Если доступно три свободных фишки, удалите две из них (не важно, какие из них).
  • Поскольку в четыре раза больше одного и того же тайла, если осталось два, удалите их, так как они остались одни.

Мой алгоритм рекурсивно ищет решение в нескольких потоках. Как только ветка закончена (до позиции, в которой больше нет ходов) и она не привела к решению, она помещает позицию в вектор, содержащий плохие. Теперь, каждый раз, когда запускается новая ветка, она будет проходить итерацию по плохим позициям, чтобы проверить, проверена ли уже эта конкретная позиция.
Этот процесс продолжается до тех пор, пока не будет найдено решение или пока не будут проверены все возможные позиции.

Это хорошо работает на макете, который содержит, скажем, 36 или 72 плитки. Но когда есть больше, этот алгоритм становится практически бесполезным из-за огромного количества позиций для поиска.

Итак, я еще раз спрашиваю вас, есть ли у кого-нибудь из вас хорошие идеи о том, как реализовать больше правил для безопасного удаления плитки или любого другого конкретного ускорения в отношении алгоритма.

С наилучшими пожеланиями, nhaa123

Ответы [ 3 ]

2 голосов
/ 15 октября 2010

Несколько лет назад я написал программу, которая решает доски пасьянсов Маджонг, заглядывая. Я использовал его, чтобы исследовать миллион черепах (занимал день или что-то на половине компьютера: у него было два ядра), и оказалось, что около 2,96 процента из них не могут быть решены.

http://www.math.ru.nl/~debondt/mjsolver.html

Хорошо, это было не то, что вы просили, но вы могли бы взглянуть на код, чтобы найти в нем некоторую эвристику, которая не приходила вам в голову. Программа не использует более нескольких мегабайт памяти.

2 голосов
/ 27 мая 2009

Я не совсем понимаю, как работает ваш решатель. Когда у вас есть выбор ходов, как вы решаете, какую возможность исследовать в первую очередь?

Если вы выберете произвольную, это не достаточно хорошо - это просто грубый поиск, в основном. Возможно, вам придется изучить «лучшие ветви» в первую очередь. Чтобы определить, какие ветви «лучше», вам нужна эвристическая функция, которая оценивает позицию. Затем вы можете использовать один из популярных эвристических алгоритмов поиска. Проверьте это:

  • A * search
  • поиск луча

(Google твой друг)

0 голосов
/ 27 мая 2009

Вместо вектора, содержащего «плохие» позиции, используйте набор с постоянным временем поиска вместо линейного.

...