把后面的版本v0改成v1,random_policy=np.ones((env.observation_space.n,env.action_space.n))/env.action_space.n
就能运行出来,新版本有bug. >_<

import numpy as np
import gym
np.random.seed(0)
env = gym.make('FrozenLake-v1')
env = env.unwrapped  # 据说不做这个动作会有很多限制,unwrapped是打开限制的意思
print(env.action_space)#env.action_space查看这个环境中可用的action有多少个,返回Discrete()格式
print(env.observation_space)#env.observation_space查看这个环境中可用的observation有多少个,返回Discrete()格式
np.random.seed(0)#使得随机数据可预测
env.seed(0)# 设置随机数种子,只是为了让结果可以精确复现,一般情况下可删去
env.unwrapped.P[14][2] # 查看动力
print('观察空间 = {}'.format(env.observation_space))
print('动作空间 = {}'.format(env.action_space))
print('观测空间大小 = {}'.format(env.observation_space.n))
print('动作空间大小 = {}'.format(env.action_space.n))
#用随机策略玩玩
def play_policy(env, policy, render=False):total_reward = 0.observation = env.reset()while True:if render:env.render() # 此行可显示action = np.random.choice(env.action_space.n,p=policy[observation])observation, reward, done, _ = env.step(action)total_reward += reward  # 统计回合奖励if done: # 游戏结束breakreturn total_reward
# 随机策略
random_policy = \np.ones((env.observation_space.n,env.action_space.n)) / env.action_space.n#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)))
#--------------策略评估-------------
def v2q(env, v, s=None, gamma=1.): # 根据状态价值函数计算动作价值函数if s is not None: # 针对单个状态求解q = np.zeros(env.action_space.n)for a in range(env.action_space.n):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.observation_space.n,env.action_space.n))for s in range(env.observation_space.n):q[s] = v2q(env, v, s, gamma)return qdef evaluate_policy(env, policy, gamma=1., tolerant=1e-6):v = np.zeros(env.observation_space.n) # 初始化状态价值函数while True: # 循环delta = 0for s in range(env.observation_space.n):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.observation_space.n):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.observation_space.n,env.action_space.n)) \/ env.action_space.nwhile 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))
def iterate_policy(env, gamma=1., tolerant=1e-6):# 初始化为任意一个策略policy = np.ones((env.observation_space.n,env.action_space.n)) \/ env.action_space.nwhile 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.observation_space.n) # 初始化while True:delta = 0for s in range(env.observation_space.n):vmax = max(v2q(env, v, s, gamma)) # 更新价值函数delta = max(delta, abs(v[s]-vmax))v[s] = vmaxif delta < tolerant: # 满足迭代需求breakpolicy = np.zeros((env.observation_space.n,env.action_space.n)) # 计算最优策略for s in range(env.observation_space.n):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)))

结果

Discrete(4)
Discrete(16)
观察空间 = Discrete(16)
动作空间 = Discrete(4)
观测空间大小 = 16
动作空间大小 = 4
随机策略 平均奖励:0.0
状态价值函数:
[[0.0139372  0.01162942 0.02095187 0.01047569][0.01624741 0.         0.04075119 0.        ][0.03480561 0.08816967 0.14205297 0.        ][0.         0.17582021 0.43929104 0.        ]]
动作价值函数:
[[0.01470727 0.01393801 0.01393801 0.01316794][0.00852221 0.01162969 0.01086043 0.01550616][0.02444416 0.0209521  0.02405958 0.01435233][0.01047585 0.01047585 0.00698379 0.01396775][0.02166341 0.01701767 0.0162476  0.01006154][0.         0.         0.         0.        ][0.05433495 0.04735099 0.05433495 0.00698396][0.         0.         0.         0.        ][0.01701767 0.04099176 0.03480569 0.04640756][0.0702086  0.11755959 0.10595772 0.05895286][0.18940397 0.17582024 0.16001408 0.04297362][0.         0.         0.         0.        ][0.         0.         0.         0.        ][0.08799662 0.20503708 0.23442697 0.17582024][0.25238807 0.53837042 0.52711467 0.43929106][0.         0.         0.         0.        ]]
有更新,更新后的策略为:
[[1. 0. 0. 0.][0. 0. 0. 1.][1. 0. 0. 0.][0. 0. 0. 1.][1. 0. 0. 0.][1. 0. 0. 0.][1. 0. 0. 0.][1. 0. 0. 0.][0. 0. 0. 1.][0. 1. 0. 0.][1. 0. 0. 0.][1. 0. 0. 0.][1. 0. 0. 0.][0. 0. 1. 0.][0. 1. 0. 0.][1. 0. 0. 0.]]
状态价值函数 =
[[0.82351246 0.82350689 0.82350303 0.82350106][0.82351416 0.         0.5294002  0.        ][0.82351683 0.82352026 0.76469786 0.        ][0.         0.88234658 0.94117323 0.        ]]
最优策略 =
[[0 3 3 3][0 0 0 0][3 1 0 0][0 2 1 0]]
状态价值函数 =
[[0.82351246 0.82350689 0.82350303 0.82350106][0.82351416 0.         0.5294002  0.        ][0.82351683 0.82352026 0.76469786 0.        ][0.         0.88234658 0.94117323 0.        ]]
最优策略 =
[[0 3 3 3][0 0 0 0][3 1 0 0][0 2 1 0]]
策略迭代 平均奖励:0.73
状态价值函数 =
[[0.82351232 0.82350671 0.82350281 0.82350083][0.82351404 0.         0.52940011 0.        ][0.82351673 0.82352018 0.76469779 0.        ][0.         0.88234653 0.94117321 0.        ]]
最优策略 =
[[0 3 3 3][0 0 0 0][3 1 0 0][0 2 1 0]]
PS D:\python\code\book\QL>  d:; cd 'd:\python\code\book\QL'; & 'D:\python\python.exe' 'c:\Users\申勤勤\.vscode\extensions\ms-python.python-2022.2.1924087327\pythonFiles\lib\python\debugpy\launcher' '61607' '--' 'd:\python\code\book\QL\Frozen.py'
Discrete(4)
Discrete(16)
观察空间 = Discrete(16)
动作空间 = Discrete(4)
观测空间大小 = 16
动作空间大小 = 4
随机策略 平均奖励:0.0
状态价值函数:
[[0.0139372  0.01162942 0.02095187 0.01047569][0.01624741 0.         0.04075119 0.        ][0.03480561 0.08816967 0.14205297 0.        ][0.         0.17582021 0.43929104 0.        ]]
动作价值函数:
[[0.01470727 0.01393801 0.01393801 0.01316794][0.00852221 0.01162969 0.01086043 0.01550616][0.02444416 0.0209521  0.02405958 0.01435233][0.01047585 0.01047585 0.00698379 0.01396775][0.02166341 0.01701767 0.0162476  0.01006154][0.         0.         0.         0.        ][0.05433495 0.04735099 0.05433495 0.00698396][0.         0.         0.         0.        ][0.01701767 0.04099176 0.03480569 0.04640756][0.0702086  0.11755959 0.10595772 0.05895286][0.18940397 0.17582024 0.16001408 0.04297362][0.         0.         0.         0.        ][0.         0.         0.         0.        ][0.08799662 0.20503708 0.23442697 0.17582024][0.25238807 0.53837042 0.52711467 0.43929106][0.         0.         0.         0.        ]]
有更新,更新后的策略为:
[[1. 0. 0. 0.][0. 0. 0. 1.][1. 0. 0. 0.][0. 0. 0. 1.][1. 0. 0. 0.][1. 0. 0. 0.][1. 0. 0. 0.][1. 0. 0. 0.][0. 0. 0. 1.][0. 1. 0. 0.][1. 0. 0. 0.][1. 0. 0. 0.][1. 0. 0. 0.][0. 0. 1. 0.][0. 1. 0. 0.][1. 0. 0. 0.]]
状态价值函数 =
[[0.82351246 0.82350689 0.82350303 0.82350106][0.82351416 0.         0.5294002  0.        ][0.82351683 0.82352026 0.76469786 0.        ][0.         0.88234658 0.94117323 0.        ]]
最优策略 =
[[0 3 3 3][0 0 0 0][3 1 0 0][0 2 1 0]]
状态价值函数 =
[[0.82351246 0.82350689 0.82350303 0.82350106][0.82351416 0.         0.5294002  0.        ][0.82351683 0.82352026 0.76469786 0.        ][0.         0.88234658 0.94117323 0.        ]]
最优策略 =
[[0 3 3 3][0 0 0 0][3 1 0 0][0 2 1 0]]
策略迭代 平均奖励:0.73
状态价值函数 =
[[0.82351232 0.82350671 0.82350281 0.82350083][0.82351404 0.         0.52940011 0.        ][0.82351673 0.82352018 0.76469779 0.        ][0.         0.88234653 0.94117321 0.        ]]
最优策略 =
[[0 3 3 3][0 0 0 0][3 1 0 0][0 2 1 0]]
价值迭代 平均奖励:0.84

现在懒得整理了,第三组讲完再做叭,先把第四章的图跑出来!!!

强化学习#code3相关推荐

  1. 机器学习概念 — 监督学习、无监督学习、半监督学习、强化学习、欠拟合、过拟合、后向传播、损失和优化函数、计算图、正向传播、反向传播

    1. 监督学习和无监督学习 监督学习 ( Supervised Learning ) 和无监督学习 ( Unsupervised Learning ) 是在机器学习中经常被提及的两个重要的学习方法. ...

  2. python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)

    [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...

  3. 读后感和机翻《人类因果迁移:深度强化学习的挑战》

    研究朱松纯FPICU体系的第1篇文章 <Human Causal Transfer: Challenges for Deep Reinforcement Learning>CogSci 2 ...

  4. ADPRL - 近似动态规划和强化学习 - Note 8 - 近似策略迭代 (Approximate Policy Iteration)

    Note 8 近似策略迭代 Approximate Policy Iteration 近似策略迭代 Note 8 近似策略迭代 Approximate Policy Iteration 8.1 通用框 ...

  5. ADPRL - 近似动态规划和强化学习 - Note 7 - Approximate Dynamic Programming

    Note 7 - 近似动态规划 Approximate Dynamic Programming 7. 近似动态规划 (Approximate Dynamic Programming) 7.1 近似架构 ...

  6. 强化学习(九)- 策略梯度方法 - 梯度上升,黑箱优化,REINFORCE算法及CartPole实例

    策略梯度方法 引言 9.1 策略近似和其优势 9.2 策略梯度定理 9.2.1 梯度上升和黑箱优化 9.2.2 策略梯度定理的证明 9.3 REINFORCE:蒙特卡洛策略梯度 9.3.1 轨迹上的R ...

  7. 强化学习(八) - 深度Q学习(Deep Q-learning, DQL,DQN)原理及相关实例

    深度Q学习原理及相关实例 8. 深度Q学习 8.1 经验回放 8.2 目标网络 8.3 相关算法 8.4 训练算法 8.5 深度Q学习实例 8.5.1 主程序 程序注释 8.5.2 DQN模型构建程序 ...

  8. 强化学习(七) - 函数近似方法 - 随机梯度下降, 半梯度下降,及瓦片编码(Tile Coding)实例

    函数近似方法 7.1 目标预测(VE‾\overline{VE}VE) 7.2 随机梯度下降和半梯度下降 例7.1: 1000态随机行走的状态收敛 7.3 线性近似 7.4 线性方法的特征构造 7.4 ...

  9. 强化学习(六) - 连续空间中的强化学习(RL in Continuous Spaces)及相关实例

    强化学习(六) - 连续空间中的强化学习 6.1 连续空间中的强化学习 6.2 离散空间和连续空间 6.3 离散化 实例:小车上山 6.3.1 相关程序 6.3.2 程序注解 (1) 环境测试 (2) ...

  10. 强化学习(五) - 时序差分学习(Temporal-Difference Learning)及其实例----Sarsa算法, Q学习, 期望Sarsa算法

    强化学习(五) - 时序差分学习(Temporal-Difference Learning)及其实例 5.1 TD预测 例5.1 回家时间的估计 5.2 TD预测方法的优势 例5.2 随机移动 5.3 ...

最新文章

  1. matlab 通过矩阵变换使图像旋转平移_图像的几何变换
  2. QIIME 2教程. 20实用程序Utilities(2020.11)
  3. linux tftp上传文件失败的原因
  4. iOS 延迟1.5s 执行方法
  5. mysql增删改查扩展_MySQL(增删改查补充)
  6. remote API和regular API 的区别
  7. python 和C语言 中的一些容易混淆的符号整理
  8. SkyEye图形化界面使用技巧篇(一)
  9. 电商指标详细介绍和推荐系统常用评估指标
  10. Js获取或计算时间的相关操作
  11. java图片转ASCII码_将图片转化成对应的Ascii字符图片
  12. 使用Echarts实现地图3D效果
  13. 在 Linux 上使用 VirtualBox 的命令行管理界面
  14. PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会将汉字转换为乱码
  15. 生鲜电商:卖什么?卖给谁?怎么卖?
  16. BeanFactory not initialized or already closed - call ‘refresh‘ before accessing beans via the Applic
  17. python常见开源库整理
  18. 几种漂亮边框制作教程
  19. c语言 建立测井数据结构体,给定C语言的数据结构 struct T { int w; union T { char c; int i; dou...
  20. 第三章 数字化转型的概念,技术框架及意义

热门文章

  1. 阿里云aks使用demo
  2. 职位介绍之硬件工程师(提升宝典)
  3. linux查看程序bss段,LINUX下目标文件的BSS段、数据段、代码段
  4. 基于微信小程序的资产管理平台的设计与实现
  5. CSS实现播放暂停按钮样式
  6. (转载)巴西世界杯谁能夺冠?霍金和高盛做预测
  7. Python网络流量监视程序设计与实现
  8. 数据显示:中国的程序员是世界上最牛的程序员
  9. 网页中添加QQ链接,别人一点就能和我进行QQ聊天
  10. 计算机软件系统的三个层次,计算机软硬件系统