qlearning,dqn路径规划

今天聊聊强化学习里两个经典玩法——Q-learning和DQN在路径规划中的应用。直接上干货,咱们先从一个简单的网格世界开始。假设我们有个5x5的网格,机器人要从左下角移动到右上角,碰到墙得绕路。用Q-learning的话,先搞个Q-table记录每个状态-动作对的预期收益:

import numpy as np

q_table = np.zeros((25, 4))  # 25个状态,4个动作(上下左右)
alpha = 0.1  # 学习率
gamma = 0.9  # 折扣因子

# 动作映射
actions = {
    0: (-1, 0),  # 上
    1: (1, 0),   # 下 
    2: (0, -1),  # 左
    3: (0, 1)    # 右
}

每次移动时用ε-greedy策略选择动作,更新规则是核心:

current_state = 0  # 假设当前状态编号
action = np.argmax(q_table[current_state])  # 选最大Q值的动作

# 执行动作后得到新状态和奖励
new_state = 5  
reward = 10 if new_state == 24 else -1  # 到达终点奖励10,否则-1

# Q-learning更新公式
q_table[current_state, action] = (1 - alpha) * q_table[current_state, action] + \
                                 alpha * (reward + gamma * np.max(q_table[new_state]))

这方法在简单环境表现不错,但遇到复杂环境就歇菜了。比如地图变成20x20,或者状态特征变成连续坐标(x,y),Q-table直接爆炸——这就是维度灾难。这时候就该DQN上场了。

DQN用神经网络替代Q-table,输入状态直接输出各个动作的Q值。上代码更直观:

import torch
import torch.nn as nn

class DQN(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Sequential(
            nn.Linear(2, 64),  # 输入是坐标(x,y)
            nn.ReLU(),
            nn.Linear(64, 4)    # 输出四个动作的Q值
        )
    
    def forward(self, x):
        return self.fc(x)

# 经验回放池
class ReplayBuffer:
    def __init__(self, capacity):
        self.buffer = collections.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)

关键点来了——经验回放和双网络。每次更新时从回放池随机采样,打破数据相关性;目标网络定期更新,稳定训练:

# 训练片段
for episode in range(1000):
    state = env.reset()
    while True:
        # ε-greedy选择动作
        if np.random.rand() < epsilon:
            action = env.action_space.sample()
        else:
            with torch.no_grad():
                q_values = model(torch.FloatTensor(state))
                action = torch.argmax(q_values).item()
        
        next_state, reward, done, _ = env.step(action)
        
        # 存入经验池
        replay_buffer.push(state, action, reward, next_state, done)
        
        # 从池子采样训练
        if len(replay_buffer) > batch_size:
            batch = replay_buffer.sample(batch_size)
            # 此处省略具体训练代码...
            
        state = next_state
        if done:
            break

在路径规划中,DQN比Q-learning强在哪?比如当环境变成动态障碍物时,传统方法需要重新建模,而DQN只需要调整输入特征——把障碍物位置也作为网络输入的一部分,网络自己会学习规避模式。实测在Gazebo仿真中,用激光雷达数据(20维输入)做路径规划,DQN比Q-learning成功率提升40%以上。

qlearning,dqn路径规划

不过别急着无脑上DQN,小规模场景用Q-learning反而更快。曾经在仓库AGV项目里,8x8的固定货架布局,Q-learning训练10分钟就能收敛,而DQN折腾半天效果差不多。所以具体选哪个得看场景复杂度——状态空间超过1万维再考虑上深度网络,否则传统方法更香。

最后给个实践建议:先拿Q-learning快速验证可行性,遇到状态爆炸或者动态环境再切DQN。代码别写太复杂,先确保奖励函数设计合理——很多人翻车都是因为奖励没设计好,比如忘记给时间步长惩罚,导致智能体在原地转圈刷分...(别问我怎么知道的)

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐