[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 = 1
      room2 = 2
      room3 = 3
      room4 = 4
      room5 = 5
      
      



class Environment():
    
    def action_name(self, action):
        
        if action ==0:
            name = "左"
        elif action ==1:
            name = "上"
        elif action ==2:
            name = "右"
        else:
            name = "上"
        return name
    
    def __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 = True
        else:
            done = False
        
    
        return  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 np

def 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 Environment


class 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 = env
        self.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_sa
        

    
    def value_iteration(self, env, state, discount_factor =1.0):
        
         #随机选择一个action,但是不能为-1
         
         indices = 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_sa
         
         self.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)
            
            #必须达到目标状态,跳转到出口房间5
            self.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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法通关村——数组中第K大的数字

数组中第K大的数字 1、题目描述 ​ LeetCode215. 数组中的第K个最大元素。给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。 示例1: 输入&#…

LLM prompt提示工程调试方法经验技巧汇总

现在接到一个LLM模型任务,第一反应就是能不能通过精调prompt来实现,因为使用prompt不需要训练模型,只需输入指令就可以实现和LLM的交互。按照以往经验,不同的prompt对模型输出影响非常大,如果能构造一个好的prompt&…

【23真题】厉害,这套竟有150分满分!

今天分享的是23年中国海洋大学946的信号与系统试题及解析。 本套试卷难度分析:22年中国海洋大学946考研真题,我也发布过,若有需要,戳这里自取!平均分为109-120分,最高分为150分满分!本套试题内容难度中等&…

【vue】 实现 自定义 Calendar 日历

图例&#xff1a;自定义日历 一、标签自定义处理 <div class"date-box"><el-calendar v-model"state.currDate" ref"calendar"><template #header"{ date }"><div class"date-head flex"><div …

Golang获取月份的第一天和最后一天

package mainimport ("fmt""strconv""strings""time" )func main() {month : "2023-11"result : GetMonthStartAndEnd(month)fmt.Println(result["start"] " - " result["end"]) }// 获取月…

图形化探索:快速改造单实例为双主、MGR、读写分离等架

单机GreatSQL/MySQL调整架构为多副本复制的好处有哪些&#xff1f;为什么要调整&#xff1f; 性能优化&#xff1a;如果单个GreatSQL服务器的处理能力达到瓶颈&#xff0c;可能需要通过主从复制、双主复制或MGR&#xff0c;以及其他高可用方案等来提高整体性能。通过将读请求分…

zabbix的服务器端 server端安装部署

zabbix的服务器端 server 主机iplocalhost&#xff08;centos 7&#xff09;192.168.10.128 zabbix官网部署教程 但是不全&#xff0c;建议搭配这篇文章一起看 zabbixAgent部署 安装mysql 所有配置信息和Zabbix收集到的数据都被存储在数据库中。 下载对应的yum源 yum ins…

【Linux】非堵塞轮询

堵塞轮询&#xff1a; 堵塞轮询是我们最简单的一种等待方式也是最常应用的等待方式。 但是&#xff0c;一旦阻塞等待也就意味着我们当前在进行等待的时候&#xff0c;父进程什么都干不了。 非堵塞轮询&#xff1a; 其中非阻塞等待&#xff0c;是等待的一种模式&#xff0c; 在…

如何使用Imagewheel+内网穿透搭建私人图床实现公网访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

【淘宝API】商品详情+搜索商品列表接口

淘宝商品详情API接口可以使用淘宝开放平台提供的SDK或API来获取。这些接口可以用于获取商品的详细信息&#xff0c;如标题、价格、描述、图片等。 以下是使用淘宝开放平台API获取商品详情的步骤&#xff1a; 注册淘宝开放平台账号&#xff0c;并创建应用&#xff0c;获取应用…

Sentinel 流控规则

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…

下一代VPN工具:体验TailScale的简便和高效

目录 一、概要VPN 是什么&#xff1f;TailScale 是什么 二、使用1、注册2、下载安装3、 Windows4、Linux5、 Android6、测试 三、Nginx整合Tailscale做端口转发 一、概要 VPN 是什么&#xff1f; 看到 VPN 第一反应应该是翻墙&#xff0c;但 VPN 最初应该也是最普遍的用途应该…

重生奇迹mu圣导师加点

重生奇迹mu圣导师加点&#xff1a;要攻击高可以加力量&#xff0c;平衡系建议加点力量600~800&#xff0c;智力200~400&#xff0c;敏够装备要求&#xff0c;统帅1000&#xff0c;其余加体力。 圣导师靠加力量培养高攻圣导师不现实&#xff0c;建议玩家练魔&#xff0c;低级圣…

win10关闭讲述人、粘滞键功能的快捷键启动

简单记录下在win10关闭讲述人、粘滞键快速启动的快捷键&#xff0c;这两个功能对正常人没什么用。误触发很烦。 禁用讲述人 按windows键&#xff0c;输入“轻松使用设置”&#xff0c;点“讲述人”&#xff0c;如下图取消讲述人开关和快捷键的勾选。 禁用粘滞键 按windows…

算法笔记-散列

算法笔记-散列 hash算法的思想整数出现的个数字符串出现个数整数是否出现整数出现的个数2字符是否出现字符串出现的个数2-sum-hash字符串出现的次数集合求交集合求并集合求差hash算法的思想 散列方法的主要思想是根据结点的关键码值来确定其存储地址 以关键码值K为自变量,通过…

电子学会C/C++编程等级考试2021年03月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:药房管理 随着信息技术的蓬勃发展,医疗信息化已经成为医院建设中必不可少的一部分。计算机可以很好地辅助医院管理医生信息、病人信息、药品信息等海量数据,使工作人员能够从这些机械的工作中解放出来,将更多精力投入真正的医…

【Java 进阶篇】JQuery 案例:优雅的隔行换色

在前端的设计中&#xff0c;页面的美观性是至关重要的。而其中一个简单而实用的设计技巧就是隔行换色。通过巧妙地使用 JQuery&#xff0c;我们可以轻松地实现这一效果&#xff0c;为网页增添一份优雅。本篇博客将详细解析 JQuery 隔行换色的实现原理和应用场景&#xff0c;让我…

测试员练就什么本领可以让自己狂揽10个offer

最近&#xff0c;以前的一个小徒弟又双叒叕跳槽了&#xff0c;也记不清他这是第几次跳槽了&#xff0c;不过从他开始做软件测试开始到现在已经有2-3年的工作经验了&#xff0c;从一开始的工资8K到现在的工资17K&#xff0c;不仅经验上积累的很多&#xff0c;财富上也实现了翻倍…

JS基础 查漏补缺

学习视频&#xff1a;黑马程序员 第五天——对象 方法和调用 数据行为性的信息称为方法&#xff0c;如跑步、唱歌等&#xff0c;一般是动词性的&#xff0c;其本质是函数。 方法是依附在对象上的函数 方法是由方法名和函数两部分构成&#xff0c;它们之间使用 : 分隔 方法是…

excel中用NORM.INV函数计算正态累积分布的逆

NORM.INV函数返回正态累积分布的逆。它的形式为NORM.INV(probability,mean,standard_dev)。 正态累积分布函数和正态概率密度函数互为逆。 参数说明&#xff1a; probability&#xff1a;对应正态分布的累积分布值。例如该值等于0.9&#xff0c;表示累积概率之和是0.9Mean&am…