蛮力解决棋盘游戏的数据库

时间:2011-05-28 03:26:21

标签: algorithm database-design brute-force

几年前,研究人员宣布他们已经完成了对检查员的蛮力全面解决方案。

我一直对另一个应该拥有更少状态的类似游戏感兴趣,但在任何合理的时间范围内运行完整的求解器仍然是不切实际的。我仍然想尝试,因为即使是部分解决方案也可以提供有价值的信息。

从概念上讲,我希望有一个游戏状态数据库,其中包含所有已知位置以及其后续位置。一个或多个客户端可以从数据库中获取未探测状态,计算可能的移动,并将新状态插入数据库。一旦找到最终游戏状态,可以使用minimax信息更新导致它的所有状态以构建决策树。如果做出明智的决定来挑选可能的分支进行探索,我可以为最重要的分支建立信息,然后逐渐建立起来。

忽略这个想法的优点,或者它的可行性,实现这样一个数据库的最佳方法是什么?我在sql server中创建了一个快速原型,它存储了每个状态的字符串表示。它起作用了,但我的求解器客户端运行速度非常慢,因为它一次排出一个状态并计算所有移动。我觉得我需要在内存中做更大的块,但是搜索空间肯定太大了,不能一次将它全部存储在内存中。

是否有更适合此类工作的数据库系统?我将做很多插入,大量读取(检查状态(或等效状态)是否已经存在),以及很少的更新。

此外,我如何并行化它,以便许多客户可以在不重复太多工作的情况下解决不同的分支。我正在考虑一个程序,它检查一个任务,生成几百万个状态,然后将其提交回主数据库。我只是不确定这样的东西是否会运作良好,或者是否有先前的方法来处理这类事情。

3 个答案:

答案 0 :(得分:2)

毫无疑问,您需要某种类型的任务队列服务,例如RabbitMQ - 可能与数据库结合使用,该数据库可以在计算数据后存储数据。或者,您可以使用亚马逊的SQS等托管服务。客户端将使用队列中的项目,生成后继者,并将这些项目排入队列,以及将刚刚使用的项目的结果添加到队列中。如果状态是结束状态,它可以通过咨询数据库将评分信息传播到父元素。

要记住两个警告:

  1. 当您浏览树时,队列中的项目数可能会呈指数级增长,每个工作项会导致多个项目入队。准备好排长队。
  2. 根据您的游戏,可能会有多条路径指向同一游戏状态。您需要检查并消除重复项,并且需要对数据库进行结构化,使其成为图形(可能带有循环!),而不是树。

答案 1 :(得分:2)

为了解决游戏问题,你真正需要知道的数据库状态是什么,它的游戏理论价值是什么,即如果它转向移动,丢失或被迫的玩家获胜画。每个状态需要两位来编码这些信息。

然后,您可以为要构建最终游戏数据库的游戏状态集找到尽可能紧凑的编码;假设您的编码需要20位。这足以让你的硬盘上有一个2 21 位的数组,即2 13 字节。分析游戏结束位置时,首先要检查数据库中是否已经设置了相应的值;如果不是,计算其所有后继者,递归计算他们的游戏理论值,然后使用min / max计算原始节点的游戏理论值并存储在数据库中。 (注意:如果你将赢/输/抽奖数据存储为两位,你有一位模式表示'未知';例如00 =未知,11 =平局,10 =移动获胜的玩家,01 =玩家到移动失败)。

例如,考虑tic-tac-toe。有九个方块;每一个都可以是空的,“X”或“O”。这种天真的分析给出了每个状态3 9 = 2 14.26 = 15位,所以你将得到一个2 16 位的数组。

答案 2 :(得分:1)

我想到的第一件事是共享'白板'的Linda风格,不同的流程可以消除白板上的“问题”,向白板添加新问题,并添加'解决方案'到白板。

也许Cassandra项目是Linda的更现代版本。

已经有许多尝试在分布式计算机系统中并行化问题; Folding@Home提供了一个框架,可以执行二进制blob'核心'来解决蛋白质折叠问题。 Distributed.net可能已经开始了分布式问题解决的现代化,并且可能有客户可以从中开始。