车载边缘计算任务卸载与资源分配深度强化学习优化【附代码】

车载边缘计算任务卸载与资源分配深度强化学习优化【附代码】 ✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅如需沟通交流可以私信或者点击《获取方式》1端边协同任务处理的层次化MDP建模在车辆边缘计算场景中RSU服务器和协同车辆组成了多级计算资源池。设计全局控制器收集车辆状态、任务队列长度以及服务器温度信息构建三层马尔可夫决策过程。上层决策每500 ms触发一次决定任务卸载的目标节点本地、RSU、协同车辆A/B/C状态空间包括任务数据量0.5-5 MB、最大容忍延迟10-200 ms、RSU CPU利用率0-100%、车辆速度及信噪比等12维特征。中层决策每100 ms触发调整目标节点的分配CPU核心数1-8核和发射功率10-23 dBm。下层为服务器本地调度器根据实时负载进行微调。奖励函数定义为R -(α·总时延β·总能耗γ·期望完成度惩罚)其中α0.5β0.3γ0.2期望完成度惩罚用sigmoid函数平滑处理。仿真采用SUMO产生车辆轨迹OMNET建模通信VEINS桥接任务到达遵循泊松分布平均到达率λ5 tasks/s。2基于Gate-Option-Critic的分层演员-批评家算法针对混合动作空间离散卸载选择与连续资源分配提出Gate-Option-Critic架构。上层Policy网络输出option概率分布包括5个option对应卸载目标每个option内部有一个下层actor网络输出连续动作CPU核心数、功率的均值和方差critic网络评估状态-option对的价值。引入门控循环单元融合最近5个时间步的状态信息捕捉车辆移动性和任务突发性。训练采用双延迟深度确定性策略梯度的分层变体每个下层actor对应一个optioncritic使用两个独立目标网络防止过估计。经验回放池存储state, option, action, reward, next_state, done从每个option的缓冲区中采样。此外在损失函数中添加熵正则项系数为0.05促进探索。仿真实验在车辆密度为50辆/km时相比于DQN、A3C等基准任务总时延平均降低23.7%系统总能耗降低17.2%任务期望完成率提升至94.3%。3无人机辅助中继卸载与温度感知负载均衡针对热点区域服务器过热问题部署四旋翼无人机作为移动中继节点。构建联合优化问题最小化加权和ω1·任务时延ω2·无人机能耗ω3·节点温度均衡系数。无人机能耗模型包含飞行推进功率和通信功率温度均衡系数用各服务器温度的标准差衡量。提出温度感知的无人机辅助卸载算法同样基于分层强化学习上层决定当前时刻由哪个地面服务器将任务中继至无人机下层控制无人机的三维位置、悬停高度和转发功率。无人机的飞行轨迹通过Dubins曲线光滑处理避免急转弯。仿真在SUMO网格场景下热点区域30辆汽车集中时采用该方法后服务器最高温度从87°C降至68°C系统负载均衡系数改善41.2%且无人机能耗仅增加8.9%。import torch import torch.nn as nn import torch.optim as optim import numpy as np # 2. Gate-Option-Critic 网络结构 class OptionCritic(nn.Module): def __init__(self, state_dim, num_options, action_dim): super().__init__() self.num_options num_options # 共享特征提取 self.gru nn.GRU(state_dim, 128, batch_firstTrue) # 上层Policy输出 option 概率 self.option_policy nn.Sequential(nn.Linear(128, 128), nn.ReLU(), nn.Linear(128, num_options), nn.Softmax(dim-1)) # 每个option的actor网络输出连续动作均值、标准差 self.option_actors nn.ModuleList([ nn.Sequential(nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, action_dim*2)) for _ in range(num_options) ]) # Critic网络评估 (state, option) 的价值 self.critic nn.Sequential(nn.Linear(128 num_options, 128), nn.ReLU(), nn.Linear(128, 1)) def forward(self, state, hiddenNone): # state: (batch, seq_len, dim) 或 (batch, 1, dim) out, hidden self.gru(state, hidden) feat out[:, -1, :] # 取最后一步 option_probs self.option_policy(feat) return feat, option_probs, hidden def sample_option(self, feat): option_probs self.option_policy(feat) dist torch.distributions.Categorical(option_probs) option dist.sample() return option, dist.log_prob(option) def get_action(self, feat, option): out self.option_actors[option](feat) mu, std out[:, :action_dim], torch.exp(out[:, action_dim:]) dist torch.distributions.Normal(mu, std) action dist.rsample() # 重参数化 log_prob dist.log_prob(action).sum(dim-1) return action, log_prob def get_q_value(self, feat, option_onehot): input_critic torch.cat([feat, option_onehot], dim1) return self.critic(input_critic) # 训练循环片段 def train_hac(model, target_model, replay_buffer, optimizer, batch_size64, gamma0.99, tau0.005): if len(replay_buffer) batch_size: return states, options, actions, rewards, next_states, dones replay_buffer.sample(batch_size) states torch.FloatTensor(states).unsqueeze(1) next_states torch.FloatTensor(next_states).unsqueeze(1) feat, _, _ model(states) next_feat, _, _ target_model(next_states) option_onehot torch.zeros(batch_size, model.num_options).scatter_(1, options.unsqueeze(1), 1) next_option_probs target_model.option_policy(next_feat) # 计算目标Q值 with torch.no_grad(): next_q_values torch.stack([target_model.get_q_value(next_feat, torch.zeros_like(option_onehot).scatter_(1, torch.tensor(i).expand(batch_size,1), 1)) for i in range(model.num_options)], dim1) target_q rewards gamma * (1 - dones) * (next_option_probs * next_q_values.squeeze(-1)).sum(dim1, keepdimTrue) # Critic 损失 current_q model.get_q_value(feat, option_onehot) critic_loss torch.nn.functional.mse_loss(current_q, target_q) # Actor 损失 (option 内 actor 更新) action_chosen, log_prob model.get_action(feat, options) actor_loss -log_prob * (target_q - current_q).detach() # 优势加权 # 熵正则 entropy 0.05 * log_prob.mean() total_loss critic_loss actor_loss.mean() - entropy optimizer.zero_grad() total_loss.backward() optimizer.step() # 软更新目标网络 for param, target_param in zip(model.parameters(), target_model.parameters()): target_param.data.copy_(tau * param.data (1 - tau) * target_param.data)⛳️ 关注我持续更新科研干货