Mahjong-solitaire求解器算法,需要加速

时间:2009-05-27 07:45:17

标签: c++ algorithm mahjong

我正在开发一个麻将纸牌解决方案,到目前为止,我做得很好。然而, 它没有我想要的那么快,所以我要求任何额外的优化 你们可能知道的技巧。

所有图块都是从布局中知道的,但解决方案却不是。目前,我很少 保证安全移除某些相同瓦片对的规则(不能成为可能的解决方案的障碍)。

为了清楚起见,当瓷砖没有任何其他瓷砖时,任何时候都可以挑选瓷砖是免费的,瓷砖是松散的。

  • 如果有四个免费的免费瓷砖,请立即将它们移除。
  • 如果有三个可以拾取的瓷砖,并且其中至少有一个是松散的瓷砖,请移除非松散的瓷砖。
  • 如果有三个可以拾取的瓷砖,只有一个免费瓷砖(两个松散),请移除免费并随意松散。
  • 如果有三个可用的松散瓷砖,请移除其中两个(无论哪个)。
  • 由于完全相同的瓷砖有四倍,如果剩下其中两个,请删除它们,因为它们是唯一剩下的。

我的算法以递归方式在多个线程中搜索解决方案。一旦分支完成(到没有更多移动的位置)并且它没有导致解决方案,它将位置放在包含不良分支的向量中。现在,每次启动新分支时,如果已经检查了特定位置,它将通过坏位置进行迭代检查。 此过程将持续到找到解决方案或正在检查所有可能的位置。

这适用于包含36或72个图块的布局。但是当有更多时, 由于需要搜索大量的位置,这个算法变得毫无用处。

所以,我再次问你,如果你们中的任何一个人有很好的想法如何实现更多安全磁贴删除规则或任何其他有关算法的特定加速。

非常好的问候, nhaa123

4 个答案:

答案 0 :(得分:2)

我不完全理解你的解算器是如何工作的。当你有选择的动作时,你如何决定首先探索哪种可能性?

如果你挑选任意一个,那就不够好了 - 基本上只是粗暴的搜索。您可能需要先探索“更好的分支”。要确定哪些分支“更好”,您需要一个评估位置的启发式函数。然后,您可以使用流行的启发式搜索算法之一。检查这些:

  • A * search
  • beam search

(Google是你的朋友)

答案 1 :(得分:2)

几年前,我写了一个程序,通过偷看来解决Solitaire Mahjongg板。我用它来检查一百万只乌龟(在一台计算机上花了一天或者其他东西:它有两个核心),看起来大约2.96%的乌龟无法解决。

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

好吧,那不是你提出的问题,但是你可能会看一下代码,找到一些迄今为止没有想到的修剪启发法。该程序不会使用超过几兆的内存。

答案 2 :(得分:0)

使用一个具有常量查找时间而不是线性查找时间的集合,而不是包含“坏”位置的向量。

答案 3 :(得分:0)

如果有 4 个 Tiles 可见但无法拾取,则必须先移除周围的其他 Tiles。路径应该使用您的规则移除最少的瓷砖,朝向这些瓷砖,以打开它们。

如果 Tiles 被其他 Tiles 隐藏,则问题没有找到路径的完整信息,需要计算剩余 Tiles 的概率。

非常好的问题!