ppo和奖惩机制结合源码
用于离散动作的PPOimport torchfrom torch import nnfrom torch.nn import functional as Fimport randomimport numpy as npimport pydisimport gymfrom gym import spacesfrom torch.distributions import Categorical-------------------------------------策略网络–输出连续动作的高斯分布的均值和标准差-------------------------------------def set_seed(seed):random.seed(seed)np.random.seed(seed)torch.manual_seed(seed)if torch.cuda.is_available():torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.# Ensure reproducibility in cudnntorch.backends.cudnn.deterministic Truetorch.backends.cudnn.benchmark Falseclass PolicyNet(nn.Module):definit(self, n_states, n_actions):super(PolicyNet, self).init()self.fc1 nn.Linear(n_states, 512) self.fc2 nn.Linear(512, 256) self.fc3 nn.Linear(256, 128) self.gru nn.GRU(input_size128, hidden_size128, batch_firstTrue) self.fc4 nn.Linear(128, n_actions) self._init_weights() def _init_weights(self): # 使用 Kaiming 均匀初始化方法对 全连接层 的权重进行初始化并将偏置初始化为零 nn.init.kaiming_uniform_(self.fc1.weight, nonlinearityrelu) nn.init.zeros_(self.fc1.bias) nn.init.kaiming_uniform_(self.fc2.weight, nonlinearityrelu) nn.init.zeros_(self.fc2.bias) nn.init.kaiming_uniform_(self.fc3.weight, nonlinearityrelu) nn.init.zeros_(self.fc3.bias) nn.init.kaiming_uniform_(self.fc4.weight, nonlinearityrelu) nn.init.zeros_(self.fc4.bias) nn.init.kaiming_uniform_(self.gru.weight_ih_l0, nonlinearityrelu)# 使用 Kaiming 均匀初始化方法对 GRU 层的输入权重weight_ih_l0进行初始化。 nn.init.kaiming_uniform_(self.gru.weight_hh_l0, nonlinearityrelu)# 使用 Kaiming 均匀初始化方法对 GRU 层的隐藏权重weight_hh_l0进行初始化 nn.init.zeros_(self.gru.bias_ih_l0)# 将 GRU 层的输入偏置bias_ih_l0初始化为零。 nn.init.zeros_(self.gru.bias_hh_l0)# 将 GRU 层的隐藏偏置bias_hh_l0初始化为零。 # 前向传播 def forward(self, x): # # [b, n_states] -- [b, n_hiddens] x1 F.relu(self.fc1(x)) x2 F.relu(self.fc2(x1)) x3 F.relu(self.fc3(x2)) x3 x3.unsqueeze(0) # 添加时间步维度变为 [batch_size, 1, 128] gru_out, _ self.gru(x3) # GRU的输出形状是 [batch_size, 1, 128] gru_out gru_out.squeeze(1) # 移除时间步维度变回 [batch_size, 128] x4 self.fc4(gru_out) x F.softmax(x4, dim-1) return x-------------------------------------价值网络 – 评估当前状态的价值-------------------------------------class ValueNet(nn.Module):definit(self, n_states):super(ValueNet, self).init()self.fc1 nn.Linear(n_states, 512)self.fc2 nn.Linear(512, 256)self.fc3 nn.Linear(256, 128)self.gru nn.GRU(input_size128, hidden_size128, batch_firstTrue)self.fc4 nn.Linear(128, 1)self._init_weights()def _init_weights(self): # 使用 Kaiming 均匀初始化方法对 全连接层 的权重进行初始化并将偏置初始化为零 nn.init.kaiming_uniform_(self.fc1.weight, nonlinearityrelu) nn.init.zeros_(self.fc1.bias) nn.init.kaiming_uniform_(self.fc2.weight, nonlinearityrelu) nn.init.zeros_(self.fc2.bias) nn.init.kaiming_uniform_(self.fc3.weight, nonlinearityrelu) nn.init.zeros_(self.fc3.bias) nn.init.kaiming_uniform_(self.fc4.weight, nonlinearityrelu) nn.init.zeros_(self.fc4.bias) nn.init.kaiming_uniform_(self.gru.weight_ih_l0, nonlinearityrelu)# 使用 Kaiming 均匀初始化方法对 GRU 层的输入权重weight_ih_l0进行初始化。 nn.init.kaiming_uniform_(self.gru.weight_hh_l0, nonlinearityrelu)# 使用 Kaiming 均匀初始化方法对 GRU 层的隐藏权重weight_hh_l0进行初始化 nn.init.zeros_(self.gru.bias_ih_l0)# 将 GRU 层的输入偏置bias_ih_l0初始化为零。 nn.init.zeros_(self.gru.bias_hh_l0)# 将 GRU 层的隐藏偏置bias_hh_l0初始化为零。 # 前向传播 def forward(self, x): x1 F.relu(self.fc1(x)) # [b,n_states]--[b,n_hiddens] x2 F.relu(self.fc2(x1)) x3 F.relu(self.fc3(x2)) x3 x3.unsqueeze(0) # 添加时间步维度变为 [batch_size, 1, 128] gru_out, _ self.gru(x3) # GRU的输出形状是 [batch_size, 1, 128] gru_out gru_out.squeeze(1) # 移除时间步维度变回 [batch_size, 128] x4 self.fc4(gru_out) return x4-------------------------------------模型构建–处理连续动作-------------------------------------class PPO:definit(self, n_states,n_actions,actor_lr,critic_lr,device):# 实例化策略网络self.actor PolicyNet(n_states, n_actions).to(device)self.actor_old PolicyNet(n_states, n_actions).to(device)# 实例化价值网络self.critic ValueNet(n_states).to(device)# 策略网络的优化器self.actor_optimizer torch.optim.Adam(self.actor.parameters(), lractor_lr)# 价值网络的优化器self.critic_optimizer torch.optim.Adam(self.critic.parameters(), lrcritic_lr)# 属性分配 self.lmbda 0.9 # GAE优势函数的缩放因子 self.epochs 5 # 一条序列的数据用来训练多少轮 self.eps 0.2 # 截断范围 self.gamma 0.9 # 折扣系数 self.device device # 动作选择 def take_action(self, state): # 输入当前时刻的状态 # [n_states]--[1,n_states]--tensor state torch.tensor(state,dtypetorch.float32).to(self.device) # 预测当前状态的动作输出动作概率的概率分布 probs self.actor(state) # 输出在每个动作上的概率 m Categorical(probs)# 使用Categorical分布将输出的概率转换为一个概率分布对象m action m.sample()# 通过调用m.sample()方法从该分布中采样一个动作。 # 随机选择动作 return action.item() # 返回动作值 # 训练 def update(self,states,next_states, actions, rewards): self.actor_old.load_state_dict(self.actor.state_dict()) states torch.FloatTensor(states) next_states torch.FloatTensor(next_states) actions torch.LongTensor(actions) rewards torch.FloatTensor(rewards) next_states_target self.critic(next_states) # 价值网络--目标当前时刻的state_value [b,1] td_target rewards self.gamma * next_states_target.squeeze() # 价值网络--预测当前时刻的state_value [b,n_states]--[b,1] td_value self.critic(states) # 时序差分预测值-目标值 # [b,1] td_delta td_target - td_value.squeeze() # 对时序差分结果计算GAE优势函数 td_delta td_delta.cpu().detach().numpy() # [b,1] advantage_list [] # 保存每个时刻的优势函数 advantage 0 # 优势函数初始值 # 逆序遍历时序差分结果把最后一时刻的放前面 for delta in td_delta[::-1]: advantage self.gamma * self.lmbda * advantage delta advantage_list.append(advantage) # 正序排列优势函数 advantage_list.reverse() # numpy -- tensor advantage torch.tensor(advantage_list, dtypetorch.float).to(self.device) old_probs self.actor_old(states) # 输出在每个动作上的概率 old_dist Categorical(old_probs) # 策略网络--预测当前状态选择的动作的高斯分布 # 一个序列训练epochs次 old_log_probs old_dist.log_prob(actions) for _ in range(self.epochs): new_probs self.actor(states)# 对状态集合进行预测得到每个动作的概率分布new_probs new_dist Categorical(new_probs) # 使用Categorical分布将输出的概率转换为一个概率分布对象new_dist new_log_probs new_dist.log_prob(actions)# 计算每个动作的对数概率 # action_dists torch.distributions.Normal(mu, std) # # 当前策略在 t 时刻智能体处于状态 s 所采取动作的行为概率 # log_prob action_dists.log_prob(actions)# 新策略 # # 计算概率的比值来控制新策略更新幅度 ratio torch.exp(new_log_probs - old_log_probs) # 公式的左侧项 surr1 ratio * advantage # 公式的右侧项截断 surr2 torch.clamp(ratio, 1 - self.eps, 1 self.eps) * advantage # 策略网络的损失PPO-clip actor_loss torch.mean(-torch.min(surr1, surr2)) # 价值网络的当前时刻预测值与目标价值网络当前时刻的state_value之差 critic_loss torch.mean(F.mse_loss(self.critic(states).squeeze(),td_target.detach())) # 优化器清0 self.actor_optimizer.zero_grad() self.critic_optimizer.zero_grad() # 梯度反传 actor_loss.backward(retain_graphTrue) critic_loss.backward(retain_graphTrue) # 参数更新 self.actor_optimizer.step() self.critic_optimizer.step() def save(self,episode,moudle_dir): torch.save(self.actor.state_dict(), f{moudle_dir}/{episode}PPO_actor_dec.pth) torch.save(self.critic.state_dict(), f{moudle_dir}/{episode}PPO_critic_dec.pth) print(...save model...) def load(self,moudle_dir): self.actor.load_state_dict(torch.load(f{moudle_dir}/PPO_actor_dec.pth)) self.critic.load_state_dict(torch.load(f{moudle_dir}/PPO_critic_dec.pth)) print(...load...)class AFSIMEnv(gym.Env):definit(self, entity_id):super(AFSIMEnv, self).init()self.entity_id entity_idself.dis_network pydis.Network()# 定义观测空间和动作空间 self.observation_space spaces.Box(low-1, high1, shape(5,)) self.action_space spaces.Box(low-1, high1, shape(2,)) def reset(self): # 重置环境初始化实体状态 initial_state self._get_entity_state() return np.array(initial_state, dtypenp.float32) def _get_entity_state(self): # 通过DIS获取实体状态 entity_state_pdu self.dis_network.receive_pdu() if entity_state_pdu is None: return [0, 0, 0, 0, 0] # 获取实体的位置信息和姿态信息作为观测值 pos_x, pos_y, pos_z entity_state_pdu.entity_location.x, entity_state_pdu.entity_location.y, entity_state_pdu.entity_location.z pitch, roll, yaw entity_state_pdu.entity_orientation.pitch, entity_state_pdu.entity_orientation.roll, entity_state_pdu.entity_orientation.yaw return [pos_x, pos_y, pos_z, pitch, yaw] def step(self, action): # 通过DIS向AFSIM发送控制命令 control_pdu pydis.EntityStatePDU() control_pdu.entity_id self.entity_id control_pdu.entity_orientation.pitch action[0] control_pdu.entity_orientation.yaw action[1] self.dis_network.send_pdu(control_pdu) # 获取新的状态和奖励 state self._get_entity_state() reward -np.linalg.norm(state[:2]) # 假设奖励为距离目标点的负距离 done bool(state[0] 0.1 and state[1] 0.1) return np.array(state, dtypenp.float32), reward, done, {}在这里插入代码片

相关新闻

从学术研究到商业应用:SenseNova-U1.5-8B-MoT-Preview的技术演进与产业价值

从学术研究到商业应用:SenseNova-U1.5-8B-MoT-Preview的技术演进与产业价值

从学术研究到商业应用:SenseNova-U1.5-8B-MoT-Preview的技术演进与产业价值 【免费下载链接】SenseNova-U1.5-8B-MoT-Preview 项目地址: https://ai.gitcode.com/SenseNova/SenseNova-U1.5-8B-MoT-Preview SenseNova-U1.5-8B-MoT-Preview是基于NEO-unify架构…

2026/8/6 19:43:28 阅读更多 →
一图四席!派拉软件入选《2026人工智能安全产业全景图》四大核心赛道

一图四席!派拉软件入选《2026人工智能安全产业全景图》四大核心赛道

近日,由上海市信息安全行业协会与安在新媒体联合编制的《2026中国AI安全产业发展调查报告》正式全网首发,并同步推出年度重磅成果——《2026人工智能安全产业全景图》。作为研判国内AI安全产业格局的权威参考,这份全景图覆盖AI安全全产业链核…

2026/8/6 19:43:28 阅读更多 →
中小企业怎么选智能客服?2026年saas智能客服选购指南分享

中小企业怎么选智能客服?2026年saas智能客服选购指南分享

很多中小企业管理者在引入智能客服时,都会陷入同样的困惑:市面上产品不少,宣传各有侧重,到底哪一款才适合自己? 选型过程中,有三类问题尤其常见 第一类:看参数不看匹配。 不少企业选型时先看技…

2026/8/6 19:42:27 阅读更多 →

最新新闻

gpu burn压测A800 80g

gpu burn压测A800 80g

A800 80GB 八卡 GPU Burn 压测操作文档 1. 环境信息项目详情操作系统Ubuntu 22.04 LTSGPUNVIDIA A800 80GB 8压测工具gpu-burn压测时长30 分钟(1800 秒)输出目录/root/gpu-burn/Compute Capability8.0 (GA100)2. 前置检查 nvidia-smi …

2026/8/6 21:24:13 阅读更多 →
Windows下Claude Code环境配置与问题解决指南

Windows下Claude Code环境配置与问题解决指南

1. Claude Code问题解决指南最近在Windows环境下使用Claude Code时遇到了不少问题,特别是PATH环境变量配置和git-bash兼容性问题。作为一个长期在Windows平台开发的程序员,我整理了这些常见问题的解决方案,希望能帮助遇到同样困扰的朋友。Cla…

2026/8/6 21:24:13 阅读更多 →
React Native鸿蒙跨平台动画开发实战指南

React Native鸿蒙跨平台动画开发实战指南

1. 项目概述:React Native鸿蒙跨平台动画开发入门最近在技术社区看到不少开发者对鸿蒙生态与React Native的结合使用存在困惑,特别是动画实现部分。作为一个在移动端开发领域摸爬滚打多年的老手,今天我就来拆解一个React Native在鸿蒙平台上实…

2026/8/6 21:24:13 阅读更多 →
Unity资源逆向与修改实战:UABEA工具核心机制与5分钟上手指南

Unity资源逆向与修改实战:UABEA工具核心机制与5分钟上手指南

1. 项目概述:为什么你需要UABEA?如果你曾经对一款Unity引擎开发的游戏产生过好奇,想看看它的贴图、模型,甚至想修改一下数值体验一下“上帝模式”,那么你很可能已经听说过“拆包”和“资源编辑”。在众多工具中&#x…

2026/8/6 21:24:13 阅读更多 →
VMware虚拟机安装与优化Win11全攻略

VMware虚拟机安装与优化Win11全攻略

1. VMware虚拟机安装Win11全流程解析去年帮朋友公司部署测试环境时,需要在20台物理机上同时运行不同版本的Windows 11进行兼容性测试。当时我们选择了VMware Workstation Pro作为虚拟化平台,不仅节省了90%的硬件成本,还实现了快速克隆和快照回…

2026/8/6 21:24:13 阅读更多 →
如何快速上手Tk-Instruct-small-def-pos?3分钟掌握NLP任务指令跟随

如何快速上手Tk-Instruct-small-def-pos?3分钟掌握NLP任务指令跟随

如何快速上手Tk-Instruct-small-def-pos?3分钟掌握NLP任务指令跟随 【免费下载链接】tk-instruct-small-def-pos 项目地址: https://ai.gitcode.com/hf_mirrors/LLM-Research/tk-instruct-small-def-pos Tk-Instruct-small-def-pos是一款基于T5模型架构的轻…

2026/8/6 21:23:13 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →