diff --git "a/\345\212\250\346\200\201\350\247\204\345\210\222/\344\271\240\351\242\230\350\247\243\347\255\224.md" "b/\345\212\250\346\200\201\350\247\204\345\210\222/\344\271\240\351\242\230\350\247\243\347\255\224.md" index dd6391c..189b106 100644 --- "a/\345\212\250\346\200\201\350\247\204\345\210\222/\344\271\240\351\242\230\350\247\243\347\255\224.md" +++ "b/\345\212\250\346\200\201\350\247\204\345\210\222/\344\271\240\351\242\230\350\247\243\347\255\224.md" @@ -128,9 +128,46 @@ $$ > 上面这个策略迭代算法存在一个小问题,即如果在两个或多个同样好的策略之间不断切换,则它可能永远不会终止。所以上面的算法对于教学没有问题,但不适用于实际应用。请修改伪代码以保证其收敛。 -*解答:*存在的问题是$argmax_a$将终止条件限制,因为在伪代码中的**策略改进**中,同样的价值函数可能会产生不同的策略,导致两个或多个同样好的策略在迭代前后不断切换,价值函数没有提升,但是$old-action \neq \pi(s)$,仍然会使程序跳转至`2`继续运行。 +*解答:*存在的问题是将$argmax_a$是否稳定作为终止条件,因为在伪代码中的**策略改进**中,同样的价值函数可能会产生不同的策略,导致两个或多个同样好的策略在迭代前后不断切换,价值函数没有提升,但是$old\_action \neq \pi(s)$,仍然会使程序跳转至`2`继续运行。 +解决方式为通过增加一个每个状态的最优动作的集合(最优动作集合为让贝尔曼最优方程取到最大值的所有动作),通过判断每一步过后一个状态$s$的最优的动作集合是否改变以及策略$\pi$是否改变来作为终止条件。以下为修改后的伪代码: +1. 初始化 + + 对$s \in S$,任意设定$V(s) \in \mathbb{R}$以及$\pi(s) \in A(s)$,$maxActionSet(s) \gets set()$ + + *(这里的每个$maxActionSet(s)$都是一个set集合)* + +2. 策略评估 + + 循环: + ​ $\Delta \gets 0$ + ​ 对每一个$s \in S$循环: + + ​ $v \gets V(s)$ + + ​ $V(s) \gets \sum_{s',r}p(s',r|s,\pi(s))[r + \gamma V(s')]$ + + ​ $\Delta \gets max(\Delta, |v - V(s)|)$ + ​ 直到$\Delta < \theta$(一个决定估计精度的小正数) + +3. 策略改进 + + $policy\_stable \gets true$ + + 对每一个$s \in S$: + + ​ $old\_action \gets \pi(s)$ + + ​ $old\_max\_action\_set \gets maxActionSet(s)$ + + ​ $\pi(s) \gets argmax_a\sum_{s',r}p(s',r|s,a)[r + \gamma V(s')]$ + + ​ $maxActionSet(s) \gets \sum_{s',r}p(s',r|s,a)[r + \gamma V(s')]$取到最大值的所有动作$a$的集合 + + ​ 如果$old\_action \neq \pi(s)$并且$old\_max\_action\_set \neq maxActionSet(s)$,那么$policy\_stable \gets false$ + + 如果$policy\_stable$为$true$,那么停止并返回$V \approx v_*$以及$\pi \approx \pi_*$;否则跳转到2