news 2026/8/22 1:34:57

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

作者头像

张小明

前端开发工程师

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

理论基础:

可运行代码:

import numpy as np import torch from torch import nn from torch.utils import data from env import GridWorldEnv from utils import drow_policy class DeepQLearning(object): def __init__(self, env: GridWorldEnv, gamma=0.9): self.env = env self.action_space_size = self.env.num_actions self.state_space_size = self.env.num_states self.gamma = gamma self.policy = np.ones((self.state_space_size, self.action_space_size)) / self.action_space_size self.net = nn.Sequential( nn.Linear(2, 16), nn.ReLU(), nn.Linear(16, self.action_space_size) ) self.target_net = nn.Sequential( nn.Linear(2, 16), nn.ReLU(), nn.Linear(16, self.action_space_size) ) self.target_net.load_state_dict(self.net.state_dict()) self.optimizer = torch.optim.SGD(self.net.parameters(), lr=0.01, momentum=0.9) self.loss = nn.MSELoss() def data_iter(self, episode, batch_size=32, is_train=True): reward = [] state = [] action = [] next_state = [] for s, a, r, next_s in episode: reward.append(r) state.append((s // self.env.size, s % self.env.size)) # 有空间位置 next_state.append((next_s // self.env.size, next_s % self.env.size)) action.append(a) reward = torch.tensor(reward, dtype=torch.float32) state = torch.tensor(state, dtype=torch.float32) next_state = torch.tensor(next_state, dtype=torch.float32) action = torch.tensor(action, dtype=torch.long) data_arrays = (state, action, reward, next_state) dataset = data.TensorDataset(*data_arrays) return data.DataLoader(dataset, batch_size=batch_size, shuffle=is_train, drop_last=False) def solve(self, epochs, update_frep): s = self.env.reset() a = np.random.choice(self.action_space_size, p=self.policy[s]) episodes = [] for _ in range(self.action_space_size * self.state_space_size + 1): episode = self.env.generate_episodes(self.policy, s, a, max_steps=1000) episodes.extend(episode) dataloader = self.data_iter(episodes) step = 0 for epoch in range(epochs): for state, action, reward, next_state in dataloader: step += 1 with torch.no_grad(): q_value = self.target_net(next_state) # [B,N] max_q = q_value.max(dim=1).values y_target = reward + self.gamma * max_q # [B,] y = self.net(state) y_ = y.gather(1, action.unsqueeze(1)).squeeze(1) l = self.loss(y_target, y_) self.optimizer.zero_grad() l.backward() self.optimizer.step() if step % update_frep == 0: self.target_net.load_state_dict(self.net.state_dict()) def get_policy(self): for s in range(self.state_space_size): if s in self.env.terminal: self.policy[s, 4] = 1 break s_t = torch.tensor((s // self.env.size, s % self.env.size), dtype=torch.float32) q_value = self.net(s_t) a = q_value.argmax(dim=0).item() self.policy[s] = 0 self.policy[s, a] = 1 return self.policy if __name__ == '__main__': env = GridWorldEnv( size=5, forbidden=[(1, 2), (3, 3)], terminal=[(4, 4)], r_boundary=-1, r_other=0, r_terminal=1, r_forbidden=-1, r_stay=-0.1 ) # 注意samples要大一点,否则每个state被访问到的概率很小 vi = DeepQLearning(env=env, gamma=0.8) vi.solve(epochs=50, update_frep=20) policy = vi.get_policy() print(policy) drow_policy(policy, env)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 12:18:38

【字幕处理新突破】:如何在10分钟内完成批量Dify格式转换?

第一章:Dify字幕格式转换的技术背景 在多媒体内容处理中,字幕作为提升可访问性与用户体验的关键组件,其格式多样性带来了兼容性挑战。不同平台和播放器支持的字幕格式各异,例如 SRT、WebVTT、ASS 等,因此需要高效的格式…

作者头像 李华
网站建设 2026/8/21 5:38:52

SoftMaker Office(全能办公套件)

SoftMaker Office 是一款跨平台全能办公套件,原生支持 docx、xlsx、pptx 格式,无需转换即可与 Microsoft Office 无缝兼容。它包含文字处理、电子表格、演示文稿三大核心组件,兼具轻量化运行、GDPR 合规隐私保护等优势,还内置 Cha…

作者头像 李华
网站建设 2026/8/21 23:11:06

破局传统 PLM 局限,研发系统筑牢汽车半导体研发管理防线——全星研发项目管理APQP软件系统

破局传统 PLM 局限,全星研发系统筑牢汽车半导体研发管理防线 一、 产品定位与核心理念 全星研发项目管理APQP软件系统,是一款专为满足汽车部件、芯片半导体等高合规、高复杂性行业需求而设计的体系化研发管理平台。本系统超越了传统产品生命周期管理&am…

作者头像 李华
网站建设 2026/8/21 7:37:32

VS Code 1.107 更新:多智能体协同与开发体验升级

2025 年 12 月 10 日,微软正式发布了 VS Code 1.107 版本,这次更新堪称年度最重磅!多智能体协同开发成为核心亮点,彻底重构了开发者与 AI 协作的模式。想象一下,你可以同时部署多个 AI 助手分工合作:一个负…

作者头像 李华
网站建设 2026/8/21 22:57:43

【开源代码】餐饮点餐系统源码(ThinkPHP+Vue3+UniApp)

三勾餐饮点餐连锁版系统是一个基于thinkphp8element-plusuniapp构建的全面解决方案,旨在为连锁餐饮企业提供高效的点餐与管理服务。该系统支持多端应用发布,包括微信小程序、H5、安卓及iOS平台,实现数据互通和全网覆盖。它不仅适合直接使用&a…

作者头像 李华