强化学习-表格型算法Q学习稳定倒立摆小车

news/2024/10/6 4:29:10/文章来源:https://www.cnblogs.com/pomolnc/p/18288975

[[Q 学习]] 是表格型算法的一种,主要维护了一个 Q-table,里面是 状态-动作 对的价值,分别由一个状态和一个动作来索引。

这里以一个经典的道理摆小车问题来说明如何使用 [[Q 学习]] 算法。
这里会用到两个类,agentbrainbrain 类中来维护 [[强化学习的基本概念|强化学习]] 算法的具体执行,agent 是一层封装,以后也可以用其他算法来实现 brain 类。整个的逻辑也可以参考[[强化学习基本程序框架]]。
首先是 agent

class Agent():def __init__(self, num_states, num_actions):self.brain = Brain(num_states, num_actions)def update_Q_fun(self, observation, reward, action, next_observation):self.brain.update_Q_table( observation, reward, action, next_observation)def get_action(self, observation,step):action = self.brain.decide_action(observation, step)return action

其中 get_action 就是根据状态选择一个动作,可以不放到 brain 类里面,一般都是 \(\epsilon\) -贪心算法在动作空间里面选动作。update_Q_fun 用来更新 Q-table,如果是其他算法,比如说 [[DQN]],换个名字就行。

然后是 brain

class Brain():def __init__(self, num_states, num_actions):self.num_actions = num_actionsself.Q_table = np.random.uniform(low=0, high=1, size=(NUM_DIZITIZED**num_states, num_actions))def bins(self,clip_min, clip_max, num ):return bins(clip_min, clip_max, num)def digitize_state(self,observation) :cart_pos, cart_v, pole_angle, pole_v = observationdigitized = [np.digitize(cart_pos, bins=self.bins(-2.4, 2.4, NUM_DIZITIZED)),np.digitize(cart_v, bins=self.bins(-3.0, 3.0, NUM_DIZITIZED)) ,np.digitize(pole_angle, bins=self.bins(-0.5, 0.5, NUM_DIZITIZED)) ,np.digitize(pole_v, bins=self.bins(-2.0, 2.0, NUM_DIZITIZED) )]return sum([x * (NUM_DIZITIZED**i) for i, x in enumerate(digitized)])def update_Q_table(self, observation, reward, action, next_observation):state = self.digitize_state(observation) state_next = self.digitize_state(observation_next)Max_Q_next = np.max(self.Q_table[state_next][:])self.Q_table[state,action] = self.Q_table[state,action] + ETA * (reward + GAMMA * Max_Q_next - self.Q_table[state,action])def decide_action(self, observation,episode):  state = self.digitize_state(observation)epsilon = 0.5 * (1 / (episode + 1))if epsilon <= np.random.uniform(0, 1):action = np.argmax(self.Q_table[state][:])else:action = np.random.choice(self.num_actions)return action

update_Q_table 就是根据时序差分的公式更新 Q-table。

\[Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha[R_t+\gamma\max_aQ(s_{t+1},a)-Q(s_t,a_t)] \]

其中,\(\alpha\) 是学习率,\(\gamma\) 是奖励累积的折扣系数。如果这里的 \(\max_aQ(s_{t+1},a)\) 换成 \(Q(s_{t+1},a_{t+1})\) 的话,就是 [[sarsa 算法]]。
decide_action 就是前面提到的 \(\epsilon\) -贪心算法选取动作,这里的 \(\epsilon\) 是随 episode 的数量衰减的。
digitize_state 是为了处理连续状态的。因为倒立摆小车的位置、速度、杆的角度这些信息是连续变量(尽管是在计算机中仿真,我们也认为是连续的),所以为了能在表格中维护,需要将状态进行离散化处理,比如位置在什么范围内就认为其状态是 1。为了减少内存的占用,示例里 NUM_DIZITIZED 等于 6,意思是只用 6 个数来划分表示单一维度里面的连续区间的状态。实际上,如果状态空间任一维度都很大或者状态空间本身就是连续的,后面会有 [[DQN]] 等算法可以处理。

仿真代码:

frames=[]
#环境初始化
env=gym.make('CartPole-v0')
observation = env.reset()#需要先重置环境NUM_DIZITIZED = 6
GAMMA=0.99   # 时间折扣率
ETA=0.5       # 学习系数
MAX_STEPS=200
NUM_EPISODES = 200agent = Agent(6,2)
complete_episodes = 0 
is_episode_final = False for episode in range(NUM_EPISODES):observation = env.reset()for step in range(0,MAX_STEPS):if is_episode_final:frames.append(env.render(mode='rgb_array')) #将各个时刻的图像添加到帧中action = agent.get_action (observation, episode)observation_next, _, done, _ = env.step(action)# 自定义的奖励部分# 如果结束的时候,已经稳定了190步,就给1的奖励,否则-1.没结束的时候奖励是0if done: if step < 190:reward = -1 complete_episode = 0 else:reward = 1complete_episodes += 1 else:reward = 0 agent.update_Q_fun(observation,reward,action,observation_next)observation= observation_nextif done:print(f'{episode} Episode: Finished after {step + 1} time steps')breakif complete_episodes >= 10:print('10回合连续成功')is_episode_final = Truedisplay_frames_as_gif(frames)

More Reading

[[边做边学深度强化学习:PyTorch程序设计实践]]

Reference

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739978.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三维重建工作的一些调研

GPT关于3D-GS的回答如果我获得了一个3D高斯溅射的表达,给定任意的相机内参和外参,是不是就能生成一副2D图像Yes, given a 3D Gaussian splatting representation and the intrinsic and extrinsic camera parameters, you can generate a 2D image from any desired viewpoin…

Spark Special_杨宁远 杂题分析.md

Spark Special 图论_杨宁远 杂题分析 Date: 2024-07-03 Preface 本文基于杨宁远 @ynycoding 的课件与题单,对省选/NOIP阶段图论的建模方法和解题策略进行总结,以及本阶段常用方法、模型和 Trick。 A. [AGC056C] 0/1 Balanced [AGC056C] 01 Balanced - 洛谷 | 计算机科学教育新…

按指定日期重复

问题:根据D1指定的日期将A2:C8区域进行重复公式1(姓名)右拉下拉完成 =INDEX(A:A,MOD(ROW(A1)+COUNTA(A:A)-2,COUNTA(A:A)-1)+2) 公式2(日期)下拉完成 =SUBSTITUTE(LEFT(D$1,FIND("-",D$1)-1),".","/")+(ROW(A1)-1)/(COUNTA(A:A)-1) 公式3(…

语法2-运算符、包机制、JavaDoc

语法 运算符 运算符具有优先级-网上查(一般使用括号保证)/-除,%-取余符号-21/10二十一除十取余数,幂运算使用工具类表示Math.pow(2,3)-2的3次方 ++自加,--自减 int a =3 ; int b =a++;//输出a=4,b=3 int b =++a;//输出a=4,b=4==-等于,!=-instanceof-不等于逻辑运算符-与或…

厦门福州七日游

厦门福州七日游2024-06-30 上午被发短信告知航班延误两个半小时。 晚上八点多九点才到了厦门,湘妹 yhp yzf 已经在酒店了。厦门机场不通地铁?????于是打了个车去地铁站。 酒店就在中山路步行街上,有各种店铺。点了一份外卖,和大伙打了一会三国杀,输了几局 2024-07-01 …

SumIf的问题

问题:进销存表数据等于同货号入库表中数据 函数公式解决:=SUMIF(入库!A:A,B3,入库!C:C)

7/8死神永生服周报第七期

1. 死神永生新闻 2. 死神永生服TNT军事基地[三] 3. 死神永生服的古代建筑之自然选择号目录死神永生新闻 死神永生服TNT军事基地[三] 死神永生服的古代建筑之自然选择号这几天又没上死神永生,主要是期末比较繁忙,因此又停了一期。。真的很抱歉。死神永生新闻前一周的治理新闻时…

两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码

今天推荐两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码,这两个源码完整,都是基于thinkphp内核开发的,框架稳定,带数据库,源码文件,可以直接部署使用。第一个:3D模型 图纸模型 机械模型(图纸)下载资源网站源码 thinkphp5开发原创模型(图…

win 10 使用SSH 连接

本教程建议使用win 10 、win 11 非家庭版使用 首先安装 ssh 服务端 Get-Service -Name *ssh* #查看服务ssh -V #查看ssh 版本 netstat -an |findstr :22 # 查看端口是否被监听 ipconfig # 查看本机IP ssh administrator@IP 在用户/.ssh 目录下创建文件 authorized_keys 将…

音视频录制与播放原理

图片来源于网上学习资料,零声学院!

2.基于Containerd运行时搭建Kubernetes多控制平面集群实践-腾讯云开发者社区-腾讯云

https://cloud.tencent.com/developer/article/21298462.基于Containerd运行时搭建Kubernetes多控制平面集群实践发布于 2022-09-29 19:27:531K0 举报文章被收录于专栏:全栈工程师修炼之路[TOC]0x00 前言简述 本章主要讲述,如果使用kubeadm进行安装配置K8S集群,并指定使用co…

【寻迹】二分与三分

二分与三分 二分是一种常用且非常精妙的算法。(英才计划甚至还水了一篇文章)三分法则可以用来解决单峰函数的极值以及相关问题 一、二分 二分法,在一个单调有序的集合或函数中查找一个解,每次均分为左右两部分,判断解在哪一个部分后调整上下界。每次二分都会舍弃一半区间,…