我正在开发一个连接4人工智能,并看到许多人正在使用this数据集,其中包含8层的所有法律职位及其最终结果。
我正在使用带有alpha / beta修剪的标准minimax作为我的搜索算法。看起来这个数据集可能对我的AI非常有用。但是,我正在努力寻找实现它的最佳方法。我认为最好的方法可能是处理列表,并使用board状态作为最终结果(win,loss,draw)的哈希值。
设计AI以使用这样的数据集的最佳方法是什么?我的想法是散列电路板状态,并在正确的轨道上使用传统搜索算法(例如minimax)吗?还是有更好的方法?
更新:我最终将大型移动数据库转换为普通的测试格式,其中1表示X和-1 O.然后我使用了一个字符串状态的字符串,一个表示最终结果,并将其放入std::unsorted_map
(请参阅Stack Overflow With Unordered Map以了解我遇到的问题)。地图的表现非常出色。它构建得很快,查找速度很快。但是,我从未完全正确地进行搜索。当游戏中的回合次数小于8时,是解决问题的正确方法,然后切换到常规的alpha-beta?
答案 0 :(得分:3)
您的方法似乎是正确的。
对于前8个移动,使用alpha-beta算法,并使用查找表来评估深度为8的每个节点的值。
一旦你“耗尽”了桌面(游戏中超过8个动作) - 你应该切换到常规的alpha-beta算法,以终端状态结束(在游戏树中留下)。
这非常有用,因为:
请记住,搜索树的复杂性为O(B^d)
- 其中B
是分支因子(每个州可能移动的数量),d
是到最后所需的深度。
通过使用这种方法,您可以有效地减少B
和d
的最大等待时间(需要计算的最长移动),因为:
d-8
(仅适用于最后一次移动),实际上会减少d
!B
。B^8
而不是B^d
。因此,由于这些原因,使用这种方法可以显着减少最长等待时间。
另请注意:如果您发现优化不够 - 您可以随时扩展查找表(至9,10,......首先移动),当然它会以指数方式增加所需空间 - 这是一个权衡需要检查并选择最符合您需求的东西(如果主内存不够,甚至可以将整个游戏存储在文件系统中)应该考虑。