4

我正在为 Python 编码类编写一个项目,我有一个问题。我正在编写一个黑白棋引擎,它将在游戏中向前看几个动作,然后选择它认为最好的动作。虽然我知道 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 层更深)。

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

举一个游戏树的例子,想想维基百科页面,尤其是页面上的第一张图片。

编辑:理想情况下,我想进一步看四步,这只是前四个级别的示例。此外,将有给定树的多个副本漂浮在周围以供使用。对于像这样呈指数增长的事物,速度很重要。

4

1 回答 1

3

在我看来,Python 非常适合这种工作!也就是说,我在使用 Python 为棋盘游戏做 AI 时度过了一段非常有趣和高效的时光。

我的第一个建议是探索Bit Boards。虽然这里的应用示例是针对国际象棋的,但这个概念完全可以转移到黑白棋。使用 0 和 1 来表示集合大小的板上是否存在棋子不仅具有内存占用少的优势,而且还具有提高计算速度的优势(按位运算比等式运算更快)。

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

作为参考,这里是一个名为 Thud 的棋盘游戏的 github,它的要求与您的程序几乎完全相同。在这里,我使用了一个 17x17 的棋盘、三个不同的棋子和两种不同的策略——我们都可以看到这已经比黑白棋的规则更复杂了。

哦,一个好的递归模型也可以容纳多线程!

于 2012-04-12T20:19:20.087 回答