【强化学习】常用算法之一 “SARSA”

news2024/11/16 8:40:44

 

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?type=blog个人简介:打工人。

持续分享:机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。

如发现文章有误,麻烦请指出,我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666@foxmail.com 

        强化学习是一种机器学习方法,通过与环境不断交互来学习最优行为策略。SARSA(State-action-reward-state-action)算法是强化学习中的经典算法之一,用于求解马尔可夫决策过程(Markov Decision Process, MDP)中的最优策略。本文将详细介绍SARSA算法的发展历程、算法原理、功能以及使用方法,并附带示例代码和运行结果。

本文将详细讲解强化学习常用算法之一“SARSA”


 

目录

一、简介

二、发展史

三、算法公式

1. SARSA算法公式

2. SARSA算法原理

四、算法功能

五、示例代码

六、总结


一、简介

        强化学习是一种通过学习与环境交互来最大化累积奖励的方法。在强化学习中,一个智能体在特定环境中根据当前状态选择一个动作,执行该动作后,环境将转移到新的状态,并且智能体将获得奖励。强化学习的目标是通过学习,使智能体能够选择一系列能够获取最大累积奖励的动作序列,即找到最优策略。SARSA算法是一种基于状态-动作值的强化学习算法,用来学习最优策略。

二、发展史

        SARSA算法最早由Richard Sutton和Andrew Barto在他们的著作《强化学习导论》中提出。SARSA是Q-learning算法的一种特例,也是一种基于值函数的算法。

        Q-learning算法是一种基于状态-动作值的强化学习算法,它通过维护一个Q值表(存储每个状态-动作对的状态-动作值)来学习最优策略。然而,Q-learning算法必须对Q值表进行离散化处理,因此只适用于状态空间和动作空间较小且离散的问题。为了解决这个问题,Richard Sutton等人提出了SARSA算法。

        SARSA算法是一种基于值函数和策略的算法,它不需要对状态空间和动作空间进行离散化处理,适用于连续状态和动作的问题。该算法使用一个Q值函数和一个策略函数来近似最优策略。

三、算法公式

1. SARSA算法公式

        SARSA算法的更新公式如下:

        其中,Q(s, a)表示在状态s下选择动作a的状态-动作值,r表示执行动作a后获得的即时奖励,α表示学习率,γ表示折扣因子,s’表示转移到的新状态,a’表示在新状态s’下选择的动作。 

2. SARSA算法原理

        SARSA算法的核心思想是通过不断更新状态-动作值函数Q(s, a)来学习最优策略。该算法按照以下步骤进行:

  • 初始化状态-动作值函数Q(s, a)和策略函数π(a|s)的值。
  • 在每个时间步t中,依据当前状态s和策略函数π选择一个动作a。
  • 执行动作a,观察获得的即时奖励r和新状态s’。
  • 根据新状态s’和策略函数π选择一个新动作a’。
  • 更新状态-动作值函数Q(s, a)的值,使用SARSA更新公式。
  • 将新状态s’和新动作a’作为下一步的状态s和动作a。
  • 重复上述步骤,直到达到终止条件。

        通过不断迭代更新状态-动作值函数Q(s, a),SARSA算法可以逐步逼近最优状态-动作值函数,从而得到最优策略。

四、算法功能

        SARSA算法具有以下功能:

  1. 模型无关性:SARSA算法不需要对环境模型进行假设,只通过与环境交互来学习最优策略。
  2. 收敛性:在一定条件下,SARSA算法保证会收敛到最优策略。
  3. 适用性:SARSA算法适用于状态空间和动作空间较大且连续的问题,而不需要对状态空间和动作空间进行离散化处理。

五、示例代码

import numpy as np

# 定义迷宫环境
maze = np.array([
    [0, 0, 0, 0],
    [0, -1, 0, -1],
    [0, 0, 0, -1],
    [-1, 0, 0, 1]
])

# 定义起始状态和终止状态
start_state = (3, 0)
goal_state = (3, 3)

# 定义动作空间
actions = [(0, 1), (0, -1), (-1, 0), (1, 0)]

# 初始化状态-动作值函数
Q = np.zeros((4, 4, 4))

# 定义参数
alpha = 0.1
gamma = 0.9
epsilon = 0.1
max_episodes = 100

# SARSA算法 
for episode in range(max_episodes):
    state = start_state
    action = np.random.choice(range(4)) if np.random.rand() < epsilon else np.argmax(Q[state])

    while state != goal_state:
        # next_state = (state[0] + actions[action][0], state[1] + actions[action][1])
        a = state[0] + actions[action][0]
        b = state[1] + actions[action][1]
        if a > 3:
            a-=1
        elif b > 3:
            b-=1
        elif a < -4:
            a+= 1
        elif b < -4:
            b+= 1
        next_state = (a,b)
        reward = maze[next_state]
        next_action = np.random.choice(range(4)) if np.random.rand() < epsilon else np.argmax(Q[next_state])
        Q[state][action] += alpha * (reward + gamma * Q[next_state][next_action] - Q[state][action])

        state = next_state
        action = next_action

# 输出结果
for i in range(4):
    for j in range(4):
        print("State:", (i, j))
        print("Up:", Q[i][j][0])
        print("Down:", Q[i][j][1])
        print("Left:", Q[i][j][2])
        print("Right:", Q[i][j][3])
        print()

        运行结果如下: 

State: (0, 0)
Up: -0.008042294056935573
Down: -0.007868742418369764
Left: -0.016173595452674966
Right: 0.006662566560762523

State: (0, 1)
Up: 0.048576025675988774
Down: -0.0035842473161881465
Left: 0.024420015715567546
Right: -0.46168987981312615

State: (0, 2)
Up: 0.04523751845081987
Down: 0.04266319340558091
Left: 0.044949583791193154
Right: 0.026234839551098416

State: (0, 3)
Up: 0.01629652821649763
Down: 0.050272192325180515
Left: -0.009916869922464355
Right: -0.4681667868865369

State: (1, 0)
Up: -0.09991342319696966
Down: 0.0
Left: 0.0
Right: 0.036699099068340166

State: (1, 1)
Up: 0.008563965102313987
Down: 0.0
Left: 0.0
Right: 0.3883250678150607

State: (1, 2)
Up: -0.3435187267522706
Down: -0.2554776873673874
Left: 0.05651543121932354
Right: 0.004593450910446022

State: (1, 3)
Up: -0.1
Down: -0.013616634831997914
Left: 0.01298827764814053
Right: 0.0

State: (2, 0)
Up: 0.28092113053540924
Down: 0.0
Left: 0.0024286388798406364
Right: 0.06302299434701504

State: (2, 1)
Up: 0.0
Down: 0.0
Left: -0.16509175606504775
Right: 1.9146361697676122

State: (2, 2)
Up: -0.1
Down: 0.0
Left: 0.03399106390140035
Right: 0.0

State: (2, 3)
Up: -0.3438668479533914
Down: 0.004696957810272524
Left: -0.19
Right: 0.0

State: (3, 0)
Up: 3.3060693607932445
Down: 0.8893977121867367
Left: 0.0
Right: 0.13715553550041798

State: (3, 1)
Up: 4.825854511712306
Down: -0.03438123168566812
Left: 0.10867882029322147
Right: 1.0015572397722665

State: (3, 2)
Up: 5.875704328143301
Down: 0.9315770230698863
Left: 0.0006851481810742227
Right: 0.47794799892127526

State: (3, 3)
Up: 5.4028951599661275
Down: 2.6989177956329757
Left: -0.6454474033238188
Right: 0.018474082554518417

        通过运行示例代码,我们可以得到每个状态下的最优动作及对应的状态-动作值。

六、总结

        本文详细介绍了强化学习中的SARSA算法,包括其发展历程、算法原理、功能以及使用方法,并给出了求解迷宫问题的示例代码。SARSA算法能够实现模型无关性和收敛性,适用于状态空间和动作空间较大且连续的问题。通过对状态-动作值函数的迭代更新,SARSA算法可以逐步逼近最优策略,并通过与环境交互来学习最优行为策略。

 

 

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

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

相关文章

飞控的安全性设计

针对安全性设计&#xff0c;就必须先考虑故障情况。一般来讲&#xff0c;飞控故障有以下几个方面&#xff1a; 1、通讯故障 飞行器与地面端&#xff08;遥控器或地面站等设备&#xff09;需要进行实时通信&#xff0c;如果通信发生故障&#xff0c;后果很严重&#xff0c;因此…

赛效:WPS文字(Word)中的页面背景如何删除

1&#xff1a;打开一个有背景颜色的文档。 2&#xff1a;在“页面布局”选项卡里点击“背景”&#xff0c;在下拉菜单里点击“删除页面背景”。 3&#xff1a;接下来我们看到&#xff0c;文档背景已经恢复了默认的颜色。 如果你想了解更多办公软件以及办公技巧&#xff0c;可以…

青大数据结构【2019】【五算法设计】

关键字: 简单选择排序、二叉树后序遍历 1) void Countsort(int A[],int B[],int n) {int i,j,count;for(i=0;i<n;i++){count=0;for(j=0;j<n;j++)if(A[j]<A[i])count++;B[count]=A[i];}} 2) 每个元素都要与n个元素(含自身)进行比较,故比较次数为n方 3) …

Redis之数据类型String、List、Hash、Set、Sorted Set(详细)

一、String数据类型 1、SET/GET/APPEND/STRLEN &#xff08;1&#xff09; APPEND &#xff08;2&#xff09; SET/STRLEN 2、 INCR/ DECR/INCRBY/DECRBY &#xff08;1&#xff09;INCR/ DECR &#xff08;2&#xff09; INCRBY/DECRBY INCRBY key increment&#xff1…

JavaWed第二章:HTML和CSS的知识制作静态网页

目录 前言 一.HTML和CSS的介绍 &#x1f496;HTML的基本框架 二.HTML常用标签大全 三.资源路径讲解 &#x1f496;路径 &#x1f496;图片 img标签讲解 &#x1f496;超链接标签讲解 四.CSS &#x1f496;CSS的引入方式 五.HTML页面布局 &#x1f496;盒子模型介绍 …

小米手机文件误删还有救,这10个工具请收好!

说到智能手机&#xff0c;小米以其令人印象深刻的功能和实惠的价格成为一个受欢迎的品牌。然而&#xff0c;与任何其他智能手机一样&#xff0c;小米设备上可能会由于各种原因而发生数据丢失。幸运的是&#xff0c;有多种恢复软件可以帮助您从小米设备中检索丢失或删除的数据。…

vue2 配置less

在vue2中配置less&#xff0c;需要安装less和less-loader npm install less less-loader5 --save-dev 直接安装less-loader会报错&#xff0c;提示如下&#xff1a; 安装less 3.0.0版本 npm install less3.3.0 然后在安装less-loader就ok啦。 在vue中使用&#xff0c;设置…

三维空间离散点如何拟合平面?

文章目录 0.引言1.算法原理2.算法实现 0.引言 在点云建模过程中&#xff0c;有时需要对扫描建模的点云进行标定&#xff0c;在实际使用中往往以地面做为参照平面&#xff0c;需要将扫描的三维空间点云进行拟合平面&#xff0c;以便纠正扫描结果。本文对三维空间离散点拟合平面算…

学习Vue3——watch(侦听器)

基本用法 watch有三个参数 第一个参数是监听源 第二个参数回调函数cb&#xff08;newVal,oldVal&#xff09; 第三个参数一个options配置项 监听单个属性 <template><div>姓:<input v-model"lastName" type"text" /></div><…

PostgreSQL 自增主键冲突问题分析及解决办法

创建一个test表 create table test (id integer default nextval(test_id_seq::regclass) not nullconstraint test_pkprimary key,c1 integer );插入数据 insert into test (c1) values (1); insert into test (c1) values (2); insert into test (c1) values (3);发现自增I…

自定义指令实现按钮加密

1. 需求描述 给按钮加一个密码保护&#xff0c;输入的密码正确之后才能进行下一步操作。 2. 实现思路 1. 直接在点击事件里面处理密码校验&#xff0c; <!-- template --> <el-button type"warning" click"handlePub">发布</el-button&…

Unity Android打包成Apk之后 紫屏 无内容

打包成Apk之后 打开游戏 过完logo是紫色的屏幕什么都没有 解决方法&#xff1a; 打开项目的目录&#xff1a; 删除除了 .vscode assets package 之外的所有文件夹 然后重新打开就可以了

【owt】发送侧接收并处理rtcp包 调用堆栈

发送测接收rtcp包并处理大神分析的RTCPReceiver处理的rtcp包 WebRTC源码之RTCPReceiver源码分析 可以看到xr是207MediaStream::read 中 通过 fb_sink_->deliverFeedback(std::move(packet)); 分发rtcp fbsink是 VideoFramePacketizer int VideoFramePacketizer::deliverFee…

HTML入门基础知识

一、简介 什么是HTML&#xff1f; HTML是用来描述网页的一种语言。它指的是超文本标记语言&#xff0c;是一种标记语言&#xff0c;是一套标记。标签HTML使用标记标签来描述网页 HTML基本结构如图&#xff1a; 二、基础内容 HTML的基本标签 HTML 标签 HTML 标记标签通常被称为…

Linux 的逻辑世界与 Windows 的复杂性

Linux的逻辑世界与Windows的复杂性 作为操作系统&#xff0c;Linux 和 Windows 都在全球用户心中赢得了一席之地。 这两种系统都很常用&#xff0c;每种都有不同的原因和目的。 作为一名有用的 AI 助手&#xff0c;我有机会广泛使用 Linux 和 Windows&#xff0c;并且我想探索…

rewrite实验示例

一、基于域名跳转 要求用户输入旧域名可以直接跳转到新域名 vim /usr/local/nginx/conf/nginx.conf systemctl restart nginx.service 查看元素可以看到返回301&#xff0c;实现了永久重定向跳转&#xff0c;而且域名后的参数也正常跳转 二、基于客户端 IP 访问跳转 要求除…

ncnn vulkan 以类的方式推理示例

ncnn vulkan 以类的方式推理示例 flyfish 环境 ncnn-android-vulkan.zip 20230517 opencv 4.6.0 开发环境Qt 6.2.4 模型 yolov5_62 构建套件 Clang arm64-v8a ndk 25 和api 28版本如下 头文件 #ifndef YOLOV5GPU_H #define YOLOV5GPU_H#include <string> #include &l…

C#调用Matlab--解决外部引用包问题(全网唯一)

1、好久没写文章了&#xff0c;今天给大家带来的是C#调用matlab程序的解决方案。 2、应用场景&#xff1a;C#调用matlab网上已经有很多文章了&#xff0c;但本文主要解决的是无法调用时的问题。 如当Matlab调用外部包&#xff08;CVX、IPOPT、gurobi、yalmip等优化求解器&…

STM32--DHT11温湿度传感器

本文介绍基于STM32F103实现的DHT11温湿度传感器数据采集及显示&#xff0c;完整代码见文末链接 一、DHT11传感器简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术&#xff0c;确保产品具有极高的可…

LabVIEW轿厢电梯控制系统

LabVIEW轿厢电梯控制系统 随着国民经济的快速发展&#xff0c;私家车不再是奢侈的商品&#xff0c;逐渐属于大众。大城市中越来越多的汽车对交通和环境造成了灾难性的影响&#xff0c;尤其是市中心遭受了损失。市中心拥堵和停车困难是两大交通问题。增加停车位以留出更多车辆是…