Q-learning原理及其实现方法

Q_learning原理及其实现方法

    • 声明
    • 前期回顾
    • 简介
    • Q_learning算法
    • Q_learning算法流程
    • Q_learning算法理解
    • Q_learning算法实现
    • 知识拓展

声明

学习博客快乐的强化学习1——Q_Learning及其实现方法,加之自己的理解写成,同时欢迎大家访问原博客

前期回顾

python单独运行查看py文件中类里面的函数功能

简介

Q-Learning是一种 value-based 算法,即通过判断每一步 action 的 value来进行下一步的动作,以人物的左右移动为例,Q-Learning的核心Q-Table可以按照如下表示:

环境向左向右
100.1
20.20.15
30.320.5

其中,在环境1下,向左得分为0,向右得分为0.1

在进行初始化时,给予一个概率值 e_greedy, 当处于环境1时,按照算法中的策略进行动作选择的概率为 e_greedy,而为了避免局部最优以及进行更多的探索,仍按照 1- e_greedy 的概率进行随机选择。

Q_learning算法

在这里插入图片描述

Q_learning算法流程

在这里插入图片描述

Q_learning算法理解

  1. 建立Q表,行是每种状态,列是每种状态的行为,值是某状态下某行为估计获得的奖励
  2. 每次进行状态转移时有e_greedy概率选当前状态最优方法,有 1- e_greedy选随机方法
  3. 选完之后就更新当前状态下对应所选行为的Q值(估计值)
  4. 更新方法:其自身= 其自身+学习率*(估计-现实) —> (实际更新 = 实际未更新+学习率*(预测-实际发生))
    在这里插入图片描述
    现实值也是其自身, 估计值是选择当前行为后的奖励及下一状态中选择与当前状态具有相同行为的Q值

PS:建议结合以下的例子理解。

Q_learning算法实现

以小男孩取得玩具为例子,讲述Q-Learning算法的执行过程。
在这里插入图片描述
在一开始的时候假设小男孩不知道玩具在哪里,他的Q_Table一片空白,此时他开始观测自己所处的环境,这个环境是环境1,并将这个环境加入到Q_Table中。此时,他不知道左右两个环境的情况,所以向左走向右走的得分都是0, 这两个得分都是小男孩心中预测出来的,并不是真实的左右两个环境的得分,我们给这个得分一个名字叫做q_predict。

环境向左向右
100

往左走往右走都是有可能的,如果他往左走,他会到达环境0,环境0是一个深渊,然后小男孩就挂了。此时环境会给他一个反馈得分,由于他掉入了深渊,所以他的得分是-1, 这个得分是环境0的实际得分,与上面小男孩处于环境1对环境0的预测得分不同,我们给这个得分一个名字叫做q_target, 由于这个得分与上一步预测的环境0的得分不同,所以我们需要对上一个表格进行更新,此时他的Q_Table表为:

环境向左向右
1-0.010

此时小男孩重生了,在这一轮假设他会选择往右走,此时他到达了环境2,并将这个环境加入到Q_Table中。此时,他不知道这个新环境的情况,向左走和向右走对他来说是一样的,所以这个新环境的左右两个Actions得分都是0。

环境向左向右
1-0.010
200

此时他会随机选择一个方向走,之后不断重复探测新环境和走回旧环境的过程,如果他在不断测试中找到了最后的toys,他会得到正数得分,这个得分会一步一步驱使他走向toys。在经过许多次的尝试之后,小男孩会找到一条最快通向玩具的道路。假设环境4就是玩具,小男孩在经过多次尝试后,最后的Q_Table可能是这样。

环境向左向右
1-0.020.033
20.0010.154
300.547

对于Q-Learning算法的主体而言,Q-Learning算法主要由两个对象组成,分别是Q-Learning的大脑和大环境。
Q-Learning的大脑包括以下部分,其对应的功能为

模块名称作用/功能
初始化初始化学习率、可执行动作、Q_table等参数
动作选择根据小男孩当前所处的环境和Q_table进行动作选择
学习根据小男孩当前所处的环境对其它环境的预测情况q_predict和下一步环境的实际情况q_target更新Q_table表
确认是否存在该环境由于在学习之前环境是未知的,当进入一个新环境时,需要生成一个得分都为0的动作表格

大环境包括以下部分,其对应的功能为

模块名称作用/功能
初始化初始化环境参数、用于构建环境
图画更新用于更新当前的图画,便于用户观察
环境观察用于返回当前环境情况
终点观察用于返回是否到达终点
更新坐标用于更新当前所处位置
下一环境获取用于获取下一步的环境的实际情况
参数归零用于每一个步坐标和当前行走步数的归零

在完成两个对象的构建后,需要有一个主函数将两个对象联系起来使用,主函数需要完成以下功能,以伪代码的形式呈现:

初始化测试环境对象
初始化Q-Learning的大脑对象
for episode in range(TIMES):环境观察图画更新while(1):终点观察if(到达终点):打印当前进行世代数,共使用多少步数参数归零break;动作选择获取下一步的环境的实际情况学习更新坐标图画更新

在观察完Q_Learning算法的伪代码后我们可以发现, 大脑在获取下一步环境的实际情况之后再进行学习,学习函数对Q-Table表更新的重要参数之一就是获取下一步的环境的实际情况。 具体来说,在进行学习过程时,Q-Learning的大脑对象会根据所处的当前环境对各个动作的预测得分和下一步的环境的实际情况(最大得分)对当前环境的Q-Table表进行更新,具体的代码如下所示


1.QL.py

import numpy as np
import pandas as pdclass QL:def __init__(self, actions, learning_rate=0.05, reward_decay=0.9, e_greedy=0.9):self.actions = actions      #初始化可以进行的各种行为,传入为列表self.lr = learning_rate     #学习率,用于更新Q_table的值self.gamma = reward_decay   #当没有到达终点时,下一环境对当前环境的影响self.epsilon = e_greedy     #随机选择几率为1-e_greedy,当处于e_greedy内时,不随机选择。self.q_table = pd.DataFrame(columns=self.actions, dtype=np.float64)     #生成q_table,列向量为columnsdef choose_action(self,observation):self.check_observation(observation)        #检测是否到达过这个点,如果没到达过,在Q表中增加这个节点action_list = self.q_table.loc[observation,:]           #取出当前observation所在的不同方向if(np.random.uniform() < self.epsilon):    #如果在epsilon几率内action = np.random.choice(action_list[action_list == np.max(action_list)].index)    #选出当前observation中Q值最大的方向else:action = np.random.choice(self.actions)      #如果不在epsilon内,则随机选择一个动作return action                                    #返回应当做的actiondef learn(self,observation_now,action,score,observation_after,done):self.check_observation(observation_after)        #检查是否存在下一环境对应的方向状态q_predict = self.q_table.loc[observation_now,action]        #获得当前状态下,当前所作动作所对应的预测得分if done:q_target = score     #如果完成了则q_target为下一个环境的实际情况得分,本例子中此时score为1else:q_target = score + self.gamma * self.q_table.loc[observation_after, :].max()  #如果未完成则取下一个环境若干个动作中的最大得分作为这个环境的价值传递给当前环境#根据所处的当前环境对各个动作的预测得分和下一步的环境的实际情况更新当前环境的q表self.q_table.loc[observation_now, action] += self.lr * (q_target - q_predict)  def check_observation(self,observation):if observation not in self.q_table.index:               #如果不存在 self.q_table = self.q_table.append(                 #则通过series函数生成新的一列pd.Series([0]*len(self.actions),index=self.actions,name=observation,))

2. Env.py

import numpy as np
import pandas as pd
import time class Env:def __init__(self,column,maze_column):self.column = column                        #表示地图的长度self.maze_column = maze_column - 1          #宝藏所在的位置self.x = 0                                  #初始化xself.map = np.arange(column)                #给予每个地点一个标号self.count = 0                              #用于技术一共走了多少步def draw(self):a = []for j in range(self.column) :               #更新图画if j == self.x:a.append('o')elif j == self.maze_column:a.append('m')else:a.append('_')interaction = ''.join(a)print('\r{}'.format(interaction),end = '')def get_observation(self):return self.map[self.x]                     #返回现在在所def get_terminal(self):if self.x == self.maze_column:              #如果得到了宝藏,则返回已经完成done = Trueelse:done = Falsereturn donedef update_place(self,action):self.count += 1                              #更新的时候表示已经走了一步if action == 'right':                                  if self.x < self.column - 1:self.x += 1elif action == 'left':   #leftif self.x > 0:self.x -= 1def get_target(self,action):if action == 'right':                        #获得下一步的环境的实际情况if self.x + 1 == self.maze_column:score = 1pre_done = Trueelse:score = 0pre_done = Falsereturn self.map[self.x + 1],score,pre_doneelif action == 'left':   #leftif self.x - 1 == self.maze_column:score = 1pre_done = Tureelse:score = 0pre_done = Falsereturn self.map[self.x - 1],score,pre_donedef retry(self):            #初始化self.x = 0self.count = 0

3. run_this.py

from Env import Env
from QL import QL
import timeLONG = 6                    #总长度为6
MAZE_PLACE = 6              #宝藏在第六位
TIMES = 15                  #进行15次迭代people = QL(['left','right'])       #生成QLearn主体的对象,包含left和right
site = Env(LONG,MAZE_PLACE)         #生成测试环境
for episode in range(TIMES):state = site.get_observation()  #观察初始环境site.draw()                     #生成图像time.sleep(0.3)                 #暂停while(1):done = site.get_terminal()  #判断当前环境是否到达最后if done:                    #如果到达,则初始化interaction = '\n第%s次世代,共使用步数:%s。'%(episode+1 ,site.count)print(interaction)site.retry()time.sleep(2)breakaction = people.choose_action(state)                        #获得下一步方向state_after,score,pre_done = site.get_target(action)        #获得下一步的环境的实际情况people.learn(state,action,score,state_after,pre_done)       #根据所处的当前环境对各个动作的预测得分和下一步的环境的实际情况更新当前环境的q表site.update_place(action)                                   #更新位置state = state_after                                         #状态更新site.draw()                                                 #更新画布time.sleep(0.3)print(people.q_table)

结果为:

_____o
第1次迭代,共使用步数:44
_____o
第2次迭代,共使用步数:11
_____o
第3次迭代,共使用步数:6
_____o
第4次迭代,共使用步数:6
_____o
第5次迭代,共使用步数:5
_____o
第6次迭代,共使用步数:7
_____o
第7次迭代,共使用步数:5
_____o
第8次迭代,共使用步数:5
_____o
第9次迭代,共使用步数:5
_____o
第10次迭代,共使用步数:5
_____o
第11次迭代,共使用步数:5
_____o
第12次迭代,共使用步数:5
_____o
第13次迭代,共使用步数:5
_____o
第14次迭代,共使用步数:5
_____o
第15次迭代,共使用步数:5left     right
0  0.000000  0.000452
5  0.000000  0.000000
1  0.000000  0.004429
2  0.000000  0.031661
3  0.000000  0.159344
4  0.001327  0.536709

知识拓展

快捷键批量注释/取消注释、缩进/取消缩进
python中join函数
Python中format函数用法说明
python中format函数

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

2015Mac版飞秋无法接受文件夹!!!

飞秋Mac版和windows版在同一个网段下可以互传文件&#xff0c;但是不能传文件夹&#xff0c;脑壳疼。。。 各路大神可以重写飞秋的方法我就不敢说了&#xff0c;只能绕绕弯才能维持得了生活这样子&#xff0c;也可以用其他的飞鸽传书之类 但是大家都用飞秋我也没办法QAQ 用V…

用飞秋给朋友发送消息失败的原因分析及解决办法

作者&#xff1a;朱金灿 来源&#xff1a;http://blog.csdn.net/clever101 使用飞秋经常发生这样的错误&#xff1a; 给用户***发送失败&#xff01;可能用户已下线,或网络原因,或您发送的内容太长。您可刷新用户列表后重试。 温馨提示:如果对方不在线&#xff0c;您发送信息时…

SLAM从入门到精通(开始篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多同学喜欢学习linux&#xff0c;但是他们只是把linux当成是一个嵌入式技术在学习&#xff0c;而不是当成工具在使用。平时&#xff0c;要么是自…

Android JNI系列详解之ndk编译工具环境变量配置

一、前提 之前是只介绍了CMake编译工具的使用&#xff0c;现在介绍另一种原生&#xff08;NDK自带的脚本工具&#xff09;自带的编译方式&#xff1a;ndk-build&#xff0c;想要使用ndk-build编译工程&#xff0c;我们需要配置全局的环境变量。 二、配置环境变量 找到ndk在电脑…

细看AI芯片的“小趋势”

https://www.toutiao.com/a6686360647858389517/ 2019-05-02 17:34:13 来源&#xff1a;techweb 芯片战争未曾停歇。飞速发展的自动驾驶为芯片厂商带来了新的机会&#xff0c;IC设计商尝试推出更适用于AI场景的芯片&#xff0c;晶圆与封测厂商图加速换代生产线&#xff0c;以…

体验首款Linux消费级平板,原来芯片和系统全是国产

晓查 梦晨 发自 凹非寺量子位 报道 | 公众号 QbitAI 国产OS&#xff0c;国产芯片&#xff0c;号称可以写代码&#xff0c;以生产力平板热议于海外的JingPad…… 真的有那么神吗&#xff1f; 不久前&#xff0c;我们介绍了由中国创业团队打造的移动操作系统JingOS&#xff0c;以…

分库分表之 Sharding-JDBC 中间件,看这篇真的够了!

本文大纲如下 Sharding-JDBC 的基本用法和基本原理前言1. 我的出生和我的家族2. 我统治的世界和我的职责3. 召唤我的方式4. 我的特性和我的工作方法4.3.1. SQL 解析4.3.2. SQL 路由4.3.3. SQL 改写4.3.4. SQL 执行4.3.5. 结果归并4.2.1. 逻辑表和物理表4.2.2. 分片键4.2.3. 路由…

粒子群算法的基本原理和Matlab实现

1.案例背景 1.1 PSO算法介绍 粒子群优化算法(Particle Swarm Optimization,PSO)是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早是由Kennedy和 Eberhart 在1995年提出的。PSO算法源于对鸟类捕食行为的研究,鸟类捕食时,每只鸟找到食物最简单有效…

【集合学习ConcurrentHashMap】ConcurrentHashMap集合学习

ConcurrentHashMap集合学习 一、JDK1.7 和 1.8 版本ConcurrenHashMap对比分析 JDK 1.7版本 在JDK 1.7版本ConcurrentHashMap使用了分段锁的方式&#xff08;对Segment进行加锁&#xff09;&#xff0c;其实际结构为&#xff1a;Segment数组 HashEntry数组 链表。由很多个 …

I^2C总线简介

总共有五种工作状态&#xff1a; A&#xff1a;总线非忙状态 该状态时数据线&#xff08;SDA&#xff09;和时钟线&#xff08;SCL&#xff09;都保持高电平。 B&#xff1a;启动状态 当时钟线&#xff08;SCL&#xff09;为高电平状态时&#xff0c;数据线&#xff08;SDA&…

Docker镜像列表中的none:none是什么

在构建过Docker镜像的电脑上查看本地镜像列表&#xff0c;有可能看到下图红框中的镜像&#xff0c;在列表中展示为<none>:<none>&#xff1a; 这种镜像在Docker官方文档中被称作dangling images&#xff0c;指的是没有标签并且没有被容器使用的镜像。 官方解释 …

三、JVM监控及诊断工具-GUI篇

目录 一、工具概述二、jconsole&#xff08;了解即可&#xff09;1、基本概述2、启动3、三种连接方式4、作用 三、Visual VM 一、工具概述 二、jconsole&#xff08;了解即可&#xff09; 1、基本概述 从Java5开始&#xff0c;在JDK中自带的Java监控和管理控制台用于对JVM中内…

系统架构设计高级技能 · Web架构

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 Web架构 一、Web架构介绍1.1 Web架构涉及技术1.2 单台服务…

计算机组成原理 | 第一章 计算机系统概述

目录 计算机发展历程 计算机系统层次结构 计算机的性能指标 计算机发展历程 电子计算机的发展已经历了4代&#xff0c;这4代计算机的主要元件分别是电子管、晶体管、中小规模集成电路、大规模集成电路。微型计算机的发展以微处理器技术为标志。可以在计算机中直接执行的语…

快到家了【经济学人】

Refugees Almost home China has successfully absorbed many refugees from Vietnam. But it is ill-prepared for another influx Oct 10th 2015 | QIAOGANG, GUANGXI PROVINCE | From the print edition 来源&#xff1a;Economist 翻译&#xff1a;Z.K. IN A restaurant…

军事物联网如何改变未来战争模式?

军事物联网如何改变未来战争模式&#xff1f; 2017-05-08 17:45:17.0 你是否听说&#xff0c;在物联网的世界里&#xff0c;每一粒沙子都将拥有自己的IP地址。 互联网为我们创造了虚拟世界&#xff0c;与其一字之差的物联网&#xff0c;却为我们开辟了一个从虚拟转向现实的窗口…

去越南旅游,2万人民币能承担几天的花销?

2万人民币可以兑换6600多万越南盾,三年前我有一个同学带着一万块人民币,当时在越南生活了差不多三个月的时间。他之所以会去越南,主要是当时听人家说在越南农村好找老婆,并且彩礼会非常的少,所以就带着一万块钱先去看一看。虽然人回来的时候瘦了点黑了点,但是三个多月只花…

基于springboot学生社团管理系统/基于Java的高校社团管理系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

QChart——折线

Qchart的图形显示依附于QChartView&#xff0c;创建一个QChartView继承类&#xff0c;通过窗口部件的提升进行图表的显示 一、简单认识QLineSeries QLineSeries属于折线类&#xff0c;它继承于QXYSeries类&#xff0c;可以使用QXYSeries类所有方法&#xff0c;对折线进行属性设…

前端需要理解的性能优化知识

优化的目的是展示更快、交互响应快、页面无卡顿情况。 1 性能指标 2 分析方法 使用 ChromeDevTool 作为性能分析工具来观察页面性能情况。其中Network观察网络资源加载耗时及顺序&#xff0c;Performace观察页面渲染表现及JS执行情况&#xff0c;Lighthouse对网站进行整体评分…