基于深度强化学习的Q网络(DQN)智能体,用于解决经典的CartPole平衡任务研究(Matlab代码实现)

     💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

 ⛳️赠与读者

💥1 概述

基于深度强化学习的Q网络(DQN)智能体在CartPole平衡任务中的研究

一、DQN算法基本原理

1. 核心思想

2. 关键技术

二、CartPole平衡任务的定义与挑战

1. 任务描述

2. 核心挑战

三、DQN在CartPole任务中的典型应用案例

1. 基础DQN实现

2. 改进算法应用

四、性能对比与实验分析

1. 算法性能对比

2. 训练稳定性对比

2. 关键代码片段(PyTorch示例)

五、总结与展望

📚2 运行结果

🎉3 参考文献 

🌈4 Matlab代码实现


 ⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥1 概述

基于深度强化学习的Q网络(DQN)智能体在CartPole平衡任务中的研究


一、DQN算法基本原理
1. 核心思想

DQN(Deep Q-Network)将Q-learning与深度神经网络结合,通过神经网络近似Q值函数,解决了传统Q-learning在高维状态空间中的局限性。其核心是通过输入环境状态ss,输出各动作对应的Q值Q(s,a)Q(s,a),指导智能体选择最大化长期回报的动作。

2. 关键技术
  • 经验回放(Experience Replay) :存储历史经验(st,at,rt,st+1),随机采样训练以打破数据相关性,提高样本利用率。
  • 目标网络(Target Network) :使用独立的目标网络计算目标Q值,避免因主网络频繁更新导致的Q值震荡,公式为:

其中γ为折扣因子,θ−为目标网络参数。

  • Double DQN:分离动作选择与Q值评估,减少Q值高估问题,公式改进为:


二、CartPole平衡任务的定义与挑战
1. 任务描述
  • 环境状态:4维连续向量,包括小车位置[−2.4,2.4]、速度(−∞,∞)、杆角度[−41.8°,41.8°]、杆末端角速度(−∞,∞)。
  • 动作空间:离散动作(左推0,右推1)。
  • 目标:通过左右移动小车保持杆子竖直,最大步数通常为500,每步奖励+1。
2. 核心挑战
  • 状态连续性:连续状态空间需通过神经网络有效建模。
  • 稀疏奖励:仅在杆子未倾倒时获得奖励,需长期策略规划。
  • 数据相关性:传统Q-learning因序列样本强相关性导致训练不稳定。

三、DQN在CartPole任务中的典型应用案例
1. 基础DQN实现
  • PyTorch实现:GitHub仓库SeeknnDestroy/DQN-CartPole使用双网络结构,经验回放池大小为1e5,训练后平均奖励达185.08。
  • TensorFlow实现:代码库Nat-D/DQN-Tensorflow结合gym环境,通过线性网络实现,500轮训练后接近500步上限。
  • Keras实现:示例代码通过两层全连接网络(隐藏层24单元)实现,经验回放池大小1e4,ε-greedy策略衰减探索率。
2. 改进算法应用
  • Double DQN:在CartPole-v0中,Double DQN相比基础DQN收敛更快,平均奖励提升25%以上,减少Q值高估问题。
  • 优先经验回放(PER) :基于TD误差动态调整样本权重,训练速度提升30%,平均奖励达396.72。

四、性能对比与实验分析
1. 算法性能对比
算法平均奖励训练轮数适用场景
Q-learning100-2001000低维状态空间
DQN(基础)400-500500高维连续状态空间
Double DQN450-500400需减少Q值高估的任务
PER DQN480-500300需加速关键经验学习
Dueling DQN490-500350复杂状态评估任务
2. 训练稳定性对比
  • 经验回放与目标网络:DQN相比传统Q-learning训练曲线更平滑,收敛速度提升2倍。
  • 改进算法效果:PER DQN在CartPole-v1中仅需100轮即可稳定至500步,而基础DQN需200轮。
2. 关键代码片段(PyTorch示例)
class DQN(nn.Module):
    def __init__(self, state_dim, action_dim):
        super().__init__()
        self.fc1 = nn.Linear(state_dim, 24)
        self.fc2 = nn.Linear(24, 24)
        self.fc3 = nn.Linear(24, action_dim)
    
    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        return self.fc3(x)

# 经验回放池
class ReplayBuffer:
    def __init__(self, capacity):
        self.buffer = deque(maxlen=capacity)
    
    def push(self, state, action, reward, next_state, done):
        self.buffer.append((state, action, reward, next_state, done))
    
    def sample(self, batch_size):
        return random.sample(self.buffer, batch_size)

五、总结与展望

DQN通过神经网络与强化学习的结合,在CartPole任务中展现了强大的环境适应能力。改进算法如Double DQN、PER等进一步提升了性能与稳定性。未来方向包括:

  1. 多智能体协同:探索分布式DQN在复杂控制任务中的应用。
  2. 连续动作空间扩展:结合DDPG算法处理CartPole的连续控制变体。
  3. 迁移学习:将CartPole训练模型迁移至物理机器人平台。

📚2 运行结果

部分代码:

% Create the environment (CartPole with discrete actions)
env = rlPredefinedEnv("CartPole-Discrete");

% Get observation and action info from the environment
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

% Define the critic network architecture
statePath = featureInputLayer(obsInfo.Dimension(1), ...
    "Normalization", "none", ...
    "Name", "state");

commonPath = [
    fullyConnectedLayer(24, "Name", "fc1")
    reluLayer("Name", "relu1")
    fullyConnectedLayer(24, "Name", "fc2")
    reluLayer("Name", "relu2")
    fullyConnectedLayer(numel(actInfo.Elements), "Name", "output")];

criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork, commonPath);
criticNetwork = connectLayers(criticNetwork, "state", "fc1");

% Manually define observation and action names
obsNames = {'state'};  % This is a cell array of char vectors

% Force each element to be a char vector and wrap in a cell array
actNames = cell(1, numel(actInfo.Elements));
for i = 1:numel(actInfo.Elements)
    actNames{i} = ['action', num2str(i)];
end

% Create critic representation
criticOpts = rlRepresentationOptions(...
    "LearnRate", 1e-3, ...
    "GradientThreshold", 1);

critic = rlQValueRepresentation(...
    criticNetwork, ...
    obsInfo, ...
    actInfo, ...
    "Observation", obsNames, ...
    "Action", actNames, ...
    criticOpts);

% Create DQN agent
agentOpts = rlDQNAgentOptions(...
    "SampleTime", env.Ts, ...
    "UseDoubleDQN", true, ...
    "TargetSmoothFactor", 1e-3, ...
    "DiscountFactor", 0.99, ...
    "MiniBatchSize", 64, ...
    "ExperienceBufferLength", 1e5);

agent = rlDQNAgent(critic, agentOpts);

% Set training options
trainOpts = rlTrainingOptions(...
    "MaxEpisodes", 500, ...
    "MaxStepsPerEpisode", 500, ...
    "ScoreAveragingWindowLength", 20, ...
    "Verbose", false, ...
    "Plots", "training-progress", ...
    "StopTrainingCriteria", "AverageReward", ...
    "StopTrainingValue", 475);

% Train the agent
trainingStats = train(agent, env, trainOpts);

% Save the trained agent and stats
save("trainedAgent.mat", "agent", "trainingStats");

🎉3 参考文献 

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)

[1]曹子建,郭瑞麒,贾浩文,等.演化算法的DQN网络参数优化方法[J].西安工业大学学报, 2024, 44(2):219-231.

[2]梁星星.基于预测编码的样本自适应行动策略智能规划研究[D].国防科技大学,2022.

[3]陈建平,邹锋,刘全,等.一种基于生成对抗网络的强化学习算法[J].计算机科学, 2019

🌈Matlab代码实现

资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

                                                           在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值