
2.2 Bellman期望方程
2.1节定义了策略和价值函数。策略评估(policy evaluation)则是试图求解给定策略的价值函数。本节将介绍价值函数的性质——Bellman期望方程(Bellman Expectation Equations)。Bellman期望方程常用来进行策略评估。
Bellman期望方程刻画了状态价值函数和动作价值函数之间的关系。该方程由以下两部分组成。
·用t时刻的动作价值函数表示t时刻的状态价值函数:

(推导:对任一状态s∈,有

这样就得到了结果。)如果用空心圆圈代表状态,实心圆圈表示状态–动作对,则用动作价值函数表示状态价值函数的过程可以用备份图(backup diagram)表示,见图2-2a。
·用t+1时刻的状态价值函数表示t时刻的动作价值函数:

(推导:对任意的状态s∈和动作a∈
,有


其中Pr[Gt+1=g|St=s,At=a,St+1=s']=Pr[Gt+1=g|St+1=s']用到了Markov性。利用上式,有

这样就得到了结果。)用状态价值函数表示动作价值函数可以用备份图表示,见图2-2b。

图2-2 动作价值函数和状态价值函数互相表示的备份图
上述Bellman期望方程刻画了状态价值函数和动作价值函数之间的关系。在上式中,也可以用代入法消除其中一种价值函数,得到以下两种结果。
·用状态价值函数表示状态价值函数,备份图见图2-3a:

·用动作价值函数表示动作价值函数,备份图见图2-3b:


图2-3 状态价值函数和动作价值函数自我表示的备份图
例如,对于表2-1和表2-2的例子中,状态价值函数和动作价值函数有以下关系:
vπ(饿)=(1-x)qπ(饿,不吃)+xqπ(饿,吃)
vπ(饱)=yqπ(饱,不吃)+(1-y)qπ(饱,吃)
qπ(饿,不吃)=1·(-2+γvπ(饿))+0
qπ(饿,吃)=(1-α)(-3+γvπ(饿))+α(+1+γvπ(饱))
qπ(饱,不吃)=β(-2+γvπ(饿))+(1-β)(+2+γvπ(饱))
qπ(饱,吃)=0+1·(+1+γvπ(饱)),
用这个方程可以求得价值函数。
接下来演示如何通过sympy求解Bellman方程,寻找最优策略。不失一般性,假设0<α,β,γ<1。
由于这个方程组是含有字母的线性方程组,我们用sympy的solve_linear_syst em()函数来求解它。solve_linear_system()函数可以接受整理成标准形式的线性方程组,它有以下参数:
·矩阵参数s ystem。对于有n个等式、m个待求变量的线性方程组,system是一个n×(m+1)的sympy.Matrix对象。
·可变列表参数symbols。若有m个待求变量的线性方程组,则symbols是m个sympy.Symbol对象。
·可变关键字参数flags。
该函数返回一个dict,为每个待求变量给出结果。
我们把待求的Bellman期望方程整理成标准形式的线性方程组,得到:

用代码清单2-1可以求解上述方程。
代码清单2-1 求解示例Bellman期望方程
import sympy from sympy import symbols sympy.init_printing() v_hungry, v_full = symbols('v_hungry v_full') q_hungry_eat, q_hungry_none, q_full_eat, q_full_none = \ symbols('q_hungry_eat q_hungry_none q_full_eat q_full_none') alpha, beta, x, y, gamma = symbols('alpha beta x y gamma') system = sympy.Matrix(( (1, 0, x-1, -x, 0, 0, 0), (0, 1, 0, 0, -y, y-1, 0), (-gamma, 0, 1, 0, 0, 0, 2), ((alpha-1)*gamma, -alpha*gamma, 0, 1, 0, 0, -4*alpha+3), (-beta*gamma, (beta-1)*gamma, 0, 0, 1, 0, 4*beta-2), (0, -gamma, 0, 0, 0, 1, -1) )) # 标准形式的系数矩阵 sympy.solve_linear_system(system, v_hungry, v_full, q_hungry_eat, q_hungry_none, q_full_eat, q_full_none) # 求解
代码清单2-1求得的状态价值函数和动作价值函数为:
