news 2026/4/15 21:31:14

强化学习代码-利用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/3 6:28:28

基于Transformer的行为分析模型架构设计

基于Transformer的行为分析模型架构设计 关键词:Transformer架构、行为分析、自注意力机制、时序建模、多模态融合 摘要:本文将带您走进"基于Transformer的行为分析模型"的世界。我们会从生活中常见的"行为观察"场景出发,用"侦探破案"的故事类…

作者头像 李华
网站建设 2026/4/15 20:04:47

光伏直流微网这玩意儿听起来高大上,实际拆解起来核心就三件事:怎么让太阳能板拼命发电,怎么让电池聪明地充放电,怎么稳住系统电压别崩盘。咱今天不整虚的,直接上干货

光伏直流微网储能系统 pv电池模型建立&#xff1b;mppt最大功率点跟踪&#xff1b;控制策略&#xff1b;以及蓄电池储能&#xff1b;另外附模型参考文献&#xff01; 有需要附带视频讲解 在传统的独立光伏发电系统中&#xff0c;蓄电池直接与直流母线相连接&#xff0c;其充放电…

作者头像 李华
网站建设 2026/4/11 2:10:25

咱们搞信号处理的老司机,谁没被噪声折磨过?今天来唠唠几种滤波方法的实战体验,带点代码实操,直接上干货不废话

几种常用信号滤波方法对比&#xff1b; 高斯滤波&#xff1b; EEMD分解&#xff1b;集合经验模态分解&#xff1b;补充的集合经验模态分解&#xff1b; 小波分解&#xff1b;高斯滤波——简单粗暴的老司机先整点高斯滤波&#xff0c;这货简直就是快速去噪的万金油。看这段Pytho…

作者头像 李华
网站建设 2026/4/15 17:19:34

基于nRF52832的SD卡文件系统操作实现指南

一、硬件连接与配置引脚映射 nRF52832的SPI接口与SD卡引脚对应关系&#xff08;以SPI0为例&#xff09;&#xff1a;SD卡引脚nRF52832引脚功能说明CSP0.17片选信号&#xff08;主动低电平&#xff09;SCKP0.19时钟信号MOSIP0.20主设备输出/从设备输入MISOP0.21主设备输入/从设备…

作者头像 李华
网站建设 2026/4/10 19:34:23

P6KE7.5CA双向 TVS瞬态抑制二极管:7.5V单元智能家居中控专用

双向P6KE7.5CAtvs瞬态电压抑制二极管P6KE7.5CA双向 TVS瞬态抑制二极管 二极管产品已经跟我们的生活有着密不可分的联系了&#xff0c; TVS瞬态抑制二极管&#xff0c;是一种高效能保护二极管&#xff0c;产品体积小、功率大、响应快等诸多优点&#xff0c;产品应用广泛 TVS瞬态…

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

滑模与终端滑模(SMC):控制领域的奇妙之旅

滑模 终端滑模 smc 在控制理论的广阔天地里&#xff0c;滑模控制&#xff08;Sliding Mode Control&#xff0c;SMC&#xff09;宛如一颗璀璨的明珠&#xff0c;而终端滑模则是在其基础上进一步发展的瑰宝。今天&#xff0c;咱们就来唠唠这滑模和终端滑模到底是啥神奇玩意儿。…

作者头像 李华