强化学习:原理与Python实现
上QQ阅读APP看书,第一时间看更新

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求得的状态价值函数和动作价值函数为: