news 2026/4/16 10:45: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/4/16 10:39:56

用姓氏改个巨有趣的家庭群名

#按姓氏起家庭群名!笑到邻居来蹭群🤣李:李府茶话会🍵(全家围坐唠嗑,比追剧还上头)张:张灯结彩阁🏮(天天像过节,热闹到停不下来)王&…

作者头像 李华
网站建设 2026/4/16 9:01:16

探索高压无桥PFC:原理图、PCB与源代码之旅

高压无桥PFC原理图PCB源代码资料在电力电子领域,功率因数校正(PFC)技术对于提高电能利用效率、降低谐波污染至关重要。而高压无桥PFC作为一种新兴的技术方案,正逐渐崭露头角。今天,咱就一起来深入探究下高压无桥PFC的原…

作者头像 李华
网站建设 2026/4/16 10:40:05

探索 S7 - 1200 地铁屏蔽门控制系统

地铁屏蔽门控制系统,S7-1200地铁屏蔽门控制系统,地铁门控制系统,系统才用西门子博途,S7-1200PLC编程,wincc组态,包括PLC组态仿真画面在现代城市轨道交通中,地铁屏蔽门控制系统起着至关重要的作用…

作者头像 李华
网站建设 2026/4/16 10:41:15

Docker 搭建Nexus3私服

一、Nexus 简介 Nexus Repository Manager 3(简称Nexus3)是Sonatype公司推出的一款仓库管理工具,主要用于存储、管理和分发: Maven(Java)依赖Docker 镜像npm(Node.js)包PyPI&#xf…

作者头像 李华
网站建设 2026/4/15 19:48:20

探索Comsol双温模型在半导体飞秒激光研究中的应用

comsol双温模型半导体 飞秒激光在现代光学和半导体物理领域,飞秒激光与半导体材料的相互作用一直是研究热点。而Comsol Multiphysics这款强大的多物理场仿真软件,为我们深入理解这一复杂过程提供了有力工具,其中双温模型更是关键所在。 飞秒激…

作者头像 李华
网站建设 2026/4/15 0:30:22

Dubbo多协议暴露完全指南:让一个服务同时支持多种通信方式

在现代微服务架构中,不同场景可能需要不同的通信协议。本文将深入探讨如何在Dubbo中实现服务的多协议暴露,满足各种复杂的业务需求。 文章目录🎯 引言:为什么需要多协议暴露?一、Dubbo多协议基础:核心概念解…

作者头像 李华