今天看的论文是这篇

主要提出了传统优先级经验回放(PER)在复杂交通场景中效率低下,使用二叉树存储样本,导致大规模样本时计算复杂度高。而且不丢弃样本,造成存储空间浪费。

双重经验池:

为了解决以上问题,文章提出了双重经验池。分为普通经验池(随机存储交互数据 (s_t, a_t, r, s_{t+1}),用于基础训练。)

和优先经验池(仅存储​​高价值样本​​(需满足:奖励≥历史平均奖励且>奖励中位数))。

并执行异优训练:优先池以一定概率启动训练(如10%),避免过拟合并加速收敛。

动态训练周期​

为了解决固定训练周期在交通流变化时效率低(如车辆少时过度训练)。提出了动态训练周期

动态生成每轮训练周期(epoch),公式如下:(这里的训练周期动态我是第一次见)

动态系数

这样设计能够使早期车少时侧重即时奖励变化(ω1​权重高),后期车多时侧重历史表现(ω2​权重高)。确实妙啊。

还有加入了之前别的论文也研究过的压力奖励:

奖励函数设计

定义​​车道压力​​:Pi​=Nin​−Nout​(入站车辆数 - 出站车辆数)。

​奖励​​:ri​=−Pi​,总奖励 R(st​,at​)=∑ri​。

这样能够协调车量通过最小化压力路口实现缩短车辆平均通行时间,提升路口吞吐量​​。​

论文总结:DERLight通过​​双经验回放​​提升采样效率,结合​​动态周期训练​​适应环境变化,以​​压力驱动的奖励函数​​优化交通流。实验证明其在降低通行时间、提升吞吐量和加速收敛方面显著优于主流算法(如CoLight、PressLight),且具备跨领域应用潜力。

个人看法:

我觉得这个压力奖励还有很大的研究空间。这个动态周期确实我之前居然没想到过(太菜了),作者给我提供了一个新的思路,核心双重经验池也是很大的思路。(能不能多重)(动态经验池)。

主要代码大概

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import random
from collections import deque
import mathclass DQN(nn.Module):"""DQN网络结构 (评估网络和目标网络)"""def __init__(self, state_size, action_size):super(DQN, self).__init__()self.fc1 = nn.Linear(state_size, 64)self.fc2 = nn.Linear(64, 64)self.fc3 = nn.Linear(64, action_size)self.relu = nn.ReLU()def forward(self, state):x = self.relu(self.fc1(state))x = self.relu(self.fc2(x))return self.fc3(x)class DERLight:"""DERLight交通灯控制算法实现"""def __init__(self, state_size, action_size):# 算法参数设置self.state_size = state_sizeself.action_size = action_sizeself.memory_capacity = 10000  # 经验池容量self.batch_size = 32self.gamma = 0.8               # 折扣因子self.epsilon = 0.8             # 初始探索率self.epsilon_min = 0.2self.epsilon_decay = 0.995self.target_update_freq = 5    # 目标网络更新频率self.priority_prob = 0.1        # 优先经验池启动概率# 创建双经验池self.memory_D = deque(maxlen=self.memory_capacity)   # 普通经验池self.memory_D_prime = deque(maxlen=self.memory_capacity)  # 优先经验池# 创建DQN网络self.eval_net = DQN(state_size, action_size)self.target_net = DQN(state_size, action_size)self.target_net.load_state_dict(self.eval_net.state_dict())self.optimizer = optim.Adam(self.eval_net.parameters(), lr=0.001)self.loss_func = nn.MSELoss()# 奖励相关参数self.rewards = []               # 奖励历史self.epoch = 1000               # 初始训练周期self.r_median = None            # 奖励中位数self.r_average = 0               # 奖励平均值def compute_pressure(self, state):"""计算车道压力 (核心公式1)"""# 状态向量包含各车道的车辆数 [in_N, out_N, in_S, out_S, in_E, out_E, in_W, out_W]pressures = []for i in range(0, len(state), 2):n_in = state[i]n_out = state[i+1]pressures.append(n_in - n_out)return pressuresdef compute_reward(self, state):"""计算压力奖励 (核心公式2)"""pressures = self.compute_pressure(state)total_reward = -sum(pressures)  # 总奖励为压力总和的负值return total_rewarddef dynamic_epoch(self, r_t, r_t_minus1):"""动态训练周期计算 (核心公式6-8)"""# 更新历史奖励记录self.rewards.append(r_t)self.r_average = np.mean(self.rewards)self.r_median = np.median(self.rewards) if self.rewards else 0# 模拟时间 (0-60分钟)T = len(self.rewards) % 60# 计算动态系数 (公式7-8)w1 = -math.atan(30 - T) * (r_t_minus1 - r_t)w2 = -math.atan(T - 30) * self.r_average# 更新训练周期 (公式6)epoch_update = w1 + w2self.epoch = max(100, min(2000, self.epoch + int(epoch_update)))return self.epochdef store_experience(self, state, action, reward, next_state, done):"""存储经验到双经验池"""# 存储到普通经验池Dself.memory_D.append((state, action, reward, next_state, done))# 判断是否为优先经验 (条件: 奖励≥平均奖励且>中位数)if (reward >= self.r_average) and (reward > self.r_median):self.memory_D_prime.append((state, action, reward, next_state, done))def sample_experience(self, memory):"""从经验池采样"""if len(memory) < self.batch_size:return Nonebatch = random.sample(memory, self.batch_size)states, actions, rewards, next_states, dones = zip(*batch)return (torch.FloatTensor(states),torch.LongTensor(actions),torch.FloatTensor(rewards),torch.FloatTensor(next_states),torch.FloatTensor(dones))def choose_action(self, state):"""ε-贪婪策略选择动作"""if np.random.rand() <= self.epsilon:return random.randrange(self.action_size)else:state = torch.FloatTensor(state).unsqueeze(0)q_values = self.eval_net(state)return torch.argmax(q_values).item()def update_network(self, sample, is_priority=False):"""更新网络参数"""if sample is None:returnstates, actions, rewards, next_states, dones = sample# 计算当前Q值q_eval = self.eval_net(states).gather(1, actions.unsqueeze(1))# 计算目标Q值q_next = self.target_net(next_states).detach()q_target = rewards + (1 - dones) * self.gamma * q_next.max(1)[0].view(-1, 1)# 计算损失并更新网络loss = self.loss_func(q_eval, q_target)self.optimizer.zero_grad()loss.backward()self.optimizer.step()# 动态调整探索率if self.epsilon > self.epsilon_min:self.epsilon *= self.epsilon_decaydef train(self, env, episodes=1000):"""DERLight训练过程"""for episode in range(episodes):state = env.reset()total_reward = 0r_t_minus1 = 0  # 上一时间步的奖励while True:# 选择并执行动作action = self.choose_action(state)next_state, done = env.step(action)# 计算压力奖励reward = self.compute_reward(state)total_reward += reward# 存储经验self.store_experience(state, action, reward, next_state, done)# 从普通经验池D采样并训练sample_D = self.sample_experience(self.memory_D)self.update_network(sample_D)# 以一定概率从优先经验池D'采样并训练if np.random.rand() < self.priority_prob and self.memory_D_prime:# 计算动态训练周期self.dynamic_epoch(reward, r_t_minus1)# 使用动态周期进行多次训练for _ in range(min(5, self.epoch // 100)):sample_D_prime = self.sample_experience(self.memory_D_prime)self.update_network(sample_D_prime, is_priority=True)# 更新目标网络if episode % self.target_update_freq == 0:self.target_net.load_state_dict(self.eval_net.state_dict())# 更新状态和奖励state = next_stater_t_minus1 = rewardif done:print(f"Episode: {episode}, Total Reward: {total_reward:.2f}, Epsilon: {self.epsilon:.3f}, Epoch: {self.epoch}")breakclass TrafficSimulationEnv:"""简化的交通模拟环境 (用于演示)"""def __init__(self, state_size=8):self.state_size = state_sizeself.max_steps = 100def reset(self):self.step_count = 0# 随机生成初始状态: [in_N, out_N, in_S, out_S, in_E, out_E, in_W, out_W]self.state = np.random.randint(0, 20, size=self.state_size)return self.statedef step(self, action):# 简化状态转移逻辑self.step_count += 1# 根据动作更新车流# 实际实现应使用更复杂的交通流模型next_state = self.state.copy()# 减少进入车辆 (模拟车辆离开)for i in [0, 2, 4, 6]:  # 入口车道next_state[i] = max(0, next_state[i] - np.random.randint(1, 4))# 增加新车辆 (概率性)for i in range(len(next_state)):if np.random.rand() < 0.3:next_state[i] += np.random.randint(1, 3)# 检查结束条件done = self.step_count >= self.max_stepsself.state = next_statereturn next_state, doneif __name__ == "__main__":# 初始化环境和算法env = TrafficSimulationEnv(state_size=8)derlight = DERLight(state_size=8, action_size=4)  # 4个相位动作# 开始训练derlight.train(env, episodes=1000)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85207.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85207.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85207.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chromium 136 编译指南 macOS篇:环境准备与系统配置(一)

1. 引言 在浏览器技术的星空中&#xff0c;Chromium 犹如一颗最亮的明星&#xff0c;照亮了整个互联网的发展轨迹。作为推动现代 Web 技术革命的核心引擎&#xff0c;Chromium 不仅是 Google Chrome 的技术基石&#xff0c;更是 Microsoft Edge、Opera、以及众多定制浏览器的共…

linux机器间无密码如何传输文件

1. scp传输时的问题 $ scp deepseek_r1_distill_qwen1.5b_content_audit_fp16_20250613_2_Q4_K_M.gguf xxx192.168.xxx:/home/xxx/pretrained_model/output The authenticity of host 192.168.xxx (192.168.xxx) cant be established. ED25519 key fingerprint is SHA256:deOs…

PySpark 使用pyarrow指定版本

背景说明 在 PySpark 3.1.3 环境中&#xff0c;当需要使用与集群环境不同版本的 PyArrow (如 1.0.0 版本)时&#xff0c;可以通过以下方法实现&#xff0c;而无需更改集群环境配置 完整操作说明 去pyarrowPyPI下载对应版本的whl文件后缀whl直接改成zip解压后有两个文件夹&am…

安卓APP投屏调试工具使用教程

安卓APP投屏调试工具使用教程 一、准备工作&#xff08;一&#xff09;下载ADB工具&#xff08;二&#xff09;配置ADB的环境变量&#xff08;三&#xff09;检查是否成功安装&#xff08;四&#xff09;adb核心命令说明 二、无线调试流程&#xff08;一&#xff09;环境要求&a…

huggingface网站里的模型和数据集

直接下载肯定是不太行&#xff0c;平时访问都不容易&#xff0c;更别提下载东西了&#xff0c;但是我们可以通过国内镜像进行快速下载。 镜像网址&#xff1a; hf-mirror地址&#xff1a;HF-Mirror 进入网站之后&#xff0c;在搜索框里搜索你想下载的内容&#xff0c;接下来…

Node.js 路由请求方式大全解:深度剖析与工程实践

文章目录 &#x1f310; Node.js 路由请求方式大全解&#xff1a;深度剖析与工程实践一、&#x1f4dc; HTTP 请求方法全景图&#x1f3c6; 核心方法深度对比HTTP 请求方法概念对比表&#x1f6e0;️ 特殊方法应用场景 二、&#x1f3a8; 各方法深度解析1. GET - 数据查看器&am…

JS-实现一个链式调用工具库

要求&#xff1a; 支持链式调用&#xff0c;如&#xff1a;_chain(data).map().filter().value()实现map、filter、等常用方法支持惰性求值&#xff08;延迟执行、直到用到value()时才真正计算&#xff09;。 链式调用的实现原理的关键点是&#xff1a;函数执行完以后&#x…

【人工智能数学基础】实变函数与泛函分析

数学分析、解析几何、高等代数、实变函数、常微分方程、近世代数、微分几何、复变函数、点集拓扑、概率论、数理统计、数理逻辑、偏微分方程、泛函分析、动力系统、数学物理方程、数论导引、群与代数表示、微分流形、代数拓扑、代数几何、金融数学、多元统计分析、应用随机过程…

css3 背景色渐变

在 CSS 中&#xff0c;使用渐变色需要用到 gradient 属性&#xff0c;而 gradient 属性分为 线性渐变 linear-gradient 与 径向渐变 radial-gradient。今天主要是说一下 linear-gradient 线性渐变属性。 例如&#xff1a;background: linear-gradient(90deg, #e7f1fc, #f5f9fb…

将图片合成为视频(基于 OpenCV)

本文将介绍如何使用 Python 和 OpenCV 将一组图像文件合成为一个视频文件。你将学会&#xff1a; 使用 os 模块遍历文件夹中的图像 使用 cv2.VideoWriter 写入视频 设置分辨率与帧率参数 对图像尺寸进行统一处理 简单的视频生成应用开发 1. 所需模块与安装 本章需要以下 …

HanLP 使用教程:从安装到实战应用

HanLP 使用教程&#xff1a;从安装到实战应用 HanLP 是由hankcs开发的一款高效、多功能的中文自然语言处理&#xff08;NLP&#xff09;工具包&#xff0c;支持分词、词性标注、命名实体识别&#xff08;NER&#xff09;、依存句法分析、关键词提取、文本摘要等任务。本教程将…

MySQL 分组函数全面详解与最佳实践

MySQL 分组函数全面详解与最佳实践 MySQL 分组函数&#xff08;聚合函数&#xff09;的核心知识、注意事项和高级应用技巧&#xff1a; &#x1f4ca; 分组函数核心列表 函数描述示例COUNT()计算行数COUNT(*)SUM()计算数值总和SUM(salary)AVG()计算平均值AVG(score)MAX()获取…

华为OD 最小循环子数组

1. 题意 给定一个由若干整数组成的数组 nums&#xff0c;请检查数组是否是由某个子数组重复循环拼接而成&#xff0c;请输出这个最小的子数组。 2. 题解 利用 k m p kmp kmp中的 n e x t next next数组性质&#xff0c;我们可以求出 n u m s nums nums中的最长公共 前缀后缀…

FreeCAD创作参数化凹形和水波纹式雨水箅子

这种非常流行的美观的雨水篦子是都市的宠爱&#xff0c;大家要多多去用。 用FC来创建参数化后&#xff0c;设计人员可以随意修改参数&#xff0c;满足自身的要求&#xff0c;调整各部件的位置&#xff0c;达到满意的布局&#xff0c;非常快捷。 水波纹雨水篦子 凹形雨水篦子

如何用一台服务器用dify私有部署通用的大模型应用?

dify是什么&#xff1f;如何用一台服务器用dify私有部署通用的大模型应用&#xff1f; Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和LLMOps的理念&#xff0c;使开发者可以快速搭建生产级的生成式 AI 应用…

海洋捕食算法优化BP神经网络

引言BP神经网络因梯度下降法的固有缺陷,常出现训练震荡和早熟收敛。海洋捕食算法(MPA)受海洋生物觅食行为启发,其分阶段搜索策略(高速游动→自适应步长→局部开发)能有效平衡全局探索与局部开发。本文通过MPA优化BP初始权值及学习率,构建混合优化模型。 方法论2.1 MPA算…

C++/OpenCV 图像预处理与 PaddleOCR 结合进行高效字符识别

C/OpenCV 图像预处理与 PaddleOCR 结合进行高效字符识别 在许多实际应用场景中&#xff0c;直接从原始图片中提取文字的准确率可能不尽人意。图像中的噪声、光照不均、角度倾斜等问题都会严重干扰 OCR (Optical Character Recognition) 引擎的识别效果。本文将详细介绍如何利用…

线程的学习

1. 线程 1. 线程是一个进程内部的控制序列 2. 线程在进程内部运行&#xff0c;本质是在进程地址空间内运行 3. 进程&#xff1a;承担分配系统资源的基本实体 线程&#xff1a;CPU调度的基本单位 4. 线程在进程地址空间内运行 进程访问的大部分资源都是通过地址空间访问的 …

Qt Quick 与 QML(三)qml中的基础控件

一、基础控件 控件名称‌‌功能描述‌‌示例代码‌‌Rectangle‌基础绘图控件&#xff0c;创建矩形区域Rectangle {width: 100; height: 100<br> color: "red"; radius: 5}‌Text/Label‌文本显示控件Text {text: "Hello World";<br> font.pi…

Redis实现消息队列全解析:从基础到高级应用实战

目录 一、Redis作为消息队列的优势与局限 1.1 核心优势 1.2 适用场景 1.3 局限性及解决方案 二、Redis消息队列实现方案对比 三、List实现基础消息队列 3.1 生产者实现原理 3.2 消费者实现原理 3.3 可靠性增强&#xff1a;ACK机制 四、Pub/Sub实现发布订阅 4.1 消息发…