news 2026/4/18 13:27:57

强化学习代码-利用Q-learning实现三维世界的路径规划-002 可以保存和读取策略、Py...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
强化学习代码-利用Q-learning实现三维世界的路径规划-002 可以保存和读取策略、Py...

强化学习代码-利用Q-learning实现三维世界的路径规划-002 可以保存和读取策略、Python+TensorFlow 内容:在三维的立体空间中,存在大量的障碍物,如何规避障碍物,找到一条从初始点到终点的最优路径,改程序通过强化学习Q-learning的方法寻找到一条最优路径。 图中蓝色点表示可用走路径,黑色点表示障碍物

当我们把路径规划问题搬到三维空间,事情就开始变得有意思了。想象你操控的无人机不仅要避开摩天大楼,还得在立体交通网里找到最短路线——这可比平面导航刺激多了。今天咱们用最经典的Q-learning算法,手把手实现个能保存经验的智能体。

先来搭环境骨架。咱们用三维网格世界,障碍物用坐标黑名单实现:

class GridWorld3D: def __init__(self, size=10): self.size = size self.obstacles = set() for _ in range(int(size*0.3)): x, y = np.random.randint(0, size, 2) self.obstacles.update({(x,y,z) for z in range(size)}) def is_valid(self, pos): return (0 <= pos[0] < self.size and 0 <= pos[1] < self.size and 0 <= pos[2] < self.size and tuple(pos) not in self.obstacles)

这里有个小技巧:用集合存储障碍物坐标,判断碰撞时直接查表比遍历列表快10倍不止。注意我们生成的是贯穿整个高度的柱状障碍,模拟现实中的建筑物。

接下来是重头戏Q-learning的实现。考虑到三维状态空间爆炸问题,咱们用字典实现稀疏存储:

class QAgent: def __init__(self, alpha=0.1, gamma=0.9): self.q_table = defaultdict(lambda: np.zeros(6)) # 6个移动方向 self.alpha = alpha # 学习率 self.gamma = gamma # 折扣因子 def get_action(self, state, epsilon): if np.random.rand() < epsilon: return np.random.randint(6) else: return np.argmax(self.q_table[state])

这里用defaultdict自动处理未访问过的状态,避免初始化整个状态空间。动作对应六个移动方向:±x, ±y, ±z,相当于在三维网格中上下左右前后移动。

强化学习代码-利用Q-learning实现三维世界的路径规划-002 可以保存和读取策略、Python+TensorFlow 内容:在三维的立体空间中,存在大量的障碍物,如何规避障碍物,找到一条从初始点到终点的最优路径,改程序通过强化学习Q-learning的方法寻找到一条最优路径。 图中蓝色点表示可用走路径,黑色点表示障碍物

训练循环的关键在于奖励设计。咱们给成功到达终点+100奖励,碰撞-50,每步-1鼓励最短路径:

def train(env, agent, episodes=1000): epsilon = 1.0 for ep in range(episodes): state = env.start_pos while True: action = agent.get_action(state, epsilon) next_pos = move(state, action) # 根据动作计算新坐标 reward = -1 if not env.is_valid(next_pos): reward = -50 next_pos = state # 碰撞后停留在原地 elif next_pos == env.goal: reward = 100 # Q值更新公式 old_q = agent.q_table[state][action] max_next_q = np.max(agent.q_table[next_pos]) new_q = (1 - agent.alpha)*old_q + agent.alpha*(reward + agent.gamma*max_next_q) agent.q_table[state][action] = new_q # 更新状态 state = next_pos if state == env.goal or ep % 100 == 0: break epsilon *= 0.995 # 探索衰减

注意当撞墙时让智能体留在原地,这比直接结束回合更能训练出避障能力。epsilon的指数衰减让智能体从随机探索逐步过渡到利用已有经验。

模型保存用TensorFlow的Saver虽然有点杀鸡用牛刀,但确实方便:

def save_model(sess, q_table, path='model'): # 将字典转为Tensor states = tf.constant(list(q_table.keys()), name='states') q_values = tf.constant([q_table[k] for k in q_table], name='q_values') saver = tf.train.Saver() sess.run(tf.global_variables_initializer()) saver.save(sess, path) def load_model(path): sess = tf.Session() saver = tf.train.import_meta_graph(path+'.meta') saver.restore(sess, path) states = sess.run('states:0') q_values = sess.run('q_values:0') return {s:q for s,q in zip(states, q_values)}

这里有个坑:直接保存Python字典会丢失类型信息,转成Tensor再存更可靠。恢复时要注意Tensor的命名空间,建议在保存时显式指定name参数。

实际跑起来后会发现,在10x10x10的网格中,大约训练500次后智能体就能稳定找到无障碍最优路径。遇到复杂障碍时,可以通过以下方法提升表现:

  1. 增加ε衰减周期,让探索更充分
  2. 对重复撞墙的行为施加额外惩罚
  3. 在状态编码中加入周边障碍信息

最后说个实战技巧:用matplotlib的scatter3D做可视化时,把探索过的路径用淡蓝色半透明显示,最优路径用红色高亮,障碍物用黑色立方体,一眼就能看出智能体是不是在"抄近道"。

完整代码已打包放在Github,包含预训练模型和交互式演示。下次遇到三维路径规划,别急着上A*,试试这个会自己成长的方案说不定有惊喜。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 20:15:49

20250124树的直径总结

树 需要说吗&#xff1f; 直径 直径为树上一条边权和最长的简单路径&#xff0c;以下是直径的一些常用性质&#xff1a; 树的直径不一定唯一树的直径的端点一定是度数为1的点若直径有数条&#xff0c;那么所有直径交汇于至少一点树上任一点距离其最远的点一定是直径的两个端点之…

作者头像 李华
网站建设 2026/4/18 10:52:12

聊聊微网动态经济调度中场景生成与削减那些事儿

[1]关键词&#xff1a;场景生成&#xff1b;场景削减&#xff1b;概率分布&#xff1b;随机优化 [2]参考文献&#xff1a;《一种在微网动态经济调度中考虑风电随机性的方法》 [3]主要内容&#xff1a;Matlab 采用正态分布和韦布尔分布描述风电&#xff0c;光伏和负荷概率分布&a…

作者头像 李华
网站建设 2026/4/18 8:10:06

华为OD机考双机位C卷 - 最佳植树距离(Java Python JS C/C++ GO )

最新华为上机考试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 华为OD机考双机位C卷 - 最佳植树距离 题目描述 按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带。由于有些区域目前不适合种植树木,所以只能在一…

作者头像 李华
网站建设 2026/4/18 9:42:51

华为OD机考双机位C卷 - 荒岛求生 (Java Python JS C/C++ GO )

最新华为上机考试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 华为OD机考双机位C卷 - 荒岛求生 题目描述 一个荒岛上有若干人,岛上只有一条路通往岛屿两端的港口,大家需要逃往两端的港口才可逃生。 假定每个人移动的速度一样,且只可选择向左或向右逃生…

作者头像 李华
网站建设 2026/4/18 2:14:21

PLC在电网备用电源自动投入中的奇妙应用:双电源切换组态解析

No.495 PLC 在电网备用电源自动投入中应用双电源切换组态有 带解释的梯形图接线图原理图图纸&#xff0c;io分配&#xff0c;组态画面 在电网系统中&#xff0c;备用电源自动投入装置对于保障供电的连续性和稳定性至关重要。今天咱们就唠唠PLC&#xff08;可编程逻辑控制器&am…

作者头像 李华
网站建设 2026/4/18 8:01:23

自动驾驶规划与控制算法:经验与理论的交融

规划及控制算法理论分析&#xff0c; 涵盖详细的自动驾驶规划及控制模块的算法理论&#xff08;规划大约有18页&#xff0c;控制大约有17页&#xff09;。 其中规划模块主要围绕Apollo6.0实现的EMplanner展开&#xff0c;控制算法详细叙述了常用控制算法包括PID、模糊控制、LQR…

作者头像 李华