diff --git "a/4.\344\272\272\345\267\245\346\231\272\350\203\275/4.3.1\346\220\234\347\264\242.md" "b/4.\344\272\272\345\267\245\346\231\272\350\203\275/4.3.1\346\220\234\347\264\242.md" index 588be5c7..0fd712b5 100644 --- "a/4.\344\272\272\345\267\245\346\231\272\350\203\275/4.3.1\346\220\234\347\264\242.md" +++ "b/4.\344\272\272\345\267\245\346\231\272\350\203\275/4.3.1\346\220\234\347\264\242.md" @@ -240,7 +240,7 @@ def remove(self): ![](https://hdu-cs-wiki.oss-cn-hangzhou.aliyuncs.com/WstnbmHwYoQauRxUQOCclz8Jngb.png) - - $$Players(s)$$: 一个函数,在给定状态$$s$$的情况下,返回轮到哪个玩家(X或O)。 + - $Players(s)$: 一个函数,在给定状态$$s$$的情况下,返回轮到哪个玩家(X或O)。 ![](https://hdu-cs-wiki.oss-cn-hangzhou.aliyuncs.com/DKzTbJSZMoc1UkxT9KOcIHqvnob.png) @@ -284,34 +284,36 @@ def remove(self): - 给定状态 $s$ - - 最大化玩家在$$Actions(s)$$中选择动作$$a$$,该动作产生$$Min-value(Result(s,a))$$ 的最高值。 - - 最小化玩家在$$Actions(s)$$中选择动作$$a$$,该动作产生$$Max-value(Result(s,a))$$ 的最小值。 + - 最大化玩家在$Actions(s)$中选择动作$a$,该动作产生$Min-value(Result(s,a))$ 的最高值。 + - 最小化玩家在$Actions(s)$中选择动作$a$,该动作产生$Max-value(Result(s,a))$ 的最小值。 - Function Max-Value(state): - $$v=-\infty$$ - - if $$Terminal(state)$$: - - return $$Utility(state)$$ - - for $$action$$ in $$Actions(state)$$: + - if $Terminal(state)$: + - return $Utility(state)$ + - for $action$ in $Actions(state)$: - $$v = Max(v, Min-Value(Result(state, action)))$$ - - return $$v$$ + - return $v$ - Function Min-Value(state): - $$v=\infty$$ - - if $$Terminal(state)$$: - - return $$Utility(state)$$ - - for $$action$$ in $$Actions(state)$$: + - if $Terminal(state)$: + - return $Utility(state)$ + - for $action$ in $Actions(state)$: - $$v = Min(v, Max-Value(Result(state, action)))$$ - - return $$v$$ + - return $v$ 不会理解递归?也许你需要看看这个:[阶段二:递归操作](../3.%E7%BC%96%E7%A8%8B%E6%80%9D%E7%BB%B4%E4%BD%93%E7%B3%BB%E6%9E%84%E5%BB%BA/3.6.4.2%E9%98%B6%E6%AE%B5%E4%BA%8C%EF%BC%9A%E9%80%92%E5%BD%92%E6%93%8D%E4%BD%9C.md) -- $$\alpha$$-$$\beta$$剪枝(Alpha-Beta Pruning) +- $\alpha$-$\beta$剪枝(Alpha-Beta Pruning) + - 作为一种优化Minimax的方法,Alpha-Beta剪枝跳过了一些明显不利的递归计算。在确定了一个动作的价值后,如果有初步证据表明接下来的动作可以让对手获得比已经确定的动作更好的分数,那么就没有必要进一步调查这个动作,因为它肯定比之前确定的动作不利。 + - 这一点最容易用一个例子来说明:最大化的玩家知道,在下一步,最小化的玩家将试图获得最低分数。假设最大化玩家有三个可能的动作,第一个动作的值为4。然后玩家开始为下一个动作生成值。要做到这一点,如果当前玩家做出这个动作,玩家会生成最小化者动作的值,并且知道最小化者会选择最低的一个。然而,在完成最小化器所有可能动作的计算之前,玩家会看到其中一个选项的值为3。这意味着没有理由继续探索最小化玩家的其他可能行动。尚未赋值的动作的值无关紧要,无论是10还是(-10)。如果该值为10,则最小化器将选择最低选项3,该选项已经比预先设定的4差。如果尚未估价的行动结果是(-10),那么最小化者将选择(-10)这一选项,这对最大化者来说更加不利。因此,在这一点上为最小化者计算额外的可能动作与最大化者无关,因为最大化玩家已经有了一个明确的更好的选择,其值为4。 - $$ ![](https://hdu-cs-wiki.oss-cn-hangzhou.aliyuncs.com/LDZab4TeMoByvDxF1Onc8WQenpb.png) - 深度限制的极大极小算法(Depth-Limited Minimax) - - 总共有$$255168$$个可能的井字棋游戏,以及有$$10^{29000}$$个可能的国际象棋中游戏。到目前为止,最小最大算法需要生成从某个点到终端条件的所有假设游戏状态。虽然计算所有的井字棋游戏状态对现代计算机来说并不是一个挑战,但目前用来计算国际象棋是不可能的。 + - 总共有$255168$个可能的井字棋游戏,以及有$10^{29000}$个可能的国际象棋中游戏。到目前为止,最小最大算法需要生成从某个点到终端条件的所有假设游戏状态。虽然计算所有的井字棋游戏状态对现代计算机来说并不是一个挑战,但目前用来计算国际象棋是不可能的。 + - 深度限制的 Minimax 算法在停止之前只考虑预先定义的移动次数,而从未达到终端状态。然而,这不允许获得每个动作的精确值,因为假设的游戏还没有结束。为了解决这个问题,深度限制 Minimax 依赖于一个评估函数,该函数从给定状态估计游戏的预期效用,或者换句话说,为状态赋值。例如,在国际象棋游戏中,效用函数会将棋盘的当前配置作为输入,尝试评估其预期效用(基于每个玩家拥有的棋子及其在棋盘上的位置),然后返回一个正值或负值,表示棋盘对一个玩家对另一个玩家的有利程度。这些值可以用来决定正确的操作,并且评估函数越好,依赖它的 Minimax 算法就越好。