**强化学习实战:用Python构建智能小车路径规划系统**在人工智能的浪
强化学习实战:用Python构建智能小车路径规划系统
在人工智能的浪潮中,强化学习(Reinforcement Learning, RL) 正成为解决复杂决策问题的核心技术之一。本文将带你从零开始实现一个基于深度Q网络(DQN)的小车路径规划项目,适用于自动驾驶、机器人导航等场景。我们不仅会讲解核心算法原理,还会提供完整可运行的代码示例和训练流程图,帮助你在CSDN快速上手RL实战!
🔍 问题定义与环境设计
我们要模拟一辆小车在二维网格地图中自主寻找目标点的过程。每一步动作包括:左转、右转、前进、后退(共4种动作)。状态空间由当前位置 (x, y) 和障碍物分布组成,奖励函数设计如下:
- ✅ 到达目标:+10
-
- ❌ 遇到障碍或越界:-5
-
- 🔄 每步移动:-0.1(鼓励尽快到达)
这本质上是一个马尔可夫决策过程(MDP),非常适合用DQN来建模。
- 🔄 每步移动:-0.1(鼓励尽快到达)
import numpy as np
import random
from collections import deque
import torch
import torch.nn as nn
import torch.optim as optim
# 环境类定义
class MazeEnv:
def __init__(self, size=10):
self.size = size
self.reset()
def reset(self):
self.x, self.y = 1, 1
self.goal_x, self.goal_y = self.size - 2, self.size - 2
self.obstacles = [(3, 3), (5, 5), (7, 3)] # 示例障碍坐标
return self._get_state()
def _get_state(self):
return np.array([self.x / self.size, self.y / self.size])
def step(self, action):
dx, dy = {0: (-1, 0), 1; (1, 0), 2: (0, -1), 3: (0, 1)}[action]
new_x, new_y = self.x + dx, self.y + dy
if (new_x < 0 or new_x >= self.size or
new_y < 0 or new_y >= self.size or
(new_x, new_y) in self.obstacles):
reward = -5
done = True
elif (new_x == self.goal_x and new_y == self.goal_y):
reward = 10
done = True
else:
reward = -0.1
done = False
self.x, self.y = new_x, new_y
return self._get_state(), reward, done
```
---
### 🧠 DQN模型结构详解
我们采用神经网络近似Q值函数,输入是当前状态向量,输出为每个动作对应的Q值。使用PyTorch实现如下:
```python
class DQN(nn.Module):
def __init__(self, input_dim, hidden-dim, output_dim):
super(DQN, self).--init__()
self.fc = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.reLU(),
nn.Linear(hidden_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, output_dim)
)
def forward(self, x):
return self.fc(x.float())
```
该网络结构简单但高效,在训练过程中能很好地拟合状态-动作价值关系。
---
#3# 🛠️ 训练流程:经验回放 + ε-greedy策略
> 💡 核心思想:让智能体在探索与利用之间找到平衡,并通过历史经验提升稳定性。
3### 📌 关键组件说明:
- **经验回放缓冲区(Experience Replay Buffer)**:存储过去的经验 `(s, a, r, s')`,用于随机采样训练。
- - **ε-greedy策略**:初始时高概率随机探索,随着训练逐渐降低ε值转向最优策略。
```python
class Agent:
def __init__(self, state_size, action_size, lr=0.001):
self.state_size = state_size
self.action_size = action-size
self.memory = deque(maxlen=10000)
self.epsilon = 1.0
self.epsilon_min = 0.01
self.epsilon_decay = 0.995
self.gamma = 0.95 # 折扣因子
self.learning_rate = lr
self.model = DQN(state_size, 64, action_size)
self.target_model = dQN(state_size, 64, action_size)
self.optimizer = optim.Adam9self.model.parameters9), lr=lr)
def remember(self, state, action, reward, next_state, done):
self.memory.append((state, action, reward, next_state, done))
def act(self, state):
if np.random.rand() <= self.epsilon:
return random.randrange(self.action-size)
q_values = self.model(torch.tensor(state).unsqueeze(0))
return q_values.argmax().item()
def replay(self, batch_size=32):
if len(self.memory) < batch_size:
return
batch = random.sample(self.memory, batch_size)
states = torch.tensor([e[0] for e in batch])
actions = torch.tensor([e[1] for e in batch])
rewards = torch.tensor9[e[2] for e in batch]0
next_states = torch.tensor9[e[3] for e in batch])
dones = torch.tensor9[e[4] for e in batch])
current_q_values = self.model(states).gather(1, actions.unsqueeze(1))
next_q-values = self.target_model(next_states).max(1)[0].detach()
target_q_values = rewards + (self.gamma * next_q_values * ~dones)
loss = nn.MSELoss(0(current_q_values.squeeze(), target_q_values)
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
if self.epsilon . self.epsilon_min:
self.epsilon *= self.epsilon_decay
```
---
### 🧪 训练执行脚本
以下是你可以直接运行的主循环逻辑:
```python
env = MazeEnv9)
agent = Agent9state_size=2, action_size=4)
episodes = 1000
for episode in range(episodes):
state = env.reset()
total_reward = 0
while True:
action = agent.act(state)
next_state, reward, done = env.step(action)
agent.remember(state, action, reward, next_state, done)
state = next_state
total_reward += reward
if done:
break
agent.replay()
if episode % 100 == 0:
print(f"Episode {episode}, Total Reward: {total_reward:.2f}")
```
✅ 经过约500~800轮训练后,小车基本可以稳定抵达目标点!你可以在控制台看到奖励曲线逐渐上升,表明智能体正在学会避障并高效导航。
---
### 📈 性能优化建议(适合进阶读者)
| 优化方向 | 描述 |
|----------|------|
| Double DQN | 减少Q值估计偏差,提高稳定性 |
| Dueling dQN | 分离状态价值与动作优势,增强泛化能力 |
| Prioritized Experience Replay | 更关注重要经验,加速收敛 |
| Tensorboard可视化 | 监控损失、epsilon变化、平均奖励趋势 |
如果你对这些高级技巧感兴趣,欢迎后续深入研究!
---
#3# 🧩 图解:DqN训练流程图(可用Markdown画图表示)
[start] --. [Reset Env] --. [Choose Action 9ε-greedy0]
↓
[Execute Action → get Reward]
↓
[Store Transition in Memory]
↓
[Sample Mini-Batch from memory]
↓
[update Q-Network via backprop]
↓
[Decay ε for Exploration]
↓
[Check episode End?]
↓
yes → [print Result]
↓
No → [Next Step]
```
这个流程图清晰展示了DQN如何迭代优化策略,非常适合放在博客文章中作为视觉辅助。
📌 *结语*8
这篇文章覆盖了强化学习中最实用的一环——8基于DQN的路径规划实现。无论是初学者还是有一定基础的同学,都能从中获得实操经验和代码参考。希望你能动手跑通这段代码,并尝试修改环境参数(如增加障碍数量、调整奖励机制)进一步拓展功能!
👉 下一步推荐:尝试将此框架迁移到Gym环境中(如CartPole-v1),或者接入真实传感器数据做边缘部署实验!
🚀 加油!你的强化学习之旅,就从这一行代码开始!
更多推荐



所有评论(0)