news 2026/4/3 6:43:46

强化学习REINFORCE求最优策略的代码实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
强化学习REINFORCE求最优策略的代码实现

理论基础:

注意:

1. 策略的输出要加对数,因此net输出必须softmax,将输出限制为正数。

2. 这里选择action不是greedy地选择最优action,而是按照概率分布选择action->exploration。

3. 策略更新使用的是梯度上升,因此loss取负。

4. 这里使用step一步步收集episode,而不是像之前一样直接使用generate_episode函数生成完成的path,是因为在generate_episode中是使用greedy的方法选择action的(见2)。

5. num_episodes大一些。

代码可运行:

import numpy as np import torch from torch import nn from env import GridWorldEnv from utils import drow_policy ''' policy gradient by Monte Carlo ''' class Reinforce(object): def __init__(self, env: GridWorldEnv, gamma=0.9, lr=1e-2): ''' :param env: :param gamma: discount rate :param lr: learning rate of optimizer ''' self.env = env self.action_space_size = self.env.num_actions self.state_space_size = self.env.num_states self.gamma = gamma self.net = nn.Sequential( nn.Linear(2, 16), nn.ReLU(), nn.Linear(16, self.action_space_size) ) self.policy = np.zeros((self.state_space_size, self.action_space_size)) self.q_value = np.zeros((self.state_space_size, self.action_space_size)) self.optimizer = torch.optim.Adam(self.net.parameters(), lr=lr) def decode_state(self, state): ''' :param state: int :return: 归一化后的元组 ''' i = state // self.env.size j = state % self.env.size return torch.tensor((i / (self.env.size - 1), j / (self.env.size - 1)), dtype=torch.float32) def solve(self, num_episodes): for _ in range(num_episodes): state_int = self.env.reset() state = self.decode_state(state_int) done = False episode = [] # [[state_tensor,reward,done]...[...]] while not done: logits = self.net(state) action_probs = torch.softmax(logits, dim=0) action_dist = torch.distributions.Categorical(action_probs) # 按分布采样 action = action_dist.sample().item() next_state, reward, done = self.env.step(state_int, action) episode.append((state, action, reward)) state_int = next_state state = self.decode_state(next_state) # value update returns = [] G = 0 for _, _, reward in reversed(episode): G = reward + self.gamma * G returns.insert(0, G) # policy update self.optimizer.zero_grad() loss = 0 for (state, action, _), G in zip(episode, returns): logits = self.net(state) action_probs = torch.softmax(logits, dim=0) action_dist = torch.distributions.Categorical(action_probs) log_prob = action_dist.log_prob(torch.tensor(action)) # In Π(a_t|s_t, θ) loss -= log_prob * G # 负号是因为最小化 loss->最大化 J(θ),梯度上升更新参数 loss.backward() self.optimizer.step() def get_policy(self): for s in range(self.state_space_size): a = np.argmax(self.q_value[s]) self.policy[s, a] = 1 return self.policy def get_qvalues(self): for s in range(self.state_space_size): s_t = self.decode_state(s) logits = self.net(s_t) action_probs = torch.softmax(logits, dim=0) self.q_value[s,:] = action_probs.detach().numpy() # q_value是numpy类型,action_probs是tensor,必须转换 return self.q_value 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 ) vi = Reinforce(env=env) vi.solve(num_episodes=200) print("\n state value: ") print(vi.get_qvalues()) drow_policy(vi.get_policy(), env)

运行结果:

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

MCU+AT,必将让位于OpenCPU【第五章】

第五章:典型OpenCPU应用架构 OpenCPU的核心理念是: 让通信模组不仅“能联网”,还“能计算、能看见、能展示、能存储、能决策”。 根据项目复杂度与算力需求,实际应用大致分为三种主流架构。 5.1轻量应用架构:通信内…

作者头像 李华
网站建设 2026/3/31 23:01:27

【收藏级】一文掌握RAG技术:检索增强生成技术的核心原理与实现方法

本文全面解析检索增强生成(RAG)技术,详细介绍了其如何通过结合检索系统和生成模型解决传统语言模型的局限性。文章涵盖了RAG的核心组件(检索机制、生成过程、知识整合)、关键步骤(从用户意图理解到知识引用)以及高级RAG方法(训练优化、多模态处理、记忆增强等)&…

作者头像 李华
网站建设 2026/3/24 14:22:53

一体化系统(九)智慧社区综合报表——东方仙盟练气期

智慧社区综合报表:开启社区数字化管理新篇章随着科技的飞速发展,智慧社区建设成为提升居民生活质量、优化社区管理效率的重要途径。智慧社区综合报表作为其中的关键一环,以直观的数据展示和深入的分析,为社区管理提供了有力支持。…

作者头像 李华
网站建设 2026/4/3 2:25:43

如何解决Netty沾包与半包

在基于 Netty 这类 NIO 框架进行网络通信时,粘包和半包问题是开发者必须面对的基础挑战。本文将通过一个真实的案例,详细介绍如何重现该问题,并深入探讨 Netty 提供的两种高效内置解决方案。一、 问题重现:什么是粘包与半包&#…

作者头像 李华
网站建设 2026/4/2 9:18:23

QM申报流程及要求

一、申报流程:依托企业:QM计划申报需要依托国内工作单位来申报,企业资质、双方匹配程度直接影响入选概率。 二、准备材料:申报人学历证书、工作履历、科研成果与过往业绩等文件,企业端需提供基本信息与荣誉资质证明。 三、填报系统:除了上传以…

作者头像 李华
网站建设 2026/3/31 18:17:31

基于springboot公司公务用车管理系统

基于Spring Boot的公司公务用车管理系统是一种高效、灵活且易于扩展的车辆管理解决方案。以下是对该系统的详细介绍: 一、系统背景与目的 随着公司规模的扩大和公务用车数量的增加,传统的人工管理方法已经难以满足高效、准确的管理需求。因此&#xff0c…

作者头像 李华