我正在为简单的棋盘游戏编写AI引擎。我现在的简单实现是迭代所有可选的板状态,根据游戏规则和我的简单算法对每个状态进行加权,并根据该分数选择最佳移动。
由于评分算法完全没有状态,我想通过创建一些(所有?)板配置的哈希表来节省计算时间,并从那里获得分数而不是动态计算。
我的问题是:
1.我的方法合乎逻辑吗? (如果没有,你能给我一些提示来改善吗?:))
2.什么是最适合我需要的线程安全STL容器?我正在考虑使用char数组(板配置)作为键,将得分作为值
你能给我一些让AI成为杀手的技巧吗? :)
编辑:更多信息:
董事会是10x10,有两个球员,每个球员有10个棋子。这些规则很像跳棋。
答案 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来说是有益的,士兵想要知道哪条路径覆盖最多。神经网络为每个实体提供更多个性。您甚至可以使用级联神经网络,其中一个是策略,第二个是个性。