我开发了一个使用alpha beta修剪的并行化检查器(英文草稿)游戏,以便找到机器可以做出的最佳动作。我想知道增加游戏树的深度/级别并使用alpha beta修剪算法进行搜索是否必然会产生最佳移动?
我正在低级机器上运行而且我无法累加超过9的深度。我已经使用以下测试用例检查了我的程序,但考虑到深度,我得到了相同的可能性如下1至9。
case 1
+B+B+B+B
B+B+B+B+
+B+B+B+B
O+O+O+O+
+O+O+O+O
A+A+A+A+
+A+A+A+A
A+A+A+A+ output: (5, 0) => (4, 1)
case 2
+B+B+B+B
O+O+B+B+
+O+O+B+B
O+B+O+O+
+O+O+O+O
A+A+A+O+
+O+O+O+O
O+O+O+O+ output: (5, 2) => (4, 3)
case 3
+O+O+O+O
O+O+O+O+
+B+O+O+O
O+O+O+O+
+B+B+O+O
O+A+A+O+
+O+O+O+O
O+O+A+A+ output: (5, 2) => (3, 4)
case 4
+k+O+O+O
O+B+O+O+
+O+O+O+B
O+O+O+B+
+O+O+B+O
O+O+O+O+
+O+O+O+O
A+A+A+A+ output: (0, 1) => (2, 3)
case 5
+B+B+B+B
O+O+O+O+
+O+O+O+O
O+O+O+O+
+B+B+K+O
O+A+O+O+
+O+O+O+O
A+A+O+A+ output: (5, 2) => (3, 0)
case 6
+k+O+O+O
B+O+O+O+
+O+O+O+O
O+O+O+O+
+O+O+O+O
O+O+O+O+
+O+O+O+O
O+O+O+O+ output: (0, 1) => (1, 2)
解释是,
O- Empty dark square
+- Empty white square
A- Machine's pawn
B- Opponent's pawn
k- Machine's king
K- Opponent's king
我已经计算了游戏树的叶节点的启发式值,因为棋盘中留下的机器碎片的数量减去了玩家对手的棋子数量,因为国王比棋子具有更强大的能力,启发式计算每个国王作为两个正常的棋子,使用alpha beta搜索。
我想我的程序运行正常,但是为游戏树的叶节点计算的启发式值最终没有改变,因为我将深度增加到9(如果我增加深度,它可能会更改)。任何人都可以请给我一些测试用例,用它来证明深度9的效率吗?
答案 0 :(得分:0)
你的问题是完全开放的,但这里有一些提示。
为叶节点计算的启发式值不依赖于搜索深度,因为它们是叶节点。因此,您的评论“为叶节点计算的值......没有改变”没有多大意义。也许你的意思是根节点的值没有改变。
通常增加搜索深度会带来更好的移动。如果您为所有搜索深度1..9获得相同的“最佳”移动,则某处存在错误。
评估功能是alpha-beta搜索解决方案中最重要的部分。您需要一个更好的评估功能,而不仅仅是以简单的方式计算材料,特别是如果您无法负担深度搜索。
通常人们不使用普通的alpha-beta,而是使用主变差搜索,迭代加深,零移动启发等方法来提高算法的实际效率。
构建您自己的测试用例,让您了解最佳移动实际情况,并验证您的算法是否可以找到它。例如,在结束游戏的情况下,你知道一个玩家可以在三个动作中获胜。