我应该用什么模块来创建游戏树?

时间:2012-04-12 19:32:20

标签: python tree artificial-intelligence

我正在为Python编码类编写一个项目,我有一个问题。我正在写一个Reversi引擎,它会在游戏中看到前面的几个步骤,然后选择它认为最好的动作。虽然我知道python不是一种理想的语言(因为它没有其他一些语言那么快),但我认为编写至少是功能性的代码可能会有点慢。

话虽这么说,我正在尝试创建两个表:游戏板(想想一个矩阵)和一个可以保存整数的游戏树。我想使用一些内存有效且快速的附加,删除和读取条目。

我现在使用的电路板效率不高。我想问一下任何人会建议哪些模块(有关如何使用它们的说明)来写一些东西,这些东西会相当于这个,但内存更轻(例如:数组,numpy;除了我不知道如何使用它们之一这些):

self.board = [[0, 0, 0, 0, 0, 0, 0, 0,],
              [0, 0, 0, 0, 0, 0, 0, 0,],
              [0, 0, 0, 0, 0, 0, 0, 0,],
              [0, 0, 0, 1, 2, 0, 0, 0,],
              [0, 0, 0, 2, 1, 0, 0, 0,],
              [0, 0, 0, 0, 0, 0, 0, 0,]
              [0, 0, 0, 0, 0, 0, 0, 0,],
              [0, 0, 0, 0, 0, 0, 0, 0,]]

对于游戏树,我的想法取决于列表列表应该是多么轻量级。我正在使用标准python编写的一个想法类似于:

tree_zero = %

tree_one =  [%, %, %]

tree_two = [[%, %, %], [%, %, %], [%, %, %]]

tree_thre = [[[%, %, %], [%, %, %], [%, %, %]],
             [[%, %, %], [%, %, %], [%, %, %]],
             [[%, %, %], [%, %, %], [%, %, %]]],

tree_four = [[[[%, %, %], [%, %, %], [%, %, %]],
              [[%, %, %], [%, %, %], [%, %, %]],
              [[%, %, %], [%, %, %], [%, %, %]]],

             [[[%, %, %], [%, %, %], [%, %, %]],
              [[%, %, %], [%, %, %], [%, %, %]],
              [[%, %, %], [%, %, %], [%, %, %]]],

             [[[%, %, %], [%, %, %], [%, %, %]],
              [[%, %, %], [%, %, %], [%, %, %]],
              [[%, %, %], [%, %, %], [%, %, %]]]]

其中每个%都是上面给出的板之一(并且非常理想:并非每个回合都有三个选项)。但这是一个缓慢而沉重的对象,python很难有效地使用内存(特别是如果我比4层更深)。

如果有人之前使用过这样的程序,或者想要导入高效模块的想法,请告诉我!

有关游戏树的示例,请考虑wikipedia page,尤其是页面上的第一张图片。

编辑:理想情况下,我希望看到前面的四个步骤,这只是前四个级别看起来的一个例子。此外,将有多个给定树的副本浮动使用。速度对于像这样呈指数增长的东西很重要。

1 个答案:

答案 0 :(得分:3)

在我看来,Python对于这类工作来说是完美的!也就是说,我使用Python为棋盘游戏做了非常有趣和富有成效的时间。

我的第一个建议是探索Bit Boards。虽然这里的应用示例是国际象棋,但这个概念完全可以转让给黑白棋。使用零和1来表示在一组大小的板上存在碎片不仅具有更低的内存占用的优势,它还具有提高计算速度的优势(按位操作比相等操作更快)。

此外,您应该重新设计模型以某种方式实现递归(由评分函数促进)。这样的实现意味着您可以编写单个函数并允许它扩展无限移动深度(或者更确切地说,由您的设计限制,仅受资源限制),而不是预测和硬编码1,2,3,4移动的逻辑。设计良好的功能适用于双方(玩家),然后可以暂停以选择适合阈值的最佳选项(根据您选择的任何标准停止,计算位置/实时花费)。

作为参考,这里是我board game called Thud的github,它与你的程序几乎完全相同。在这里,我使用了一个17x17板,三个不同的部分和两个不同的策略 - 我们都看到它已经比Reversi的规则更复杂了。

哦,一个好的递归模型也适用于多线程!