SARAS算法

news2024/12/24 18:20:25

SARAS算法

代码仓库:https://github.com/daiyizheng/DL/tree/master/09-rl

Sarsa算法是一种强化学习算法,用于解决马尔可夫决策过程(MDP)问题。它是一种基于值函数的方法,可以用于学习最优策略。本文将介绍Sarsa算法的流程。

SARSA算法流程


算法中各个参数的意义:

  • alpha是学习率, 来决定这次的误差有多少是要被学习的, alpha是一个小于1 的数.
  • gamma 是对未来 reward 的衰减值. 我们可以这样想象.
  • Q表示的是Q表格.
  • Epsilon greedy 是用在决策上的一种策略, 比如 epsilon = 0.9 时, 就说明有90% 的情况我会按照 Q 表的最优值选择行为, 10% 的时间使用随机选行为. 【这也是结合了强化学习中探索和利用的概念】

算法输入:迭代轮数 T T T,状态集 S S S, 动作集 A A A, 步长 α \alpha α,衰减因子 γ \gamma γ, 探索率 ϵ \epsilon ϵ,
输出:所有的状态和动作对应的价值 Q Q Q

  1. 随机初始化所有的状态和动作对应的价值 Q Q Q. 对于终止状态其 Q Q Q值初始化为0.
  2. for i from 1 to T,进行迭代。
    a) 初始化S为当前状态序列的第一个状态。设置 A A A ϵ − \epsilon- ϵ贪婪法在当前状态 S S S选择的动作。
    b) 在状态 S S S执行当前动作 A A A,得到新状态 S ′ S' S和奖励 R R R
    c) 用 ϵ − \epsilon- ϵ贪婪法在状态 S ′ S' S选择新的动作 A ′ A' A
    d) 更新价值函数 Q ( S , A ) Q(S,A) Q(S,A): Q ( S , A ) = Q ( S , A ) + α ( R + γ Q ( S ′ , A ′ ) − Q ( S , A ) ) Q(S,A) = Q(S,A) + \alpha(R+\gamma Q(S',A') - Q(S,A)) Q(S,A)=Q(S,A)+α(R+γQ(S,A)Q(S,A))
    e) S = S ′ , A = A ′ S=S', A=A' S=S,A=A
    f) 如果 S ′ S' S是终止状态,当前轮迭代完毕,否则转到步骤b)

这里有一个要注意的是,步长 α \alpha α一般需要随着迭代的进行逐渐变小,这样才能保证动作价值函数 Q Q Q可以收敛。当 Q Q Q收敛时,我们的策略 ϵ − \epsilon- ϵ贪婪法也就收敛了。

与SARSA相比,Q-learning具有以下优点和缺点:


其实两种算法区别就在于对下一个状态的动作价值的估计,Q学习基于目标策略选定的动作,估计了一个价值,但是行为策略并不一定会真的选取执行这个动作。而SARSA则说,我自己选取的动作,我就是死也要执行。从“对下一个状态的评估”这个角度来说,SARSA更加谨慎,因为他基于他当前的策略选择最好的动作来执行,而QLearning则更大胆一点,下一个动作不一定就是目标策略的最优动作,甚至可能是随表挑的动作。

Q-learning直接学习最优策略,而SARSA在探索时学会了近乎最优的策略。
Q-learning具有比SARSA更高的每样本方差,并且可能因此产生收敛问题。当通过Q-learning训练神经网络时,这会成为一个问题。
SARSA在接近收敛时,允许对探索性的行动进行可能的惩罚,而Q-learning会直接忽略,这使得SARSA算法更加保守。如果存在接近最佳路径的大量负面报酬的风险,Q-learning将倾向于在探索时触发奖励,而SARSA将倾向于避免危险的最佳路径并且仅在探索参数减少时慢慢学会使用它。

注意: Q学习的区别只在于target的计算方法不同
SARSA的target计算公式:
target = Q(next_state,next_action) * gamma + reward
Q学习的target计算公式:
target = max(Q(next_state)) * gamma + reward

代码

  1. 环境
import gym


#定义环境
class MyWrapper(gym.Wrapper):

    def __init__(self):
        #is_slippery控制会不会滑
        env = gym.make('FrozenLake-v1',
                       render_mode='rgb_array',
                       is_slippery=False)

        super().__init__(env)
        self.env = env

    def reset(self):
        state, _ = self.env.reset()
        return state

    def step(self, action):
        state, reward, terminated, truncated, info = self.env.step(action)
        over = terminated or truncated

        #走一步扣一份,逼迫机器人尽快结束游戏
        if not over:
            reward = -1

        #掉坑扣100分
        if over and reward == 0:
            reward = -100

        return state, reward, over

    #打印游戏图像
    def show(self):
        from matplotlib import pyplot as plt
        plt.figure(figsize=(3, 3))
        plt.imshow(self.env.render())
        plt.show()


env = MyWrapper()

env.reset()

env.show()
  1. Q动作价值函数
import numpy as np

#初始化Q表,定义了每个状态下每个动作的价值
Q = np.zeros((16, 4))

Q
  1. 单挑轨迹数据
from IPython import display
import random


#玩一局游戏并记录数据
def play(show=False):
    data = []
    reward_sum = 0

    state = env.reset()
    over = False
    while not over:
        action = Q[state].argmax()
        if random.random() < 0.1:
            action = env.action_space.sample()

        next_state, reward, over = env.step(action)

        data.append((state, action, reward, next_state, over))
        reward_sum += reward

        state = next_state

        if show:
            display.clear_output(wait=True)
            env.show()

    return data, reward_sum


play()[-1]
  1. 训练
#训练
def train():
    #共更新N轮数据
    for epoch in range(2000):

        #玩一局游戏并得到数据
        for (state, action, reward, next_state, over) in play()[0]:

            #Q矩阵当前估计的state下action的价值
            value = Q[state, action]

            #实际玩了之后得到的reward+(next_state,next_action)的价值*0.9
            target = reward + Q[next_state, Q[next_state].argmax()] * 0.9

            #value和target应该是相等的,说明Q矩阵的评估准确
            #如果有误差,则应该以target为准更新Q表,修正它的偏差
            #这就是TD误差,指评估值之间的偏差,以实际成分高的评估为准进行修正
            update = (target - value) * 0.02

            #更新Q表
            Q[state, action] += update

        if epoch % 100 == 0:
            print(epoch, play()[-1])


train()

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

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

相关文章

nginx 无法 停止

一、nginx正常停止命令 进入到nginx目录&#xff0c;然后执行 # 立即停止 nginx -s stop # 平滑停止 nginx -s quit 二、 如果你不小心启动了多次nginx.exe 那么通过任务管理器可以停止 三、如果 任务管理器无法停止 那么就在cmd命令中执行 netstat -ano //查看所以端口…

一文图解爬虫姊妹篇(spider)

—引导语 爬虫&#xff0c;没有一个时代比当前更重视它。一个好的爬虫似乎可以洞穿整个互联网&#xff0c;“来装满自己的胃”。 接上一篇&#xff1a;一文图解爬虫&#xff08;spider&#xff09; 博主已初步对爬虫的“五脏六腑”进行了解剖。虽然俗称“爬虫”&#xff0c;但窃…

【Python】Matplotlib(学习笔记)

一、Matplotlib概述 1、什么是Matplotlib 画二维图表的python库 2、Matplotlib图像结构 3、Matplotlib三层结构 容器层 > 画板层Canvas、画布层Figure、绘图区/坐标系&#xff08;x、y轴张成的区域&#xff09; 辅助显示层 图像层 二、基础绘图功能 1、模块导入 ma…

gin索引 btree索引 gist索引比较

创建例子数据 postgres# create table t_hash as select id,md5(id::text) from generate_series(1,5000000) as id; SELECT 5000000postgres# vacuum ANALYZE t_hash; VACUUMpostgres# \timing Timing is on. postgres# select * from t_hash limit 10;id | …

SAP 63策略测试简介

在之前的文章中我们又测试了60的策略,接下来我们测试一下63的策略,看看两者之间有什么区别。 首先我们先对比一下系统方面的配置 我们可以看到60策略和63策略中的独立需求的配置是一样的。只在客户需求配置方面有些区别,接下来就开始我们的测试 1、首先我们还是先创建物料…

K8S 集群搭建

1、搭建清单 2台linux服务器&#xff08;一个master节点&#xff0c;一个node节点&#xff09;&#xff0c;建议搭3台&#xff08;一个master&#xff0c;两个node&#xff09; 我使用的是腾讯云&#xff0c;节点与节点使用公网IP通信 确保2台服务器都安装了docker 2、服务…

道路交通仿真方案【SUMO + TraCI + Python】

“城市交通模拟”&#xff08;SUMO&#xff09;是一个开源、高度可移植、微观和连续的交通模拟包&#xff0c;旨在处理大型网络&#xff08;SUMO 文档&#xff09;。 TraCI 是“交通控制接口”模块的简称&#xff0c;它可以访问正在运行的道路交通模拟&#xff0c;以检索模拟对…

理疗养生服务预约小程序要如何做

不少人面对身体症状疼痛&#xff0c;往往不会选择去医院&#xff0c;而是去理疗养生馆&#xff0c;选择艾灸、拔罐、中药贴敷等方式治疗改善或减轻疼痛。随着人们对中医信赖度增强&#xff0c;理疗养生市场增长迅速。 而在增长的同时&#xff0c;我们也注意到理疗养生馆经营痛…

点燃初冬!中海达亮相第一届中国测绘地理信息大会

11月8日&#xff0c;第一届中国测绘地理信息大会在浙江德清国际展览中心拉开帷幕。中海达携“海陆空、室内外”产品以及解决方案亮相展会&#xff0c;受到了与会领导、业界同仁、行业用户的高度关注。 ▲第一届中国测绘地理信息大会开幕式现场 本届大会以“科技引领&#xff0c…

电商平台api接口对接电商数据平台,获取商品详情页面实时信息须知

随着互联网的发展和普及&#xff0c;电商平台已成为人们日常生活中不可或缺的一部分。而为了保证电商平台的正常运行&#xff0c;平台与开发者之间需要进行数据交互&#xff0c;这便涉及到了电商平台API接口对接的问题。本文将详细介绍电商平台API接口对接的须知事项。 一、了解…

【原创】java+swing+mysql车辆维修管理系统设计与实现

摘要&#xff1a; 车辆维修管理系统是一个用于管理和追踪车辆维修过程的系统&#xff0c;它能够提高效率&#xff0c;减少错误&#xff0c;并提供详细的车辆历史记录&#xff0c;可以帮助车辆维修企业实现信息化管理&#xff0c;提高工作效率和客户满意度&#xff0c;降低运营…

RabbitMQ 核心部分之简单模式和工作模式

文章目录 一、Hello World&#xff08;简单&#xff09;模式1.导入依赖2.消息生产者3.消息消费者 二、Work Queues&#xff08;工作&#xff09;模式1.抽取工具类2.启动两个工作线程3.启动一个发送线程4.结果 总结 一、Hello World&#xff08;简单&#xff09;模式 在下图中&…

东北水利水电杂志东北水利水电杂志社东北水利水电编辑部2023年第11期目录

规划设计 导流泄洪洞射流-旋流梯级内消能工竖井出口体型优化 李金宝; 1-371 粉细砂地层防洪结构新形式研究 李泽鑫; 4-6《东北水利水电》投稿&#xff1a;cnqikantg126.com 引绰济辽工程鱼道进鱼口位置选择 银佳男;于月鹏;张鹏; 7-82471 大藤峡水利枢纽工程长期…

CRM销售管理软件哪个好,如何选?(二)

书接上回&#xff0c;我们从软件功能和厂商实力为大家介绍了CRM销售管理软件哪个好&#xff1f;该如何选型的难题&#xff0c;除了以上两点还有那些不容忽视的要素呢&#xff1f; 灵活性 CRM销售管理软件是企业信息化建设的中心&#xff0c;需要和其它企业管理应用进行集成实…

Python使用Mechanize库完成自动化爬虫程序

Mechanize是一个Python第三方库&#xff0c;它可以模拟浏览器的行为&#xff0c;实现自动化的网页访问、表单填写、提交等操作。下面是一个使用Mechanize库编写的爬虫的例子&#xff0c;它可以爬取百度搜索结果页面的标题和链接&#xff1a; import mechanize from bs4 import …

将铜互连扩展到2nm的研究

晶体管尺寸在3nm时达到临界点&#xff0c;纳米片FET可能会取代finFET来满足性能、功耗、面积和成本目标。同样&#xff0c;正在评估2nm铜互连的重大架构变化&#xff0c;此举将重新配置向晶体管传输电力的方式。 芯片制造商也可能会在2nm节点开始用钌或钼在一定程度上取代铜。…

一寸证件照排版工具,在线将证件照排版在相纸上

证件照是我们经常使用到的一种办事资料&#xff0c;考试报名和办理个人证件都是需要的&#xff0c;很多时候需要纸质照片&#xff0c;如果我们手头有打印机的话就很方便了&#xff0c;但相纸都是固定尺寸的例如5寸、6寸相纸&#xff0c;而数码证件照的尺寸则不固定&#xff0c;…

第二证券:被举牌一般会有几个涨停?

跟着股市的昌盛&#xff0c;越来越多的人初步查验出资&#xff0c;而其中一个备受注重的策略就是“举牌”。举牌是指某个股东对股票达到了必定比例的控制权&#xff0c;并告诉公司的一种行为。这种行为除了会对公司股价构成影响之外&#xff0c;还可以让股民猜疑和进一步价格走…

蓝牙特征值示例1-迈金L308自行车尾灯夜骑智能表情尾灯的

了解商品级蓝牙特征值 1 服务器&#xff08;设备&#xff09;描述 0x02-01-06 05-03-0F180A18 09-FF-FFFF166B001C0101 0A-09-4C3330385F37393937 01设备标识 03服务UUID FF厂商自定义数据(厂家编号&#xff1a;FFFF-166B001C0101) 完整设备名称&#xff1a; L308-7997 2 服…

Vue 3.0 + vite + axios+PHP跨域问题的解决办法

最后一个Web项目&#xff0c;采用前后端分离。 前端&#xff1a;Vue 3.0 viteelement plus 后端&#xff1a;PHP 运行时前端和后端是两个程序&#xff0c;前端需要时才向后端请求数据。由于是两个程序&#xff0c;这就会出现跨域问题。 比如前端某个地方需要请求的接口如下…