问题背景简介

冰面滑行问题是扩展库Gym里内置的一个文本环境任务。该问题的背景是这样的:在一个大小为4×4的湖面上,有些地方结冰了,有些地方没结冰。我们可以用一个4x4的字符矩阵来表示湖面的情况:

SFFF
FHFH
FFFH
HFFG

其中字母“F”(Frozen)表示结冰的区域,字母“H”(Hole)表示未结冰的冰窟窿,字母“S”(Start)和字母“G”(Goal)分别表示移动任务的起点和目标。在这个湖面上要执行以下的移动任务:要从“S”处移动到“G”处。每一次移动,可以选择“左”、“下”、“右”、“上”4个方向之一进行移动,每次移动一格。如果移动到G处,则回合结束,获得1个单位的奖励;如果移动到“H”处,则回合结束,没有获得奖励;如果移动到其它字母,暂不获得奖励,可以继续。由于冰面滑,所以实际移动的方向和想要移动的方向并不一定完全一致。例如,如果在某个地方想要左移,但是由于冰面滑,实际可能下移、右移或者上移。任务的目标是尽可能达到“G”处,以获得奖励。

代码实现

import gym
import numpy as npenv = gym.make('FrozenLake-v1')
env = env.unwrapped #用env.unwrapped可以得到原始的类,原始类想step多久就多久#观察一下环境的状态空间和动作空间
print(env.observation_space) #Discrete(16)
print(env.action_space) #Discrete(4)#用策略执行一个回合
def play_policy(env, policy, render=False):total_reward = 0. #初始化总奖励值observation = env.reset() #初始化环境while True:if render:env.render() #若render=True,则显示图形化界面action = np.random.choice(env.action_space.n, p=policy[observation])'''numpy.random.choice(a, size=None, replace=True, p=None)a:输入的如果是一维数组,则从该一维数组中采样,如果是int型,则从0到a-1序列随即采样。size: 表示采样的数量;可以是int型(默认为1)也可以是tuple。如果是tuple,例如(m,n,k),则采样数为m* n *k,大小为(m,n,k)的数组。replace:True表示随取取数,采样后放回(同样的数字可以被重复抽到),False表示随即取数,抽样后不放回(样本里的数只能采样一次)。p:一个一维数组,对应数组a每个元素采样的概率,默认每个元素被采样的概率相同。'''observation, reward, done, _ = env.step(action) #step(observation, reward, done, info)total_reward += reward  #统计回合奖励if done: #如果到达终点G,则退出游戏breakreturn total_reward #函数返回值是总奖励#使用play_policy()函数,来验证构造的random_policy随机策略的性能
#输出一个16✖4的矩阵,每个元素都为0.25,表示往每个方向移动的概率都相同(都为0.25)
random_policy = np.ones((env.unwrapped.nS, env.unwrapped.nA)) / env.unwrapped.nA
episode_rewards = [play_policy(env, random_policy) for _ in range(100)]
print("随机策略 平均奖励:{}".format(np.mean(episode_rewards))) #随机策略的奖励期望值一般为0,这意味着随机策略几乎不可能到达目的地#接下来实现策略评估、策略改进和策略迭代#策略评估
def v2q(env, v, s=None, gamma=1.): #v2q()函数可以根据状态值函数求解动作值函数if s is not None: #针对单个状态求解q = np.zeros(env.unwrapped.nA) # [0.,0.,0.,0.]for a in range(env.unwrapped.nA):for prob, next_state, reward, done in env.unwrapped.P[s][a]:q[a] += prob * (reward + gamma * v[next_state] * (1. - done)) # 根据公式求解动作值函数else: # 针对所有状态求解q = np.zeros((env.unwrapped.nS, env.unwrapped.nA))for s in range(env.unwrapped.nS):q[s] = v2q(env, v, s, gamma)return q#策略改进
#evaluate_policy()函数迭代计算了给定策略policy的状态价值
def evaluate_policy(env, policy, gamma=1., tolerant=1e-6):v = np.zeros(env.unwrapped.nS) # 初始化状态价值函数while True: # 循环delta = 0for s in range (env.unwrapped.nS):vs = sum(policy[s] * v2q(env, v, s, gamma)) # 更新状态价值函数delta = max(delta, abs(v[s]-vs)) # 更新最大误差v[s] = vs # 更新状态价值函数if delta < tolerant: # 查看是否满足迭代条件breakreturn v
# 评估随机策略的价值函数
print('状态价值函数:')
v_random = evaluate_policy(env, random_policy)
print(v_random.reshape(4, 4))print('动作价值函数:')
q_random = v2q(env, v_random)
print(q_random)# 策略改进
def improve_policy(env, v, policy, gamma=1.):optimal = Truefor s in range(env.unwrapped.nS):q = v2q(env, v, s, gamma)a = np.argmax(q)if policy[s][a] != 1.:optimal = Falsepolicy[s] = 0.policy[s][a] = 1.return optimal
# 对随机策略进行改进
policy = random_policy.copy()
optimal = improve_policy(env, v_random, policy)
if optimal:print('无更新,最优策略为:')
else:print('有更新,更新后的策略为:')
print(policy)# 策略迭代
def iterate_policy(env, gamma=1., tolerant=1e-6):# 初始化为任意一个策略policy = np.ones((env.unwrapped.nS, env.unwrapped.nA)) /env.unwrapped.nAwhile True:v = evaluate_policy(env, policy, gamma, tolerant)  # 策略评估if improve_policy(env, v, policy):  # 策略改进breakreturn policy, vpolicy_pi, v_pi = iterate_policy(env)
print('状态价值函数 =')
print(v_pi.reshape(4, 4))
print('最优策略 =')
print(np.argmax(policy_pi, axis=1).reshape(4, 4))
# 测试策略
episode_rewards =[play_policy(env, policy_pi)  for _ in range(100)]
print("策略迭代 平均奖励:{}".format(np.mean(episode_rewards)))# 价值迭代
def iterate_value(env, gamma=1, tolerant=1e-6):v = np.zeros(env.unwrapped.nS)  # 初始化while True:delta = 0for s in range(env.unwrapped.nS):vmax = max(v2q(env, v, s, gamma))  # 更新价值函数delta = max(delta, abs(v[s] - vmax))v[s] = vmaxif delta < tolerant:  # 满足迭代需求breakpolicy = np.zeros((env.unwrapped.nS, env.unwrapped.nA))  # 计算最优策略for s in range(env.unwrapped.nS):a = np.argmax(v2q(env, v, s, gamma))policy[s][a] = 1.return policy, vpolicy_vi, v_vi = iterate_value(env)
print('状态价值函数 =')
print(v_vi.reshape(4, 4))
print('最优策略 =')
print(np.argmax(policy_vi, axis=1).reshape(4, 4))
# 测试策略
episode_rewards = [play_policy(env, policy_vi) for _ in range(100)]
print("价值迭代 平均奖励:{}".format(np.mean(episode_rewards)))

参考资料

https://blog.csdn.net/weixin_43858446/article/details/104436919?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164854495716780274183174%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164854495716780274183174&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-104436919.142v5pc_search_result_cache,143v6register&utm_term=np.random.choice&spm=1018.2226.3001.4187

https://blog.csdn.net/qq_37266917/article/details/107847329?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164855178816782094846552%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164855178816782094846552&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-107847329.142v5pc_search_result_cache,143v6register&utm_term=%E5%86%B0%E9%9D%A2%E6%BB%91%E8%A1%8C%E4%BB%A3%E7%A0%81&spm=1018.2226.3001.4187

Gym实战-冰面滑行相关推荐

  1. 强化学习环境库 Gym 发布首个社区发布版,全面兼容 Python 3.9

    作者:肖智清 来源:AI科技大本营 强化学习环境库Gym于2021年8月中旬迎来了首个社区志愿者维护的发布版Gym 0.19.该版本全面兼容Python 3.9,增加了多个新特性. 强化学习环境库的事 ...

  2. 强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例

    强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例 1. 引言 在这个部分补充之前马尔科夫决策和动态规划部分的代码.在以后的内容我会把相关代码都附到相关内容的后面.本部 ...

  3. python原理_强化学习:原理与Python实现

    强化学习:原理与Python实现 作者:肖智清 著 出版日期:2019年08月 文件大小:17.18M 支持设备: ¥60.00 适用客户端: 言商书局 iPad/iPhone客户端:下载 Andro ...

  4. 强化学习代码 (肖志清)部分

    目录部分 1 初识RL 2 Markov 决策过程 3 有模型数值迭代 4 回合更新价值迭代 5 时序差分价值迭代 6 函数近似方法 点击跳转原书代码链接 1 初识RL 解决我电脑中pip insta ...

  5. python实现迭代计算_带你读《强化学习:原理与Python实现》之三:有模型数值迭代-阿里云开发者社区...

    第3章 有模型数值迭代 在实际问题中,直接求解Bellman期望方程和Bellman最优方程往往有困难.其中的一大困难在于直接求解Bellman方程需要极多的计算资源.本章在假设动力系统完全已知的情况 ...

  6. Oracle English words文档资料学习 生词摘录(不断更新中)

    prerequisite 先决条件,前提 D.J.[pri:ˈrekwɪzɪt] K.K.[priˈrɛkwɪzɪt] n. 先决条件,前提 symmetric  symmetrical   SMP ...

  7. 强化学习之gym初战实战案例:悬崖案例CliffWalking-v0。

    文章目录 强化学习简介 gym简介 CliffWalking-v0 强化学习简介 我们知道,强化学习广泛应用于玩一些较为简单的游戏,其思想就是:过一段时间(例如0.1秒)拍一张(游戏)图片,然后机器看 ...

  8. 【强化学习实战】基于gym和tensorflow的强化学习算法实现

    [新智元导读]知乎专栏强化学习大讲堂作者郭宪博士开讲<强化学习从入门到进阶>,我们为您节选了其中的第二节<基于gym和tensorflow的强化学习算法实现>,希望对您有所帮助 ...

  9. 强化学习 Sarsa 实战GYM下的CliffWalking爬悬崖游戏

    CliffWalking 如下图所示,S是起点,C是障碍,G是目标 agent从S开始走,目标是找到到G的最短路径 这里reward可以建模成-1,最终目标是让return最大,也就是路径最短 代码和 ...

最新文章

  1. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动过程 | 静态代理 )
  2. python np fft_Python的武器库05:numpy模块(下)
  3. java list addall源码_Java集合:ArrayList源码分析
  4. phpstrom查看代码总行数_歪特内推浦发银行总行信息科技部
  5. 1到10选一个数字读心术_厉害了!quot;广东110“互联网报警满足您多场景报警需求!...
  6. excel导入linux乱码怎么解决方法,,请大家都来看下,Excel导入有乱码?原因出在哪里?应该怎么解决?...
  7. iPhone 居然能当公交卡刷了?!
  8. python中for语句只有一种写法for in_pythonforin语句
  9. typescript之http请求
  10. 印度SaaS创企Whatfix获370万美元A轮融资
  11. 如何画 软件工程 流程图
  12. 群面时被问到“让你淘汰一个组员”一般如何淘汰谁?
  13. 【历史上的今天】8 月 19 日:大型计算机先驱和小型机之父诞生;中国雅虎邮箱成历史
  14. Karl Rove和Dick Cheney加入了REST争论
  15. JAVA-IDEA开发10个小手段
  16. 农业物联网发展有哪些问题
  17. oracle sql 动态参数,sql – 具有动态参数的Oracle Lag函数
  18. 2.使用Gateway实现token校验
  19. 2017年网易实习程序员面试题
  20. 【Stable Diffusion | AI 绘画】手把手教你体验--AI 生成唯美二次元

热门文章

  1. Python分词、情感分析工具——SnowNLP
  2. BestCoder Round #66 GTW likes gt
  3. rpart 决策树中的 Cp(complexity parameter)参数
  4. 英语教学计划软件测试,2020中学八年级英语教学计划
  5. Nexus3的部署(Windows版)
  6. 51nod 1836 战忽局的手段 矩阵乘法
  7. 一篇吃饱 Structured Streaming
  8. 在Fritzing中创建自定义元件
  9. a到z的ascii码值是多少_a的ascii码值十六进制是多少
  10. 一个普通人毕业2年学习面试及工作总结