为何 minimax 算法初始值选用 -math.inf 和 math.inf?(井字棋AI)
我们可以用生活里找最值的例子来理解:
最大化玩家(比如井字棋里的AI,要找对自己最有利的走法):它的目标是找到所有可能走法里得分最高的那个。把初始值设为
-math.inf(负无穷),就相当于一开始你手里攥着一个比所有实际可能得分都低的数——不管接下来算出任何一个真实得分,都肯定比负无穷大,所以这个初始值一定会被替换掉。
举个例子:如果井字棋的得分规则是「AI赢得1分,平局得0分,输了得-1分」,AI第一次算出某个走法得0分,就会把初始的-∞换成0;之后找到得1分的走法,再换成1,最终得到最优的1分。要是初始值设成0,那当所有走法都只能得-1分(AI必输)时,初始的0比-1大,就不会更新,结果就错了。负无穷就不会有这个问题,因为它比任何实际得分都小,绝对能更新到正确的结果。最小化玩家(比如和AI对战的人类,要找对AI最不利的走法):它的目标是找到所有可能走法里得分最低的那个。把初始值设为
math.inf(正无穷),就相当于一开始手里攥着一个比所有实际可能得分都高的数——任何真实得分都肯定比正无穷小,所以初始值一定会被替换。
还是用刚才的得分规则:人类玩家第一次算出某个走法得1分,就把初始的∞换成1;之后找到得0分的走法,换成0;最后找到得-1分的走法,换成-1,最终得到对AI最不利的-1分。要是初始值设成0,那当所有走法都能得1分(AI必赢)时,初始的0比1小,就不会更新,结果也错了。正无穷就不会有这个问题,因为它比任何实际得分都大,绝对能更新到正确的结果。
简单来说,这两个初始值就是「绝对垫底」和「绝对天花板」,能确保算法在遍历所有可能走法时,不会漏掉真正的最优值,不管实际情况是好是坏,都能找到正确的结果。
内容的提问来源于stack exchange,提问作者kheder47

