【百度飞桨强化学习7日打卡营】学习笔记 -- 第二课:基于表格型方法求解RL

写在前面

本次课程是参加百度飞桨7日打卡营活动的第二天笔记。
课程链接:https://aistudio.baidu.com/aistudio/education/group/info/1335

主要内容:MDP、状态价值、Q表格
实践:Sarsa、Q-learning

一、状态转移和序列决策

在这里插入图片描述

强化学习面对的环境是完全未知的,这里的P函数和R函数是未知的。
在这里插入图片描述

二、Q表格

1. Q表格:一本生活手册,包含取得成功的知识。在这里插入图片描述

下面的救护车闯红灯的例子,就体现了 现实世界中奖励reward是延迟的。
在这里插入图片描述

2. Q表格:指导每一个Step的动作选择,目标导向

比如股票预测,引入了衰减因子。
在这里插入图片描述

reward 折扣因子
在这里插入图片描述
在这里插入图片描述
Q表格的形式:
在这里插入图片描述

三、Sarsa算法

1.Sarsa算法

下面的公式展示了更新的方式,通过不断更新α让Q(St,At) 逐步逼近 [Rt+1 + rQ(St+1,At+1)],这就是Sarsa算法。
在这里插入图片描述

2.Sarsa算法思路

在这里插入图片描述

3.Sarsa算法编程实践

注意 在执行learn(),需要先根据 下一次的观测next_obs,利用sample()拿到 下一次的动作next_action。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Sarsa实际上是一种 On-Policy的策略。它优化的是它实际执行的策略,他直接拿下一步我一定会执行的action,来优化Q表格。所以在执行过程中,只存在一种策略。它用一种策略来做action的选取,也用一种策略来做优化。
所以对于悬崖的例子,Sarsa知道自己下一步有可能到悬崖那边去,所以他尽量里悬崖远一点。这样就可以保证哪怕下一步有随机动作,他也可以保证在安全区域内。

四、Q-learning算法

在这里插入图片描述
在这里插入图片描述

五、Sarsa vs Q-learning

在这里插入图片描述
他们之间最明显的区别是:

Sarsa需要得到 下一步动作next_action,然后再进行学习learn();但是Q-learning 不需要得到 下一步动作next_action,就可以进行学习learn()。

在这里插入图片描述

六、总结

在这里插入图片描述
(课后作业感兴趣可以自己做一做,跑一跑)在这里插入图片描述

在这里插入图片描述

课后作业

实现Sarsa算法玩迷宫游戏 预期效果:最终输出的 test reward 为1.0

1.课后作业AI Studio运行效果

参照课上老师讲解和 PARL/examples/tutorials 里面的内容,填写完整 Notebook,并运行代码。
在这里插入图片描述

2.课后作业本地运行效果

pip install paddlepaddle==1.6.3
pip install parl==1.3.1
pip install gym
git clone --depth=1 https://gitee.com/PaddlePaddle/PARL.git  # 下载PARL代码库
dir PARL # 查看代码库根目录
cd PARL #进入到 PARL 文件夹
## Step3 运行sarsa
python examples/tutorials/lesson2/sarsa/train.py

在这里插入图片描述

## Step3 运行 q_learning
python examples/tutorials/lesson2/q_learning/train.py

在这里插入图片描述

要找到正确的上下班打卡时间,你可以按照以下步骤进行: 1. 遍历打卡数据列表。 2. 对于每个打卡记录,将期、开始时间和结束时间转换为`datetime`对象。 3. 如果结束时间小于开始时间,说明存在跨天的情况,需要将结束时间的期加一天。 4. 打印每天的上班时间和下班时间。 以下是使用Python实现的示例代码: ```python import datetime data = [ {'期': '2023-06-10', '开始时间': '2023-06-10 16:27:00', '结束时间': '2023-06-10 17:39:00'}, {'期': '2023-06-11', '开始时间': '2023-06-11 01:57:00', '结束时间': '2023-06-11 02:02:00'}, {'期': '2023-06-11', '开始时间': '2023-06-11 15:57:00', '结束时间': '2023-06-12 01:51:00'}, {'期': '2023-07-01', '开始时间': '2023-07-01 08:09:00', '结束时间': '2023-07-01 17:25:00'}, {'期': '2023-07-01', '开始时间': '2023-07-01 17:32:00', '结束时间': '2023-07-01 17:41:00'} ] # 遍历打卡数据 for record in data: date = datetime.datetime.strptime(record['期'], '%Y-%m-%d').date() start_time = datetime.datetime.strptime(record['开始时间'], '%Y-%m-%d %H:%M:%S') end_time = datetime.datetime.strptime(record['结束时间'], '%Y-%m-%d %H:%M:%S') # 处理跨天的情况 if end_time < start_time: end_time += datetime.timedelta(days=1) print(f"{date} 上班时间: {start_time}, 下班时间: {end_time}") ``` 运行以上代码,将会输出以下结果: ``` 2023-06-10 上班时间: 2023-06-10 16:27:00, 下班时间: 2023-06-11 02:02:00 2023-06-11 上班时间: 2023-06-11 01:57:00, 下班时间: 2023-06-12 01:51:00 2023-07-01 上班时间: 2023-07-01 08:09:00, 下班时间: 2023-07-01 17:25:00 2023-07-01 上班时间: 2023-07-01 17:32:00, 下班时间: 2023-07-01 17:41:00 ``` 这样,你就可以找到每天的正确上下班打卡时间了。 希望能帮到你!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值