棋盘游戏AI设计:选择STL数据容器

时间:2011-03-25 10:37:00

标签: c++ data-structures stl artificial-intelligence

我正在为简单的棋盘游戏编写AI引擎。我现在的简单实现是迭代所有可选的板状态,根据游戏规则和我的简单算法对每个状态进行加权,并根据该分数选择最佳移动。

由于评分算法完全没有状态,我想通过创建一些(所有?)板配置的哈希表来节省计算时间,并从那里获得分数而不是动态计算。

我的问题是:
1.我的方法合乎逻辑吗? (如果没有,你能给我一些提示来改善吗?:))
2.什么是最适合我需要的线程安全STL容器?我正在考虑使用char数组(板配置)作为键,将得分作为值 你能给我一些让AI成为杀手的技巧吗? :)

编辑:更多信息:
董事会是10x10,有两个球员,每个球员有10个棋子。这些规则很像跳棋。

3 个答案:

答案 0 :(得分:4)

是的,将评估的电路板存储到称为转置表的哈希表中是很常见的。 STL容器可以是std::vector。通常,您必须创建一个哈希函数(例如 zobrist hashing )。哈希函数计算特定板的哈希值。 hash_value modulo HASH_TABLE_SIZE的结果将是std::vector的索引。

转置表条目可以包含的信息不仅仅是 board-score best-move ,您还可以存储深度评估板,如果评估得分(如果您正在进行 alpha-beta 搜索)

  • 确切
  • 上界
  • 或下限

我可以推荐chessprogramming网站,我在那里学到了很多东西。查找术语 alpha-beta 转置表 zobrist散列迭代加深。还有一些很好的论文可供进一步阅读:

答案 1 :(得分:2)

您的逻辑方法没问题,您应该阅读并尝试使用Minimax算法:

http://en.wikipedia.org/wiki/Minimax

我认为除了tic tac toe game之外,状态的数量会太大,你应该努力使计数更快。

答案 2 :(得分:1)

国际象棋和西洋跳棋可以用这种方法完成,但不是我推荐的。

如果你走这条路,那我就会用某种形式的树。如果你考虑一下,每一步都会减少移动前存在的总体可能性。另外,这允许难度级别。不要总是选择最好的,有时候选择次佳。

我不会走这条路的原因是它通常不是很有趣。人们直觉地接受了这一点,他们觉得这是不公平的。我写了一个无与伦比的连接4游戏,但是基于规则而不是游戏板状态。它很无聊。每一步都得到了同样的回应。我认为这也是这种方法中发生的事情。此外,这取决于你为什么这样做。如果要学习人工智能,很少有像这样的人工智能。如果它是一个有趣的游戏,它通常不是。如果是出于Deep Blue的原因,那么为了扩展计算机可以做的极限,那么肯定。

我要么使用基于单件的个人AI,然后选择具有最引人注目的参数的那个,或者我会使用爬山的变化并将一种策略高度放入棋盘。这取决于支撑件彼此之间的相互作用。对于个人AI,我会使用神经网络。

战略高度系统对于FPS来说是有益的,士兵想要知道哪条路径覆盖最多。神经网络为每个实体提供更多个性。您甚至可以使用级联神经网络,其中一个是策略,第二个是个性。