初始化Q-table
比如当环境变成动态障碍物时,传统方法需要重新建模,而DQN只需要调整输入特征——把障碍物位置也作为网络输入的一部分,网络自己会学习规避模式。曾经在仓库AGV项目里,8x8的固定货架布局,Q-learning训练10分钟就能收敛,而DQN折腾半天效果差不多。代码别写太复杂,先确保奖励函数设计合理——很多人翻车都是因为奖励没设计好,比如忘记给时间步长惩罚,导致智能体在原地转圈刷分...(别问我怎么知道
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。代码别写太复杂,先确保奖励函数设计合理——很多人翻车都是因为奖励没设计好,比如忘记给时间步长惩罚,导致智能体在原地转圈刷分...(别问我怎么知道的)

更多推荐
所有评论(0)