news 2026/5/9 15:33:29

强化学习Sarsa求最优策略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
强化学习Sarsa求最优策略

理论基础:

注意:

1. 超参数samples的设置:size of q_table = grid_size*grid_size*action_size,每个 Q(s,a) 至少要访问 t= 20~50 次,才能开始收敛,那么需要的总更新次数至少是(q_table)*t,如果每个episode平均走step步,那么sample大小至少为(q_table)*t / step。大概来说,episode 数至少是 Q‑table 大小的 50~200 倍。

2. alpha不能太小,否则学不动,GridWorld 这种小环境alpha取0.05~0.2差不多。但也不能太大,比如0.5就太大了,Q 值会剧烈震荡,策略不稳定。

代码可运行:

''' 区别:1. sarsa是从一个特定的开始状态出发,到达目标状态,只有这条episode是最优的,其他状态则不一定 2. sarsa是迭代式算法,每更新一次action value就要更新一次policy ''' import random import numpy as np from prometheus_client import samples from env import GridWorldEnv from utils import drow_policy class Sarsa(object): def __init__(self, env:GridWorldEnv, gamma=0.9, alpha=0.001, epsilon=0.1, samples=1, start_state=(0,0)): ''' :param env: 定义了网格的基础配置 :param gamma: discount rate :param alpha: learning rate :param epsilon: epsilon greedy更新policy :param samples: 从起点到终点采样的路径数 :param start_state: 起点 ''' self.env = env self.action_space_size = self.env.num_actions # 上下左右原地 self.state_space_size = self.env.num_states self.reward_list = self.env.reward_list self.gamma = gamma self.samples = samples self.alpha = alpha self.epsilon=epsilon self.start_state = self.env.state_id(start_state[0],start_state[1]) self.policy = np.ones((self.state_space_size, self.action_space_size)) / self.action_space_size self.qvalues = np.zeros((self.state_space_size, self.action_space_size)) def solve(self): for i in range(self.samples): s = self.start_state a = np.random.choice(self.action_space_size, p=self.policy[s]) while s not in self.env.terminal: next_s, next_r, _ = self.env.step(s,a) next_a= np.random.choice(self.action_space_size, p=self.policy[next_s]) # 根据Πt(s_t+1)生成a_t+1 # updata q-value for (s_t,a_t) # qt+1(st, at) = qt(st, at) − αt(st, at) [ qt(st, at) − (rt+1 + γqt(st+1, at+1))] td_target=next_r+self.gamma*self.qvalues[next_s][next_a] td_error=td_target-self.qvalues[s][a] # 负号提出去 self.qvalues[s][a]+=self.alpha*td_error # update policy for s_t best_a=np.argmax(self.qvalues[s]) self.policy[s] = self.epsilon / self.action_space_size self.policy[s, best_a] += 1 - self.epsilon s, a = next_s, next_a if __name__ == '__main__': env = GridWorldEnv( size=5, forbidden=[(1, 2), (3, 3)], terminal=[(4, 4)], r_boundary=-1, r_other=-0.04, r_terminal=1, r_forbidden=-1, r_stay=-0.1 ) # 注意samples要大一点,否则每个state被访问到的概率很小 vi=Sarsa(env=env, gamma=0.9, alpha=0.01, epsilon=0.1, samples=5000, start_state=(0,0)) vi.solve() print("\n state value: ") print(vi.qvalues) drow_policy(vi.policy, env)

运行结果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 16:56:43

粒子群算法在风光储微电网优化调度中的应用:经济目标下的电源侧与负荷侧运行策略优化

基于粒子群算法的考虑需求侧响应的风光储微电网优化调度 考虑电源侧与负荷侧运行成本,以经济运行为目标函数,风电、光伏、储能出力、上级电网购电记忆可削减负荷为优化变量,并采用粒子群算法进行求解。1. 系统概述 本项目实现了一个基于多目标…

作者头像 李华
网站建设 2026/5/2 8:24:49

DAY11@浙大疏锦行

笔记:参数优化步骤:1.在调参前,先建立基线模型:- 使用**默认参数**训练模型- 记录性能指标作为**对比基准**- 后续调参效果以此为参照2.对参数进行定义1️⃣ 网格搜索 (GridSearchCV)- 需要定义参数的**固定列表**(par…

作者头像 李华
网站建设 2026/5/7 16:53:11

六自由度机械臂抓取动作仿真:两套易懂代码解析

六自由度机械臂抓取动作仿真-8 两套关于抓取动作的代码,包括抓取动画、关节角、角速度、角加速度的变化仿真、以及抓取轨迹图 简单易懂好上手~在六自由度机械臂抓取动作仿真的领域中,为大家分享两套超实用的代码,助力快速上手相关…

作者头像 李华
网站建设 2026/5/9 11:28:35

货运 app 运输管理系统框架搭建

一、货运搬家系统:让货运搬家更高效、更便捷在当今快节奏的生活和商业环境中,货运搬家是人们和企业经常面临的需求。无论是个人搬家、企业搬迁,还是货物运输,都需要一个高效、便捷的解决方案。而货运搬家系统的出现,正…

作者头像 李华
网站建设 2026/5/9 11:29:31

光伏并网MPPT技术:从扰动观察法到电导增量法

光伏并网mppt 扰动观察法,电导增量法 单相光伏并网,三相光伏并网 可相关参考文献对初学者学习很有用在光伏并网系统中,最大功率点跟踪(MPPT)技术是提高光伏电池发电效率的关键。今天咱们就来唠唠MPPT里常用的扰动观察法…

作者头像 李华