《强化学习:原理与Python实现 》 —3.5 案例:冰面滑行

举报
华章计算机 发表于 2019/11/13 12:26:39 2019/11/13
【摘要】 本节书摘来自华章计算机《强化学习:原理与Python实现》 一书中第三章,第3.5.1节,作者肖智清。

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)],这表明:

 image.png

接下来我们来看怎么使用环境。与之前在第1章介绍的内容一致,要使用env.reset() 和env.step() 来执行。执行一个回合的代码如代码清单3-1所示,其中的play_policy() 函数接收参数policy,这是一个的np.array对象,表示策略。play_policy() 函数返回一个浮点数,表示本回合的奖励。

代码清单3-1 用策略执行一个回合

image.png

接下来用刚刚定义的play_policy() 函数来看看随机策略的性能。下面的代码构造了随机策略random_policy,它对于任意的均有。运行下列代码,可以求得随机策略获得奖励的期望值。一般情况下的结果基本为0,这意味着随机策略几乎不可能成功到达目的地。

代码清单3-2 求随机策略的期望奖励

image.png

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。