[PyTorch][chapter 63][强化学习-QLearning]

前言:

       这里结合走迷宫的例子,重点学习一下QLearning迭代更新算法

      0,1,2,3,4 是房间,之间绿色的是代表可以走过去。

5为出口

   可以用下图表示


目录:

  1.      策略评估
  2.      策略改进
  3.      迭代算法
  4.      走迷宫实现Python

一  策略评估

         

          强化学习最终是为了学习好的策略\pi,在不同的state 下面根据策略\pi做出最优的action.

对于策略评估我们通过价值函数来度量.

      1.1 状态值函数  V

          T步累积奖赏:      V_{T}^{\pi}(s)=E_{\pi}[\frac{1}{T}\sum_{t=1}^{T}r_t|s_0=s],

          \gamma折扣累积奖赏:  V_{\gamma}^{\pi}(s)=E_{\pi}[\sum_{t=0}^{\infty }\gamma^tr_{t+1}|s_0=s]

     1.2 状态-动作值函数 Q

           T步累积奖赏:      Q_{T}^{\pi}(s,a)=E_{\pi}[\frac{1}{T}\sum_{t=1}^{T}r_t|s_0=s,a_0=a],

          \gamma折扣累积奖赏:  V_{\gamma}^{\pi}(s,a)=E_{\pi}[\sum_{t=0}^{\infty }\gamma^tr_{t+1}|s_0=s,a_0=a]

       1.3   Bellan 等式展开

              状态值函数  V 

               V_{T}^{\pi}(s)=\sum_{a \in A} \pi(s,a) \sum_{s^{'} \in S}P_{s\rightarrow s^{'}}^a(\frac{1}{T}R_{s \rightarrow s^{'}}^{a}+\frac{T-1}{T}V_{T-1}^{\pi}(s^{'}))

                V_{\gamma}^{\pi}(s)=\sum_{a \in A} \pi(s,a) \sum_{s^{'} \in S}P_{s\rightarrow s^{'}}^a(R_{s \rightarrow s^{'}}^{a}+\gamma V_{\gamma}^{\pi}(s^{'}))

               状态-动作函数Q

              Q_{T}^{\pi}(s,a)=\sum_{s^{'} \in S}P_{s\rightarrow s^{'}}^a(\frac{1}{T}R_{s \rightarrow s^{'}}^{a}+\frac{T-1}{T}V_{T-1}^{\pi}(s^{'}))

              Q_{\gamma}^{\pi}(s,a)=\sum_{s^{'} \in S}P_{s\rightarrow s^{'}}^a(R_{s \rightarrow s^{'}}^{a}+\gamma V_{\gamma}^{\pi}(s^{'}))


二   策略改进

        强化学习的目的: 尝试各种策略\pi,找到值函数最大的策略(累积奖赏)

         \pi^{*}= argmax_{\pi} \sum_{s \in S} V^{\pi}(s)

       2.1 最优策略值函数

             \forall s \in S :  v^{*}(s)=V^{\pi^{*}}(s)

         由于最优值函数的累积奖赏已经达到最大值,因此可以对Bellman 等式做个改动,即对动作求和改为最优

            V_{T}^{*}(s)=max_{a\in A} \sum_{s^{'} \in S}P_{s\rightarrow s^{'}}^a(\frac{1}{T}R_{s \rightarrow s^{'}}^{a}+\frac{T-1}{T}V_{T-1}^{*}(s^{'})) ..1

             V_{\gamma}^{*}(s)=max_{a\in A}\sum_{s^{'} \in S}P_{s\rightarrow s^{'}}^a(R_{s \rightarrow s^{'}}^{a}+\gamma V_{\gamma}^{\pi}(s^{'}))...2

           则 

                  V^{*}(s)= max_{a \in A} Q^{\pi^{*}}(s,a)...3 

             最优 状态-动作 Bellman 等式为:

          

              Q_{T}^{*}(s,a)= \sum_{s^{'} \in S}P_{s\rightarrow s^{'}}^a(\frac{1}{T}R_{s \rightarrow s^{'}}^{a}+\frac{T-1}{T} max_{a^{'} \in A}Q_{T-1}^{*}(s^{'},a^{'})) 

              V_{\gamma}^{*}(s,a)=\sum_{s^{'} \in S}P_{s\rightarrow s^{'}}^a(R_{s \rightarrow s^{'}}^{a}+\gamma max_{a^{'} \in A}Q_{\gamma}^{*}(s^{'},a^{'}))


三    递推改进方式

             原始策略为 \pi

             改进后策略  \pi^{'}

            改变动作的条件为: V^{\pi}(s) \leq Q^{\pi}(s,\pi^{'}(s))

             V^{\pi}(s) \leq Q^{\pi}(s,\pi^{'}(s))

                          

                       =\sum_{s^{'} \in S}P_{s\rightarrow s^{'}}^{\pi^{'}(s)}(R_{s \rightarrow s^{'}}^{\pi^{'}(s)}+\gamma V^{\pi}(s^{'}))

                      \leq \sum_{s^{'} \in S}P_{s\rightarrow s^{'}}^{\pi^{'}(s)}(R_{s \rightarrow s^{'}}^{\pi^{'}(s)}+\gamma Q^{\pi}(s^{'},\pi^{'}(s^{'})))

                       ...

                      =V^{\pi^{'}}(s)


四  值迭代算法

      

     4.1  环境变量

        Reward 和  QTable 都是矩阵

     

   4.2 迭代过程

    当state 为1,Q 函数更新过程

   

5.3 收敛结果


五    走迷宫实现Python
reward 我们用一个矩阵表示:

 行代表: state

 列代表: action

 值代表: reward

5.1 Environment.py 实现环境功能

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 15 11:12:13 2023@author: chengxf2
"""import numpy as np
from enum  import Enum#print(Weekday.test.value) 房间
class Room(Enum):room1 = 1room2 = 2room3 = 3room4 = 4room5 = 5class Environment():def action_name(self, action):if action ==0:name = "左"elif action ==1:name = "上"elif action ==2:name = "右"else:name = "上"return namedef __init__(self):self.R =np.array([ [-1, -1, -1, -1,  0, -1],[-1, -1, -1,  0, -1, 100],[-1, -1, -1,  0, -1, -1],[-1,  0,  0, -1,  0, -1],[0,  -1, -1,  0, -1, 100],[-1,  0, -1, -1,  0, 100]])def step(self, state, action):#即使奖励: 在state, 执行action, 转移新的 next_state,得到的即使奖励#print("\n step ",state, action)reward = self.R[state, action]next_state = action# action 网哪个房间走if action == Room.room5.value:done = Trueelse:done = Falsereturn  next_state, reward,done

5.1 main.py 实现Agent 功能

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 15 11:29:14 2023@author: chengxf2
"""# -*- coding: utf-8 -*-
"""
Created on Mon Nov 13 09:39:37 2023@author: chengxf2
"""import numpy as npdef init_state(WORLD_SIZE):S =[]for i in range(WORLD_SIZE):for j in range(WORLD_SIZE):state =[i,j]S.append(state) print(S)# -*- coding: utf-8 -*-
"""
Created on Fri Nov 10 16:48:16 2023@author: chengxf2
"""import numpy as np
from environment  import Environmentclass Agent():def __init__(self,env):self.discount_factor = 0.8 #折扣率self.theta = 1e-3 #最大偏差self.nS = 6 #状态 个数self.nA=  6  #动作个数self.Q = np.zeros((6,6))self.env = envself.episode = 500#当前处于的位置,V 累积奖赏def one_step_lookahead(self,env, state, action):#print("\n state :",state, "\t action ",action)next_state, reward,done = env.step(state, action)maxQ_sa = max(self.Q[next_state,:])return next_state, reward, done,maxQ_sadef value_iteration(self, env, state, discount_factor =1.0):#随机选择一个action,但是不能为-1indices = np.where(env.R[state] >-1)[0]action =  np.random.choice(indices,1)[0]#print("\n state :",state, "\t action ",action)next_state, reward, done,maxQ_sa = self.one_step_lookahead(env, state, action)#更新当前的Q值r  = reward + self.discount_factor*maxQ_saself.Q[state,action] = int(r)#未达到目标状态,走到房间5, 执行下一次迭代if done == False:self.value_iteration(env, next_state)def learn(self):for n in range(self.episode): #最大迭代次数#随机选择一个状态state = np.random.randint(0,self.nS)#必须达到目标状态,跳转到出口房间5self.value_iteration(env, state, discount_factor= self.discount_factor)#print("\n n ",n)print(self.Q)if __name__ == "__main__":env = Environment()agent =Agent(env)agent.learn()



参考:

 8-QLearning基本原理_哔哩哔哩_bilibili

9-QLearning迭代计算实例_哔哩哔哩_bilibili

10-QLearning效果演示_哔哩哔哩_bilibili

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

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

相关文章

【网络奇遇记】那年我与计算机网络的初相识 —— 网络的体系结构

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. 常见的三种计算机网络体系结构1.1 开放系统互连参考模型1.2 TCP/IP参考模型1.3 原理参考模型 二…

golang学习笔记——斐波纳契数列

斐波纳契数列 编写一个程序来计算某个数字的斐波纳契数列。 斐波那契数列是一个数字列表,其中每个数字是前两个斐波那契数字之和。 例如,数字 6 的序列是 1,1,2,3,5,8,数字 7 的序列是 1,1,2,3,5,8,13,数字 8 的序列是 1,1,2,3,5…

【机器学习7】优化算法

1 有监督学习的损失函数 1.1 分类问题 对二分类问题, Y{1,−1}, 我们希望sign f(xi,θ)yi, 最自然的损失函数是0-1损失, 函数定义特点0-1损失函数非凸、非光滑,很难直接对该函数进行优化Hinge损失函数当fy≥1时&…

leetcode刷题日记:141. Linked List Cycle(环形链表)

这一题是给我们一个链表让我们判断这是否是一个环形链表,我们知道如果一个链表中有环的话这一个链表是没有办法访问到尾的, 假若有如图所示的带环链表: 我们从图示中很容易看出来这一个链表在访问的时候会在里面转圈,我们再来看看…

群晖Docker(Container Manager)中安装Home Assistant Container

群晖Docker(Container Manager)中安装Home Assistant Container 不要使用 套件里面的 Home Assistant,不利于后期拓展 方式一: docker run -d --name"home-assistant-1" -v /volume1/docker/homeassistant/config:/c…

前端实现页面内容的截图与下载(html2canvas)

今天是一个发文的好日子😀~ 👇👇👇 一个需求,要截取页面中的内容并截图保存,来看一看我是怎么实现的吧: 这里需要使用到插件--html2canvas 1.安装并引入html2canvas npm install html2canv…

分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测

分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测 目录 分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO…

Skywalking流程分析_8(拦截器插件的加载)

前言 在之前的文章中我们将,静态方法、构造方法、实例方法的增强逻辑都分析完毕,但在增强前,对于拦截类的加载是至关重要的,下面我们就来详细的分析 增强插件的加载 静态方法增强前的加载 //clazz 要修改的字节码的原生类 Sta…

【运维】-- 在线网络工具

1、https://ping.pe/ 一个免费的在线网络工具,可以帮助您检测和分析IP地址的连接情况。 这是搬瓦工官方做的一个 ping 在线测试网站工具。比较适合测试短时间的 ping 统计,并且在网页上以图表形式统计显示出来。 PS: a、丢包会以红色显示出…

C语言调用【Python3】

一、搭建编译环境 终端查询系统及软件版本dpkg -l 列出所有已安装的软件包 二、C语言中调用Python 使用 GCC编译并链接 Python 3.10 的共享库如何在C中获取和修改 sys.path 三、C语言调用无参python函数 四、C语言调用有参python函数 一、搭建编译环境 通过C语言调用Pyth…

【MySQL】事务(中)

文章目录 事务异常与产出结论手动提交 和自动提交 对 回滚的区别 事务隔离性理论如何理解隔离性?MySQL的隔离级别事务隔离级别的查看设置隔离级别 事务异常与产出结论 在没有启动事务之前,account表中存在孙权和刘备的数据 在启动事务后, 向 …

PyTorch - 高效快速配置 Conda + PyTorch 环境 (解决 segment fault )

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/134463035 在配置算法项目时,因网络下载速度的原因,导致默认的 conda 与 pytorch 包安装缓慢,需要配置新的 co…

html实现图片裁剪处理(附源码)

文章目录 1.设计来源1.1 主界面1.2 裁剪界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134455169 html实现图片裁剪处理(附源码),支持图片放大缩小&#…

keil和proteus联动要点

一、keil与proteus如何进行联动? 1.先安装vdmagdi.exe,这是驱动 2.要保证keil工程编译通过,左上角红色图标进行编译,黑色框图标进行链接。 3.生成hex文件 先点击这个图标 按照顺序点击,生成HEX文件。 4.在打开的prot…

【Mysql】学习笔记

目录 基本操作登录指令:启动、关闭、重启mysql指令(适用于centos7):查看mysql运行状态:删除和创建表 修改密码(ubuntu18.04可行,其余版本行不行不知道)3 使用MYSQL了解数据库和表 4 …

Zookeeper学习笔记(1)—— 基础知识

Zookeeper概述 Zookeeper 是一个开源的分布式的,为分布式框架提供协调服务的 Apache 项目 工作机制 Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受…

MXNet中图解稀疏矩阵(Sparse Matrix)的压缩与还原

1、概述 对于稀疏矩阵的解释,就是当矩阵里面零元素远远多于非零元素,且非零元素没有规律,这样的矩阵就叫做稀疏矩阵,反过来就是稠密矩阵,其中非零元素的数量与所有元素的比值叫做稠密度,一般稠密度小于0.0…

springboot集成xxl-job详解

文章目录 springboot集成xxl-job详解1、springboot集成xxl-job:(1)pom文件里引入xxl-job依赖(2)application.properties配置文件:(3)在你的项目里新建文件结构如下:XxlJo…

洛谷 P3131 [USACO16JAN] Subsequences Summing to Sevens S

被普及-卡的没思路真是蒟蒻啊233 优化思路 每次都在枚举(a[r]-a[l-1])%70,所以可以认为数组大小对最终答案没有影响,考虑对前缀和数组取模,那么如果有a[r]的值等于a[l-1]的值相等(即余数相等),那么两者相减…

进程控制3——进程程序替换

进程的创建有fork,进程的退出有main函数的return,exit,_exit函数 而进程的退出中,一个进程的退出只能有三种情况,退出成功结果对/不对,或者是运行异常收到信号终止 但是我们发现我们用代码创建的子进程它是…