提示:转载请注明出处,若本文无意侵犯到您的合法权益,请及时与作者联系。

莫烦Python代码实践(一)——Q-Learning算法工程化解析

声明

一、Q-Learning算法是什么?

二、Q-Learning算法的工程化

1、 随机初始化每一个状态s处的每一个动作a的价值

2、构建遍历每个episode和遍历每个step的循环

3、按照某种策略选择观测值observation下的动作action

4、进行Q表中价值的学习更新



声明

本文是作者学习莫烦Python的代码笔记总结,如想深入可移步莫烦Python的该课程。本文只讨论Agent角度的代码实现。


一、Q-Learning算法是什么?

Q-Learning的算法流程如下:

二、Q-Learning算法的工程化

下面考虑使用代码进行工程化:

1、 随机初始化每一个状态s处的每一个动作a的价值

在Q-Learning算法中就是用一个行数为所有状态数,列数为所有动作数的二维表(这里称为Q表)来存储,在Python中我们可以使用pandas库的数据结构——二维表DataFrame来初始化这个数据结构:

在上述代码中我们创建了一个固定行列数的内容随机的二维表。但是在应用时,我们的二维表的行数是要动态变化的,即当访问到了某个状态时我们再把它加到二维表格里,没有访问到该表格就先不添加,理论上这些状态我们都会访问到,这里进行这样的处理是一种提高效率的编程技巧,所以我们继续看一下如何在上述的二维表中添加一行新数据:

上图中使用到了pandas库中的另一个数据结构Series,关于Pandas的用法,可以查看我的博客。

现在,我们来设计一套可以自定义列名、行数据可以随时添加的二维表的解决方案:

# 创建一个动作数为4的列表
actions=list(range(4))
# 创建一个列名为actions的存储数据类型为float64的二维表格
q_table = pd.DataFrame(columns=actions,dtype = np.float64)def check_state_exist(state):"""检查该状态是否存在,不存在则添加"""global q_tableif state not in q_table.index:# 添加新的一行数据到Q表中q_table =q_table.append(pd.Series([0]*len(actions),index=q_table.columns,name=state,))

注意上述有使用到global这个关键字,这是为了在函数中声明q_table为全局变量。

现在我们向其中动态添加一个状态名为‘a’的数据:


可以看到我们已经成功得到了一套可以自定义列名、行数据可以随时添加的二维表的解决方案。

我们将用这套解决方案来初始化我们的Q表。

2、构建遍历每个episode和遍历每个step的循环

# 遍历每一个episode
for episode in range(100):# 初始化初始观测值observation = env.reset()# 遍历每一个stepwhile True:...# 当该回合结束时结束回合if done:break

在上述这个双重循环中,我们使用了env的必备接口reset()来初始化我们的初始状态的观测值observation。

外层循环的终止条件为达到设定的episode数,这里我们默认为常量,实际可以设置成为一个变量。

内层循环的终止条件为满足episode终止条件,这个一般通过检查env在每个step中返回的标志变量来实现。

3、按照某种策略选择观测值observation下的动作action

这里我们使用的是 Epsilon greedy ()的策略,即epsilon = 0.9 时, 就说明有90% 的情况Agent会按照 Q 表的最优值选择行为, 10% 的时间使用随机策略选择行为。

我们现在的需求是输入一个observation,按照Epsilon greedy选择observation对应的一行数据中的某个动作价值最高的动作或者是其随机的一个动作。

首先我们需要拿到observation对应的二维表中的行数据state_action,方法如下:

现在我们要访问行数据中价值最大的索引:

现在我们可以得到如何通过代码来实现 Epsilon greedy策略:

def choose_action(observation,epsilon=0.1):"""根据当前Q-Table中状态的观测值来获取应当采取的动作"""global q_tablecheck_state_exist(observation)# 采用ϵ−greedy策略来选择动作if np.random.rand() < epsilon:# 获取Q-Table中行名字为observation的包含全部列的一行数据state_action = q_table.loc[observation, :]# 获取这一行数据中价值最大的动作,如果存在多个则随机选择其中一个action = np.random.choice(state_action[state_action == np.max(state_action)].index)else:# 直接选择随机的一个动作actions=list(range(4))action = np.random.choice(actions)return action

4、进行Q表中价值的学习更新

接下来就是最为关键的部分,即如何更新Q表中的值,我们依据的公式是:

在上述公式中我们可以通过如下代码或者类似的代码来访问到Q(s,a):
q_table.loc[s, a]
学习率alpha和折扣因子gamma是我们自定义的,下一个状态s_和立即回报reward都是env返还给我们的, 所以我们可以得到如下代码来实现:
    def learn(s, a, r, s_):"""学习更新 Q-Table"""check_state_exist(s_)# 计算Q预测值q_predict = self.q_table.loc[s, a]# 计算Q现实值if s_ != 'terminal':q_target = r + self.gamma * self.q_table.loc[s_, :].max()  # 下一状态不是终点else:q_target = r  # 下一状态是终点# 更新self.q_table.loc[s, a] += self.lr * (q_target - q_predict)  # 更新Q-Table

莫烦Python代码实践(一)——Q-Learning算法工程化解析相关推荐

  1. 莫烦python教程_python实现各种最优化算法

    python视频教程栏目介绍各种最优化算法 二分法 函数详见rres,此代码使该算法运行了两次def asdf(x): rres=8*x**3-2*x**2-7*x+3 return rres i=2 ...

  2. python代码实践-程序员的算法趣题-Q05

    Q05 还在用现金支付吗 当下,坐公交或者地铁时大部分人都是刷卡的.不过,时至今日还在用现金支付的人还是比想象的多.本题我们以安置在公交上的零钱兑换机为背景. 这个机器可以用纸币兑换到 10 日元.5 ...

  3. 莫烦python教程部分代码

    GitHub资源整理 莫烦python教程部分代码 莫烦python教程部分代码 整理了一部分莫烦Python教程中的代码,并对代码进行了详细的注释.由于莫烦大佬在做TensorFlow教程时使用的0 ...

  4. 【莫烦Python】Pandas教程

    目录 前言 1.Pandas vs Numpy 2.基本介绍 3.选择数据 4.设置值 5.处理丢失的数据 6.pandas导入导出 7.pandas合并concat 8.pandas合并merge ...

  5. 莫烦python教程下载_Python 有哪些好的学习资料或者博客?

    Python是一门语法非常简单的语言,学习Python不需要花大量时间去学习它的语法,过一遍就行,主要靠实践.先给大家分享一个免费的Python的编程课,有Python的视频课程+代码实践课+辅导答疑 ...

  6. 【莫烦Python】Python 基础教程——学习笔记

    文章目录 本笔记基于p1-p29[莫烦Python]Python 基础教程 大家可以根据代码内容和注释进行学习. 安装 我的:python3.8+anaconda+VS code print() pr ...

  7. 【莫烦Python】机器要说话 NLP 自然语言处理教程 W2V Transformer BERT Seq2Seq GPT 笔记

    [莫烦Python]机器要说话 NLP 自然语言处理教程 W2V Transformer BERT Seq2Seq GPT 笔记 教程与代码地址 P1 NLP行业大佬采访 P2 NLP简介 P3 1. ...

  8. CNN识别手写数字-莫烦python

    搭建一个 CNN识别手写数字 前面跟着莫烦python/tensorflow教程完成了神经网络识别手写数字的代码,这一part是cnn识别手写数字的 import tensorflow as tf f ...

  9. 【莫烦Python】Numpy教程

    目录 前言 1.numpy属性 2.numpy的array创建 3.numpy的基础运算 4.numpy的基础运算2 5.numpy的索引 6.numpy的array合并 7.numpy的array分 ...

最新文章

  1. openssl、x509、crt、cer、key、csr、ssl、tls
  2. 电动双联电位器ZW1613
  3. 实用make最佳实践
  4. 吴恩达深度学习课程deeplearning.ai课程作业:Class 2 Week 1 1.Initialization
  5. javascript中变量的判断
  6. 揭秘《死者之书》之游戏角色资源创作
  7. 了解ADF生命周期中的ADF绑定
  8. Windows巡检IIS指标脚本(PowerShell实现)
  9. ucos-II 任务间同步源码分析(一)
  10. python 中关于无法导入自己写的类。解决方法
  11. 自动化/控制工程专业英语01——什么是控制[考研/保研面试]
  12. 【C语言】有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的人是原来第几号。
  13. 梳理审批流程的程序编码流程
  14. 微信小程序分页加载列表
  15. tar 命令压缩时报错 tar: Removing leading `/' from member names
  16. 如何掌握程序语言(王垠)
  17. 查阅相关文献描述CN,SMC,EMCI,LMCI,AD五类疾病的早期干预和诊断标准|2022数维杯国赛C题
  18. mysql_row百度百科_MySQL
  19. 期货十三篇 第七篇 平仓篇
  20. BetaFlight模块设计之二:SERIAL任务分析

热门文章

  1. Linux内核移植 part3:sdmmc驱动
  2. 搭建umi框架时出现Error: Error: Plugin umi-plugin-react can't be resolved
  3. 致远OA A8V5 A6V5 V8.2 8.1 8.0 V7 V6 V5 V3补丁
  4. vue 导出excel文件 利用 excelJs插件
  5. android中PreferenceScreen类的用法
  6. 计算机操作题蝴蝶效应,办公自动化上机操作测试题
  7. python 读grid 数据_wxpython编程之 grid(数据表格)
  8. 计算机程序c语言教材,全国计算机等级考试二级C语言程序设计教材(2018年版)...
  9. 解密最接近人脑的智能学习机器——深度学习及并行化实现
  10. 中国移动计算机类行测题目,2019中国移动春招考试行测题库:行测常识判断模拟题(十三)...