[PyTorch][chapter 62][强化学习-基本概念]

news2024/12/23 17:30:35

前言:

   目录: 

  1.    强化学习概念
  2.    马尔科夫决策
  3.    Bellman 方程
  4.     格子世界例子


一 强化学习

       强化学习 必须在尝试之后,才能发现哪些行为会导致奖励的最大化。
当前的行为可能不仅仅会影响即时奖赏,还有影响下一步奖赏和所有奖赏

强化学习五要素如下:

 1.2 强化学习流程

      

         1: 产生轨迹(trajectory)

         2: 策略评估(policy-evaluate)

         3: 策略提升(policy-improve)

     这里重点讲一下 产生轨迹:

      当前处于某个state 下面,

      按照策略选择 action =A_t= \pi(s_t)

     根据新的state 给出 reward:R_{t+1}=f(s_{t+1})

  最后产生了轨迹链


二 马尔科夫决策

  2.1 马尔科夫决策要求:

    1: 能够检测到理想的状态
    2: 可以多次尝试
    3: 系统的下个状态只与当前信息有关,与更早的状态无关。
决策过程中还可和当前采取的动作有关.

 

2.2  马尔科夫决策五要素

     S:  状态集合 states
     A:  动作集合 actions
     P: 状态转移概率 P_{S_t \to s_{t+1}}^a
     R: 奖励函数(reward function) ,agent 采取某个动作后的及时奖励
     r:  折扣系数意味当下的reward 比未来反馈更重要

          \sum_{t=0}^{\infty }r^t R(s_t)

         r \in (0,1]

2.3   主要流程

       1: Agent 处于状态s_0

       2: 按照策略 选择动作 a_0

       3:执行该动作后,有一定的概率转移到新的状态 p_{s_0\rightarrow s_1}^a

2.4  价值函数

       V(s)=E_{\pi}(\sum_{t=1}^{T} r_t|S_0=s)

       当前时刻处于状态s,未来获得期望的累积奖赏

        分为两种: state 价值函数  state-action 价值函数

        最优价值函数:

                   不同策略下, 累积奖赏最大的  v_{*}=max_{\pi}v_{\pi}(x)

  2.5 策略 policy

       当前状态s 下,按照策略,要采用的动作

        action=\pi(s)


三  Bellman 方程

  

   4.1  状态值函数为:

           V_{T}^{\pi}(x)=E_{\pi}[\frac{1}{T}\sum_{t=1}^Tr_t|x_0=x]: T 步累积奖赏

           V_{\gamma}^{T}(x)=E_{\pi}[\frac{1}{T}\sum_{t=0}^T \gamma^tr_{t+1}|x_0=x] :\gamma 折扣累积奖赏,\gamma \in (0,1]

   4.2 Bellman 方程

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

         证明:

                V_{T}^{\pi}(x)=E_{\pi}[\frac{1}{T}\sum_{t=1}^T r_t|x_0=x]   

                            =E_{\pi}[\frac{1}{T}r_1+\frac{T-1}{T}\frac{1}{T-1}\sum_{t=2}^T r_t|x_0=x]

                           =\sum_{a \in A} \pi(x,a) \sum _{x^{'} \in X}P_{x\rightarrow x^{'}}^a (\frac{1}{T}R_{x\rightarrow x^{'}}^{a}+\frac{T-1}{T}E_{\pi}[\frac{1}{T-1}\sum_{t=1}^{T-1}r_t|x_0=x^{'}])

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

         r折扣奖赏bellman 方程

               V_{\gamma}^{\pi}(x)=\sum_{a \in A}\sum_{x^{'} \in X} P_{x\rightarrow x^{'}}^a(R_{x\rightarrow x^{'}}^a+\gamma V_{r}^{\pi}(x'))


四  格子世界例子

     在某个格子,执行上下左右步骤,其中步骤最短的

为最优路径

5.1:gridword.py

   

import numpy as np

#手动输入格子的大小
WORLD_SIZE = 4
START_POS = [0,0]
END_POS = [WORLD_SIZE-1, WORLD_SIZE-1]
prob = 1.0
#折扣因子
DISCOUNT = 0.9
# 动作集={上,下,左,右}
ACTIONS = [np.array([0, -1]),    #left
             np.array([-1, 0]),  # up
             np.array([0, 1]),   # right
             np.array([1, 0])]   # down

class GridwordEnv():
    
    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.nA = 4 #action:上下左右
         self.nS = 16 #state: 16个状态
         self.S = []
         for i in range(WORLD_SIZE):
             for j in range(WORLD_SIZE):
                 state =[i,j]
                 self.S.append(state)
    
    def step(self, s, a):
        
        action = ACTIONS[a]
        state = self.S[s]
        done = False
        reward = 0.0
        
        next_state = (np.array(state) + action).tolist()
        
        if (next_state == START_POS) or (state == START_POS):
            
            next_state =  START_POS
            done = True
     
        elif (next_state == END_POS) or (state == START_POS):
            
            next_state =  END_POS
            done = True
            
        else:
            

            x, y = next_state
            # 判断是否出界
            if x < 0 or x >= WORLD_SIZE or y < 0 or y >= WORLD_SIZE:
                reward = -1.0
                next_state = state
            else:
                reward = -1.0
    
        return prob, next_state, reward,done

5.2 main.py 

# -*- 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
import sys
from gym.envs.toy_text import discrete  #环境
from enum import Enum
from gridworld import GridwordEnv


class Agent():
    
    def __init__(self,env):
        self.discount_factor = 1.0 #折扣率
        self.theta = 1e-3 #最大偏差
        self.S = []
        self.env = env
       
        
    
    
    #当前处于的位置,V 累积奖赏
    def one_step_lookahead(self,s, v):
        

        R = np.zeros((env.nA)) #不同action的累积奖赏
        
        for action in range(env.nA):
          
            prob, next_state,reward, done = env.step(s, action) #只有一个
            
            next_state_index = self.env.S.index(next_state)
            #print("\n state",s ,"\t action ",action, "\t new_state ", next_state,"\t next_state_index ", next_state_index,"\t r: ",reward)
            
            r=  prob*(reward + self.discount_factor*v[next_state_index])
 
            R[action] +=r
                
        #print("\n state ",s, "\t",R)        
        return R
                
    
    def value_iteration(self, env, theta= 1e-3, discount_factor =1.0):
        
        
        v = np.zeros((env.nS)) #不同状态下面的累积奖赏,16个状态
        iterNum = 0
        
        while True:
            
            delta = 0.0
            for s in range(env.nS):
 
                R = self.one_step_lookahead(s,v)#在4个方向上面得到的累积奖赏
                
                best_action_value = np.max(R)
                #print("\n state ",s, "\t R ",R, "\t best_action_value ",best_action_value)
                
                bias = max(delta, np.abs(best_action_value-v[s]))
                v[s] =best_action_value
                #if (s+1)%4 == 0:
                    #print("\n -----s ------------",s)
                
            iterNum +=1
            
            if bias<theta:
                    break
               
            
        print("\n 迭代次数 ",iterNum)
        return v
            
        
         
    def learn(self):

        policy = np.zeros((env.nS,env.nA))
   
        v = self.value_iteration(self.env, self.theta, self.discount_factor)
        
        for s in range(env.nS):
            
            R =  self.one_step_lookahead(s,v)
            best_action=  np.argmax(R)
            
            #print(s,best_action_value )
            policy[s,best_action] = 1.0
        return policy,v
            
if __name__ == "__main__":
    env = GridwordEnv()
    agent =Agent(env)
    policy ,v = agent.learn()
    
    
    for s in range(env.nS):
        
        action = np.argmax(policy[s])
        act_name = env.action_name(action)
        print("\n state ",s, "\t action ",act_name, "\t 累积奖赏 ",v[s])
        
 
    




    
    

参考:

【强化学习玩游戏】1小时竟然就学会了强化学习dqn算法原理及实战(人工智能自动驾驶/深度强化学习/强化学习算法/强化学习入门/多智能体强化学习)_哔哩哔哩_bilibili

2-强化学习基本概念_哔哩哔哩_bilibili

3-马尔科夫决策过程_哔哩哔哩_bilibili

4-Bellman方程_哔哩哔哩_bilibili

5-值迭代求解_哔哩哔哩_bilibili

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

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

相关文章

如何应对招聘中的职业性格测评?

很多同学听说要做性格测试&#xff0c;第一反应是如何让自己的性格让HR看起来更好....没办法为了顺利入职&#xff0c;咱不能老实作答&#xff0c;因为性格测评搞不好是真刷人的&#xff0c;刷人的&#xff08;无视你的专业能力和笔试成绩&#xff09;..... 可是....很多性格测…

eNSP-打开华为USG6000V1防火墙web管理页面方法

一、本地打开防火墙web管理页面 1.先在ensp中启动USG6000V1防火墙&#xff0c;启动后&#xff0c;需要输入原始username和password&#xff08;username&#xff1a;admin&#xff0c;password&#xff1a;Admin123&#xff09;&#xff0c;并修改原始密码后&#xff0c;才能配…

SQL学习(CTFhub)整数型注入,字符型注入,报错注入 -----手工注入+ sqlmap注入

目录 整数型注入 手工注入 为什么要将1设置为-1呢&#xff1f; sqlmap注入 sqlmap注入步骤&#xff1a; 字符型注入 手工注入 sqlmap注入 报错注入 手工注入 sqlmap注入 整数型注入 手工注入 先输入1 接着尝试2&#xff0c;3&#xff0c;2有回显&#xff0c;而3没有回显…

做一个springboot用户信息模块

目录 用户信息部分 1、获取用户详细信息 前言 代码分析 代码实现 测试 2、更新用户信息 前言 代码实现 测试 3、更新用户头像 前言 代码实现 测试 4、更新用户密码 前言 代码实现 测试 用户信息部分 1、获取用户详细信息 前言 承接上一篇博客登录注册功能…

快速批量去除文件夹名称中多余重复文字!一键轻松优化文件夹命名!

您是否曾经因为文件夹名称中多余重复文字而烦恼&#xff1f;是否因为文件夹重命名而浪费大量时间&#xff1f;现在&#xff0c;我们为您推荐一款全新的文件夹批量改名工具——快速批量去除文件夹名称中多余重复文字&#xff0c;轻松实现文件夹改名优化&#xff0c;让您的整理效…

Leetcode_2:两数相加

题目描述&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff…

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用

最终的目标是刷入firefly的3399的镜像&#xff0c;同时更新内核到linux5.10版本&#xff08;4.4的内核应该是相同的方法&#xff0c;我目前没有去折腾&#xff0c;暂时不用了&#xff09;。 1. 平台&#xff1a; rk3399 am40 4g32g 2. 内核&#xff1a;暂无 3. 交叉编译工…

数据结构----顺序栈的操作

1.顺序栈的存储结构 typedef int SElemType; typedef int Status; typedef struct{SElemType *top,*base;//定义栈顶和栈底指针int stacksize;//定义栈的容量 }SqStack; 2.初始化栈 Status InitStack(SqStack &S){//初始化一个空栈S.basenew SElemType[MAXSIZE];//为顺序…

macOS文本编辑器 BBEdit 最新 for mac

BBEdit是一款功能强大的文本编辑器&#xff0c;适用于Mac操作系统。它由Bare Bones Software开发&#xff0c;旨在为开发者和写作人员提供专业级的文本编辑工具。 以下是BBEdit的一些主要特点和功能&#xff1a; 多语言支持&#xff1a;BBEdit支持多种编程语言和标记语言&…

jstack java堆栈跟踪工具

jstack java堆栈跟踪工具 1、jstack介绍 jstack&#xff08;stack trace for java&#xff09;是java虚拟机自带的一种堆栈跟踪工具。 jstack主要用于生成java虚拟机当前时刻的线程快照&#xff0c;线程快照是当前java虚拟机内每一条线程正在执行的方法 堆栈的集合&#xf…

信息安全工程师软考知识点

文章目录 知识点总结2023软考总结选择题问答题 知识点总结 军用不对外公开的信息系统安全等级至少应该>三级 数据中心的耐火等级不应低于二级 政府网站的信息安全等级原则上不应低于二级第一代交换机以集线器为代表&#xff0c;工作在OSI物理层 第二代交换机以太网交换机&a…

关于论文图表目录和交叉引用的使用小结

目录 1 题注用法 2 交叉引用 最近在写论文&#xff0c;遇到不少Word使用的问题(错误&#xff01;文档中没有指定样式的文字。) 网上其实也有很多解决方案但我当时还是折腾了几个小时才整出来图目录&#xff0c;以下是针对我目前使用的感觉简明很多的方法。 1 题注用法 1) 假…

Selenium+JQuery定位方法及应用

SeleniumJQuery定位方法及应用 1 JQuery定位说明1.1 JQuery定位方法1.2 JQuery最常用的三个操作1.3 JQuery一个示例1.3.1 用户名输入框1.3.2 密码输入框1.3.3 登陆按钮1.3.4 完整代码 2 JQuery选择器2.1 常用选择器列表2.2 思考 1、关于Selenium提供了很多元素定位方法&#xf…

解决计算中msvcp120.dll丢失问题,总结5个有效的方法

msvcp120.dll是Microsoft Visual C 2013 Redistributable中的一个动态链接库文件&#xff0c;它提供了许多重要的函数和类&#xff0c;用于支持各种应用程序的正常运行。当这个文件丢失或损坏时&#xff0c;可能会导致一些应用程序无法启动或运行错误。 msvcp120.dll的属性 文件…

ssm826基于ssm的电影评论系统+vue

ssm826基于ssm的电影评论系统vue 交流学习 ​​​​​​​ 演示 项目功能演示&#xff1a; ————————————————

【数据分享】我国雏鹰企业数据(excel格式\shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平&#xff01;比如一个城市的金融企业较多&#xff0c;那这个城市的金融产业肯定比较发达&#xff1b;一个城市的制造业企业较多&#xff0c;那这个城市的制造业肯定比较发达。 本次我们为大家带来的…

MSVCP140_1.dll,是什么意思?msvcp140_1.dll丢失的解决方法分享

今天我在打开电脑一款软件时候&#xff0c;突然提示‘’msvcp140_1.dll丢失‘’我不知道怎么办&#xff0c;经过我几天的努力终于找到msvcp140_1.dll文件的解决方法&#xff0c;也成功解决这个问题&#xff0c;解决了我的困扰&#xff0c;也成功找到msvcp140_1.dll为什么会丢失…

关于企业海外Social平台营销布局,你需要了解这三件事

01 企业Social营销布局模式 Social营销走到现在&#xff0c;早已进入了标准配置期。任何企业和组织&#xff0c;进行营销宣传的时候都会在社媒社交平台上创建账号和运营。目前&#xff0c;海外Social平台营销模式基本分为四类&#xff1a; 官方社媒账号运营&#xff1a;以Hoot…

自我报错-----断言

断言 最近在阅读freertos源码时&#xff0c;经常在某些某些API函数中遇到assert&#xff08;断言&#xff09;&#xff0c;其实断言就是用来判断表达式是否成立&#xff0c;而进行自我报错&#xff0c;防止程序后续发生未知的错误&#xff0c;可以这么理解 if(条件true)//程序…

高通SDX12:ASoC 音频框架浅析

一、简介 ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。 本文基于高通SDX12平台,对ASoC框架做一个分析。 二、整体框架 1. 硬件层面 嵌入式Linux设备的Audio subsystem可以划分为Machine(板…