我在实现一个斯特拉特戈游戏的极小化-极大化算法(其中计算机对所有棋子的位置有完全的了解)。然而,我发现计算机常常不会攻击它可以轻易摧毁的棋子。据我所知,极小化-极大化算法的得分来自于移动树的叶节点(每一层代表一个回合,每个叶节点的得分通过评估函数计算该位置的棋盘状态)。所以如果我的搜索深度是3层,计算机可以在第一步攻击或第三步攻击。根据极小化-极大化算法,这两种情况的得分是相同的(结果棋盘位置的得分相同)。那么,我如何影响极小化-极大化算法偏好即时奖励而不是最终奖励呢?即,我希望得分随时间衰减,但按照极小化-极大化算法的工作方式,我看不出这是可能的。极小化-极大化算法总是使用叶节点来确定中间节点的得分。
回答:
正如评论中其他人提到的,极小化-极大化算法应该能够自动注意到延迟捕获棋子是否存在危险,改变评估函数以强制其偏好早期捕获可能会损害游戏表现。
不过,如果你真的想这样做,我认为唯一的方法是开始在你的游戏状态中存储额外的信息(不仅仅是棋盘)。你需要在内存中为每个游戏状态存储时间戳,以便事后仍然能够准确知道某个棋子是在哪个回合被捕获的。利用这些信息,你可以在搜索树的叶节点使用的评估函数中实现一个衰减因子。
另一种解决方案可能是确保你搜索到一个偶数深度层;2或4而不是3。这样,你的算法将始终评估对手最后移动的游戏状态,而不是你的计算机玩家。所有评估将变得更加悲观,这在某些情况下可能会鼓励你的代理偏好早期奖励。
这种奇数搜索深度通常会导致与偶数搜索深度不同的评估效果,被称为奇偶效应。你可能有兴趣进一步了解这一点(尽管通常讨论的原因与你的问题不同)。