▲一种基于双经验池优先采样技术和Dueling-DQN强化学习模型的路线规划matlab仿真
目录
✅1.问题描述
在深度强化学习(Deep Reinforcement Learning, DRL)的实际应用中,样本利用效率低、训练收敛不稳定、价值估计偏差大是制约智能体决策性能的三大核心瓶颈。为突破这些限制,本文提出并实现一种基于双经验池优先采样(Double Experience Pool Prioritized Sampling)与Dueling DQN相结合的策略方法。该方法的核心思想在于:一方面,利用Dueling DQN(决斗深度Q网络)将状态价值与动作优势解耦,从而在众多相似动作场景中更精确地评估状态本身的价值;另一方面,通过构建双经验池结构,将高价值经验(高TD误差、高回报样本)与普通经验分离存储,再结合优先采样与均匀随机采样按概率混合抽取训练样本,兼顾关键经验的高效复用与样本分布的多样性,避免过拟合与灾难性遗忘。
该策略方法遵循七个标准化步骤:构建Dueling DQN网络进行环境特征提取并由智能体依策略选择动作、收集画面数据、数据筛选与规范化处理、依评判标准分类存储至双经验池、优先采样与均匀随机采样混合抽样、计算损失并反向传播更新参数、最后统计分析智能体运行效果。这一完整闭环为游戏智能体、机器人控制、自动驾驶决策等场景提供了高效、稳定的深度强化学习解决方案。
✨2. 强化学习的马尔可夫决策过程
智能体与环境的交互建模为马尔可夫决策过程,表示为五元组(S,A,P,R,γ)。其中S为状态空间,A为动作空间,P为状态转移概率,R为奖励函数,γ∈(0,1)为折扣因子。智能体的目标是学习最优策略π∗,使累计折扣回报最大化:

🚀3. Dueling DQN网络架构
Dueling DQN的核心创新在于将Q网络分为两个独立流:状态价值流V(s)衡量当前状态的整体好坏,动作优势流A(s,a)衡量各动作相对于平均水平的优劣。二者通过聚合层重构Q值:

其中θ为共享特征提取层参数,β与α分别为价值流与优势流的独立参数。减去优势均值项是为了解决V与A分解的不可辨识性问题,保证网络输出的唯一性和训练稳定性。这种架构在动作对价值影响不显著时,仍能有效学习状态价值,显著提升学习效率。
💼4.双经验池分类存储机制
不同于传统单一经验回放池,本方法构建双经验池:高优先级池DH存储关键经验,普通池DL存储常规经验。经验样本(s,a,r,s′)依据评判标准分类,评判指标基于TD误差幅值:

当∣δ∣>τ(阈值)或该样本对应高回报时,存入高优先级池DH;否则存入普通池DL。这种分类存储确保了关键转移经验不被普通样本淹没。
样本i的优先级定义为:

κ控制优先化程度(κ=0退化为均匀采样)。训练批次由两部分融合构成:从高优先级池按概率P(i)采样比例ρ,从普通池均匀随机采样比例1−ρ。为消除优先采样引入的分布偏差,采用重要性采样(Importance Sampling)权重:

并归一化为wi/maxjwj,其中η由0逐步退火至1。
✨5.损失函数与参数更新
采用Double DQN思想解耦动作选择与评估,目标值为:

💼6.MATLAB程序
综上所述,完整的实现步骤如下
步骤一:构建Dueling DQN网络(共享层+价值流+优势流),智能体依 ε-greedy 策略选择动作与环境交互。
步骤二:收集环境反馈的画面数据与状态转移信息。
步骤三:对数据进行筛选(剔除异常帧)与规范化(归一化至 [0,1])处理。
步骤四:依TD误差评判标准将经验分类存入双经验池 DH 与 DL。
步骤五:融合优先采样与均匀随机采样,按概率抽取混合训练批次。
步骤六:计算加权损失,反向传播更新网络参数,周期同步目标网络。
步骤七:统计智能体累计奖励、成功率等指标,分析运行效果。
核心程序如下:
%环境构建(GridWorld导航任务)
gridN=8; % 8x8网格环境
nState=gridN*gridN; % 状态数
nAction=4; % 上下左右
goal=nState; % 目标格
obstacles=[11 12 20 28 35 43 44]; % 障碍物
startS=1;
% 动作对应位移: 上/下/左/右
dRow=[-1 1 0 0];
dCol=[0 0 -1 1];
%超参数
hidden=64;
gamma=0.95;
lr=0.01;
epsilon=1.0;
epsMin=0.05;
epsDecay=0.99;
batch=32;
episodes=1000;
maxStep=100;
tau=0.5;
rho=0.6;
%rho:高优先池采样比例
tauSync=0.05;
memH=1500;
%双池容量
memL=1500;
%Dueling网络参数初始化
W1=randn(hidden,nState)*0.1;
b1=zeros(hidden,1);
Wv=randn(1,hidden)*0.1;
bv=0; % 价值流
Wa=randn(nAction,hidden)*0.1;
ba=zeros(nAction,1); % 优势流
tW1=W1;
tb1=b1;
tWv=Wv;
tbv=bv;
tWa=Wa;
tba=ba; % 目标网络
%双经验池: [s,a,r,s',done,priority]
poolH=zeros(memH,nState*2+4);
cntH=0;
ptrH=1;
poolL=zeros(memL,nState*2+4);
cntL=0;
ptrL=1;
rewardCurve=zeros(episodes,1);
lossCurve=zeros(episodes,1);
stepCurve=zeros(episodes,1);
successCurve=zeros(episodes,1);
poolHsize=zeros(episodes,1);
......................................................
%提取最优策略路径
cur=startS; path=startS; g=0;
while cur~=goal && g<nState
s=zeros(nState,1); s(cur)=1;
[Q,~]=dueling_fwd(s,W1,b1,Wv,bv,Wa,ba);
[~,a]=max(Q);
[r,c]=ind2sub([gridN gridN],cur);
nr=r+dRow(a);
nc=c+dCol(a);
if nr<1||nr>gridN||nc<1||nc>gridN
break;
end
ns=sub2ind([gridN gridN],nr,nc);
if any(ns==obstacles)||any(ns==path)
break;
end
path=[path ns];
cur=ns;
g=g+1;
end
%累计奖励曲线
figure;
plot(smooth(rewardCurve,4),'b','LineWidth',1.5);
grid on;
xlabel('训练回合');
ylabel('累计奖励');
title('强化学习训练奖励曲线');
%损失收敛曲线
figure;
plot(smooth(lossCurve,4),'r','LineWidth',1.5);
grid on;
xlabel('训练回合');
ylabel('加权TD损失');
title('损失函数收敛曲线');
%每回合步数(策略效率)
figure;
plot(smooth(stepCurve,4),'m','LineWidth',1.5);
grid on;
xlabel('训练回合');
ylabel('完成步数');
title('策略效率收敛曲线');
%成功率曲线(滑动窗口)
figure;
plot(smooth(successCurve,4)*100,'g','LineWidth',1.5);
grid on;
xlabel('训练回合');
ylabel('成功率(%)');
title('任务成功率曲线');
%探索率衰减
figure;
plot(epsMin+(1-epsMin)*epsDecay.^(0:episodes-1),'c','LineWidth',1.5);
grid on;
xlabel('训练回合');
ylabel('\epsilon');
title('探索率衰减曲线');
%高优先经验池样本数
figure;
plot(poolHsize,'Color',[0.85 0.33 0.1],'LineWidth',1.5);
grid on;
xlabel('训练回合');
ylabel('高优先池样本数');
title('双经验池-高优先池增长曲线');
%环境与最优策略路径
figure;
hold on;
axis equal;
axis([0 gridN+1 0 gridN+1]);
for i=1:nState
[r,c]=ind2sub([gridN gridN],i);
if any(i==obstacles)
rectangle('Position',[c-0.5 gridN-r+0.5 1 1],'FaceColor',[.3 .3 .3]);
end
end
[sr,sc]=ind2sub([gridN gridN],startS);
[gr,gc]=ind2sub([gridN gridN],goal);
plot(sc,gridN-sr+1,'gs','MarkerFaceColor','g','MarkerSize',15);
plot(gc,gridN-gr+1,'rp','MarkerFaceColor','r','MarkerSize',18);
pr=zeros(numel(path),1);
pc=zeros(numel(path),1);
for k=1:numel(path)
[rr,cc]=ind2sub([gridN gridN],path(k));
pr(k)=gridN-rr+1;
pc(k)=cc;
end
plot(pc,pr,'-o','Color','b','LineWidth',2,'MarkerFaceColor','y');
title('Dueling DQN学习到的最优策略路径');
grid on;
💡7.仿真结果分析
仿真结果如下图所示:







👇8.完整程序下载
完整可运行代码,博主已上传至CSDN,使用版本为MATLAB2024b:
(本程序包含程序操作步骤视频)

浙公网安备 33010602011771号