論文筆記 <交通燈> <多智能體>DERLight雙重經驗回放燈機制

今天看的論文是這篇

主要提出了傳統優先級經驗回放(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 消息發…