news 2026/6/15 15:05:23

强化学习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/6/15 12:38:26

2025 年终爆梗朋友圈!笑到明年都想翻出来看

1. 2025总结:除了穷和胖,其他啥也没稳住2. 年初立志要逆袭,结果一年下来,净逆行了3. 今年最大的成就:成功保持了“月光族”的优良传统4. 体重一路狂飙,钱包一路狂飙…往下飙5. 2026愿望:不求大富…

作者头像 李华
网站建设 2026/6/15 13:14:59

05-矩阵理论复习第五章 向量与矩阵范数

本文内容为研究生矩阵理论复习第五章 向量与矩阵范数笔记记录,包含了向量的1范数,2范数,无穷范数,以及矩阵的1范数,2范数,无穷范数,与F范数等知识内容,还介绍了谱半径相关PDF文档可前…

作者头像 李华
网站建设 2026/6/15 13:08:35

金仓数据库PL/SQL兼容性深度评测:为什么说它最接近Oracle?

引言 在国产数据库替代Oracle的浪潮中,PL/SQL兼容性成为企业迁移的关键考量因素。作为Oracle数据库的核心编程语言,PL/SQL承载了大量业务逻辑。本文将深入对比金仓数据库(KingbaseES)与达梦数据库在PL/SQL开发体验上的差异,帮助开发者和架构师做出更明智的选择。 一、PL/SQL兼容…

作者头像 李华
网站建设 2026/6/15 13:08:33

一站式了解长轮询,SSE和WebSocket

文章目录引言1.Long Polling (长轮询)2. SSE (Server-Sent Events)3. WebSocket对比总结引言 作为后端开发人员(Java/Go),你肯定遇到过需要实时将服务器数据推送到客户端的场景。传统的 HTTP 请求-响应模式无法满足这种需求。 为了解决这个…

作者头像 李华
网站建设 2026/6/15 14:02:37

货运管理系统:打造货运行业的数字化管理利器

温馨提示:文末有资源获取方式~ 一、货运搬家系统:让货运搬家更高效、更便捷 在当今快节奏的生活和商业环境中,货运搬家是人们和企业经常面临的需求。无论是个人搬家、企业搬迁,还是货物运输,都需要一个高效、便捷的…

作者头像 李华