《强化学习:原理与Python实现 》 —3.5 案例:冰面滑行
3.5 案例:冰面滑行
冰面滑行问题(FrozenLake-v0)是扩展库Gym里内置的一个文本环境任务。该问题的背景是这样的:在一个大小为的湖面上,有些地方结冰了,有些地方没有结冰。我们可以用一个的字符矩阵来表示湖面的情况,例如:
SFFF
FHFH
FFFH
HFFG
其中字母“F”(Frozen)表示结冰的区域,字母“H”(Hole)表示未结冰的冰窟窿,字母“S”(Start)和字母“G”(Goal)分别表示移动任务的起点和目标。在这个湖面上要执行以下移动任务:要从“S”处移动到“G”处。每一次移动,可以选择“左”、“下”、“右”、“上”4个方向之一进行移动,每次移动一格。如果移动到“G”处,则回合结束,获得1个单位的奖励;如果移动到“H”处,则回合结束,没有获得奖励;如果移动到其他字母,暂不获得奖励,可以继续。由于冰面滑,所以实际移动的方向和想要移动的方向并不一定完全一致。例如,如果在某个地方想要左移,但是由于冰面滑,实际也可能下移、右移和上移。任务的目标是尽可能达到“G”处,以获得奖励。
本节将基于策略迭代算法和价值迭代算法求解冰面滑行问题。通过这个AI的开发,我们将更好地理解有模型算法的原理及其实现。
3.5.1 实验环境使用
本节我们来看如何使用扩展库Gym中的环境。
首先,用下列语句引入环境对象:
import gym
env = gym.make('FrozenLake-v0')
env = env.unwrapped
这个环境的状态空间有16个不同的状态,表示当前处在哪一个位置;动作空间有4个不同的动作,分别表示“左”“下”“右”“上”四个方向。在扩展库Gym中,直接用int型数值来表示这些状态和动作。下列代码可以查看环境的状态空间和动作空间:
print(env.observation_space)
print(env.action_space)
这个环境的动力系统存储在env.P里。可以用下列方法查看在某个状态(如状态14)某个动作(例如右移)情况下的动力:
env.unwrapped.P[14][2]
它是一个元组列表,每个元组包括概率、下一状态、奖励值、回合结束指示这4个部分。例如,env.P[14][2] 返回元组列表 [(0.3333333333333333, 14, 0.0, False), (0.3333333333333333, 15, 1.0, True), (0.3333333333333333, 10, 0.0, False)],这表明:
接下来我们来看怎么使用环境。与之前在第1章介绍的内容一致,要使用env.reset() 和env.step() 来执行。执行一个回合的代码如代码清单3-1所示,其中的play_policy() 函数接收参数policy,这是一个的np.array对象,表示策略。play_policy() 函数返回一个浮点数,表示本回合的奖励。
代码清单3-1 用策略执行一个回合
接下来用刚刚定义的play_policy() 函数来看看随机策略的性能。下面的代码构造了随机策略random_policy,它对于任意的均有。运行下列代码,可以求得随机策略获得奖励的期望值。一般情况下的结果基本为0,这意味着随机策略几乎不可能成功到达目的地。
代码清单3-2 求随机策略的期望奖励
- 点赞
- 收藏
- 关注作者
评论(0)