基于搜索的路径寻找方法(Dijkstra, A*和Jump Point Search)

路径规划——搜索算法详解(一):Dijkstra算法详解与代码 一文带你搞定Dijkstra算法!(附带c++实现代码) 阅读详情

对解空间的定义

在这里插入图片描述
先看我们会遇到的一个问题。上图描述了在地图中不同机器人的形状和尺寸。因为形状和尺寸的差异让碰撞检测问题变得非常复杂。很自然我们会想能不能仅用一个点来描述机器人呢?忽略掉形状和尺寸的差异。这大大减小了路径寻找的复杂度。所以有了下图描述的解决方案。
在这里插入图片描述
黑色块为障碍物,包裹在障碍物周围的是根据机器人形状大小生成的膨胀层。对于复杂的机器人形状则通常使用简单的形状去近似。而机器人在地图中就直接简化成一个点了。可以看到机器人形状大小不同,生成的膨胀层也不同。而我们需要寻找的路径就在地图中除了障碍物和膨胀层的自由空间中,也就是解存在的空间。在进行路径搜索前必须先做这样的简化处理。

认识状态空间图

状态空间图的基本概念

在这里插入图片描述
图通常包含节点和边。对于某些图,其边的代价是一样的。而有些则每条边的代价都不样。而代价值在后面介绍的搜索算法中会有用到。它会参与决定搜索的方向。
在这里插入图片描述
有些图的边存在方向性,有些则不存在。

常见的状态空间图

在这里插入图片描述
这是一个通过概率方法生成的图。节点与节点之间的边具有不同的代价值。
在这里插入图片描述
基于栅格的图是本篇文章重点关注的图。每一个栅格就是一个节点。而边就是节点与节点间的连线。
在这里插入图片描述
每一个节点有8个搜寻方向。4个对角方向边的代价值为 2 \sqrt2 2 ​,其余邻近的4个方向边的代价值为1。通常它是单向的,扩展了的栅格不会重复扩展。

路径搜寻方法的基本思路

在这里插入图片描述
路径搜索通常是从起点开始构建一个搜索树。但我们不总是将整个树都生成出来。这样树会非常大。路径搜索问题就是想办法扩展更少的节点花费更少的时间来找到目标节点。它通常包含下面几个主要步骤:

  1. 以开始节点为根节点初始化一个容器
  2. 将扩展的节点添加到容器中
  3. 根据得分规则弹出容器中的一个节点
  4. 获取该节点的所有邻居节点
  5. 把所有邻居节点添加到容器中

重复3~5步骤,直到找到目标节点或者穷尽了容器里所有的节点但仍然没有找到目标节点。需要注意的是,已经从容器中移除的节点是不会再加入到容器的。而整个搜寻算法最关键的部分就是怎么从容器中弹出最合适的节点,从而更快的找到目标节点。

Depth First Search (DFS)

在这里插入图片描述
深度优先搜索其实维护的是一个堆栈结构。
在这里插入图片描述
深度优先搜索基本就是一条道走到黑,再回到上一个有分支的节点,走该节点的下一个分支。

Breadth First Search (BFS)

在这里插入图片描述
广优先搜索其实维护的是一个队列结构。
在这里插入图片描述
广优先搜索先将同一级的节点压到队列中,上一级的节点处理完后再进行下一级节点的处理。
在这里插入图片描述
广度优先搜索总是等可能的向8个方向扩展,最终接触到目标点,输出一条最优路径。深度优先搜索则只能得到次优的路径。所以通常是使用广度优先搜索的方法来寻找路径。

Dijkstra

之前我们说路径搜索的关键是怎么从容器中弹出一个合适的扩展节点。Dijkstra累计计算从开始点到当前节点的代价值,并用g(n)表示。它为容器中的每一个节点计算g(n)值。弹出g(n)最小的节点作为后续扩展的节点。
算法流程:
在这里插入图片描述
Dijkstra使用g(n)来寻找移动代价最低的扩展点。但移动代价低的方向可能不只一个方向,所以它会向多个方向进行搜索。这样其实就花费了更多的时间。
在这里插入图片描述
这个图描述了其扩展的方向性。
在这里插入图片描述
Breadth First Search是按照压入队列的顺序,先入先出来弹出。所以它是均匀的向四周扩展。因为中间绿色的方块的移动代价要高。Dijkstra则生成了一条避开中间绿色方块的路径。

在这里插入图片描述
但对于栅格地图来说,因为每个方块的移动代价是均匀的(即uniform cost search),Dijkstra仍然是向各个方向均等的扩展。注意这里是允许对角扩展的。

启发式搜索(Heuristic search)

在这里插入图片描述
启发函数的作用就是建立一个规则。通过这个规则对容器中的节点都计算一个得分。对得分进行排序,选出得分最低的节点作为下次扩展的节点。得分的计算有多种方式。尽量选择计算简便的,因为它需要执行很多次。太复杂的启发函数可能影响算法的执行效率。上图中显示了两种常见的启发函数:

  • 欧式距离
  • 曼哈顿距离
贪心算法(Greedy Best First Search)

Greedy Best First Search仅使用启发函数来计算节点得分。弹出容器中得分最小的节点作为扩展节点。
在这里插入图片描述
Greedy Best First Search相对于Breadth First Search有更强的目标导向。启发函数会帮助它找到合适的扩展方向。所以它可以用更短的时间找到目标点。

在这里插入图片描述
但Greedy Best First Search在有障碍物的环境中常常不能得到最优解。

A*: Dijkstra with a Heuristic

A* 则在Dijkstra的基础上增加了启发函数。用g(n)表示节点累计的移动代价,用h(n)表示启发函数的计算值。A* 为容器中的每一个节点按照公式f(n)=g(n)+h(n)计算一个得分。每次循环则弹出一个容器中得分最小的节点来扩展。
在这里插入图片描述
上图显示了3种算法的主要差异。

A* 的算法流程如下:
在这里插入图片描述
Breadth First Search 和 Dijkstra总是能找到最优的路径,但它们需要花费更多的时间。Greedy Best First Search在有障碍物的环境里不一定能找到最优的路径,但它花的时间相对少。当h(n)的值小于实际节点到目标点的真实距离时,A能找到最短的路径。事实上,当h(n)足够小,A 将慢慢变成Dijkstra;而当h(n)变得足够大,A*将慢慢变成Greedy Best First Search。

工程优化上的考虑

我们希望路径搜索算法只需搜寻必要的节点来生成一条最优路径。但许多路径有相同的 f f f值。A* 将等可能的搜寻它们。所以思路应该是尽可能让不同的路径有不同的 f f f值。不同的 f f f值让A* 搜寻更少的节点。

思路一:使计算的h(n)更贴近实际的距离值
针对栅格地图,使用欧式距离计算的 h h h值常常和实际的真实距离相差较远。如果考虑栅格对角线的距离,使用下面的公式计算 h h h值,效果会有所改善。

d x = a b s (  node.  x −  goal.  x ) d x=a b s(\text { node. }x-\text { goal. } x) dx=abs( node. x− goal. x)
d y = abs ⁡ (  node.  y −  goal.  y ) \mathrm{d} y=\operatorname{abs}(\text { node. } y-\text { goal. } y) dy=abs( node. y− goal. y)
h = ( d x + d y ) + ( 2 − 2 ) ∗ min ⁡ ( d x , d y ) h=(d x+d y)+(\sqrt{2}-2) * \min (d x, d y) h=(dx+dy)+(2 ​−2)∗min(dx,dy)

在这里插入图片描述
思路二:轻微打破h(n)需要小于实际的距离值的规则
使用下面的公式计算 h h h值。

p <  minimum cost of one step   expected maximum path cost  p<\frac{\text { minimum cost of one step }}{\text { expected maximum path cost }} p< expected maximum path cost  minimum cost of one step ​

h = h × ( 1.0 + p ) \mathrm{h}=\mathrm{h} \times(1.0+\mathrm{p}) h=h×(1.0+p)
在这里插入图片描述
右边为使用了该方法进行改善所呈现的结果。

思路三:当有相同的 f f f值时,则比较 h h h值

Jump Point Search

Jump Point Search方法主要被应用于移动代价均匀的栅格地图(uniform-cost grid environments)。在这样的地图中比较容易出现 f f f值相等的路径。这样就导致其搜寻的节点增多,来回在 f f f相等的节点间跳动,消耗了更多的时间。Jump Point Search则制定了一系列的规则来寻找跳点(Jump Point),并将这些跳点加入到容器中。相比A等可能地扩展对称路径的所有节点,Jump Point Search只会扩展特定的几个节点,大大减少了搜寻路径的时间。
在这里插入图片描述
在这里插入图片描述
A
和JPS的代码流程上几乎是一样的,只是在扩展节点的方式上有差异。A* 将当前节点几何邻近的所有非障碍物节点都加入了容量中,JPS则只选择特定的几个节点(跳点)加入。

选择跳点的规则

跳点搜索是先进行水平和垂直方向的搜索,再到斜对角方向行进一步,然后再次进行水平和垂直方向的搜索。重复上述步骤,将搜寻的跳点加入到容器中。

Neighbor Pruning
在这里插入图片描述
注意:灰色为不考虑的搜寻方向,白色是将要搜寻的方向

对于水平搜寻和垂直搜寻,其搜寻路线均可用上图描述。针对1,2,6,7栅格,它们都可以不经过x栅格到达,并且移动代价会比经过x栅格更低。所以不考虑从这些栅格扩展。4栅格是已经搜寻过的栅格也不考虑。从4栅格到达3,8这两个栅格均有两条路径,并且移动代价相等。为了简化,认为它们经由2,7栅格到达更优,不必经过x栅格到达,所以也不考虑搜寻。最后就只剩下5作为搜寻方向。

在这里插入图片描述
注意:灰色为不考虑的搜寻方向,白色是将要搜寻的方向

对角线方向的搜寻的情况也和水平垂直方向搜寻类似。通过x栅格再到达1,4,7,8栅格的移动代价会更高。所以不考虑通过x栅格到达这四个栅格。6栅格是已经搜寻过的栅格,这里也不考虑。

Forced Neighbors
在这里插入图片描述
注意:图中黑色方块为障碍物,红色方块为Forced Neighbors,灰色为不考虑的搜寻方向,白色是将要搜寻的方向。

Forced Neighbors栅格是必须要通过x栅格才能到达的栅格。上图中,因为障碍物的遮挡红色栅格必须要经过x栅格才能到达。此时x栅格就是跳点(Jump Point)。需要将其加入到容器中。

另外,看到目标节点的效果和发现Forced Neighbors栅格是一样的 。都需要将对应的栅格认为是跳点,加入到容器中。
在这里插入图片描述

JPS优劣分析

JPS在大多数时候都是效果更好的。特别是在障碍物较多的场景。因为可以更快找到合适的跳点,而不用去搜寻大片没有障碍物的区域。但在较为空旷的环境里,因为需要花费更多的时间搜寻跳点,整体的效果就下来了。
在这里插入图片描述
JPS算法

在这里插入图片描述
A*算法

另外,JPS常常用在移动代价均匀的栅格地图里,在其他类型的地图里是不适用的。

https://zerowidth.com/2013/a-visual-explanation-of-jump-point-search.html这篇文章详细介绍了寻找Jump Point的各种规则
参考论文:http://users.cecs.anu.edu.au/~dharabor/data/papers/harabor-grastien-aaai11.pdf

参考材料

吐血推荐Amit Patel讲解A*的博客:https://www.redblobgames.com/pathfinding/a-star/introduction.html
http://qiao.github.io/PathFinding.js/visual/这里可以运行各种路径搜索算法,对比效果。
Daniel Harabor的发布的论文地址

关注公众号《首飞》回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2等机器人行业常用技术资料。

搜索——基于路径的搜索 但是有一种特殊情况,如果当所有节点间的边/权重都是相同的为一固定常数,那么BFS便是最优的(最常见的情况就是无权重图,或者是权重均为1)(一般地,如果路径代价是基于节点深度的非递减函数,那么BFS是最优的)。在图搜索时,DFS也非最优,这是因为DFS总是偏向于找到整棵树上靠左侧的解,并不能保证找到的解是最优的。接着,由于每一步的代价非负的,随着节点的增加路径不会变短。这是因为,BFS偏向于寻找整棵树中最浅的节点,如果解存在,那它一定位于有限层上,BFS一定会在有限步内找到该解。但是在图搜索算法下是完备的。 阅读详情

相关推荐

路径搜索问题

对简单路径问题的分析 问题:假设有这么一个二维数组,1代表墙不可以通过,0代表通路可以通过,试问给出起点(1, 1)和终点(7,7)可不可以给出一条通路、最短通路、以及所有通路(假设每个点都可以找八个方向)。(这些问题有人可能叫迷宫问题等,但是我理解的迷宫你只能知道起点的坐标,不能知道终点,所以对于知道起点和终点的问题我更愿意叫做路径搜索问题) 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1

weixin_51501165的博客 3321

人工智能:状态空间图(超详细经典例题讲解,通过例题教会你如何解决状态空间图问题)

状态空间常记为三元组:。 其中,S为初始状态的集合,F为操作的集合,G为目标状态的集合。 问题的状态空间图是一个描述该问题全部可能的状态及相互关系的有向图。 如考虑操作的代价,状态空间图就是一个赋值有向图。1、一个猎人要带着一只狼、一只羊、一捆草过河,但是人不在的时候,狼会吃羊、羊会吃草,猎人每次只能带一样东西过河。试构造状态空间图,并给出他们能顺利过河的方案。对于这种过河的题目,我们一般默认刚开始都在左岸,也只用分析左岸的情况,因为右岸的情况可以根据左岸的情况推出,比如左岸有一个狼人和一只羊......

俊夫小瞳的博客 2万+

Jump Point Search-跳点搜索法-原理&matlab代码-与A*算法比较(路径规划)

本文为JPS算法的原理,示例和代码一体的学习笔记。JPS根据当前结点current的方向、并基于跳点的策略来扩展后继节点,遵循“两个定义、三个规则”。

bob595078694的博客 1万+

常见路径搜索算法(DFS,贪心,BFS,Dijkstra,A*,D*)总结

从DFS和BFS开始的路径搜索

妖米的博客 5613

Search Based Path Planning

Search Based Pathing Planning 参考:https://www.bilibili.com/video/BV1yT4y1T7Eb Dijkstra 流程 从起点开始扩展,每一步为一个节点找到最短路径 cost:f(n) = g(n) g(n):当前路径,从起点到n的代价(距离) While true: 从open list选择代价最小的节点,收录进closed list 收录后遍历该节点的所有可访问邻节点,更新cost 最优性证明:反证法 特性 完备 最优 算法 开始

m0_46167617的博客 548

从A*到JPS:机器人路径规划算法演进史,以及为什么你该关注跳点搜索

本文深入探讨了从A*到跳点搜索(JPS)的路径规划算法演进史,揭示了JPS在机器人路径规划中的高效性能。通过对比Dijkstra、A*和JPS的算法效率,详细解析了JPS的核心机制及其在仓储物流、游戏AI等工业场景中的实战表现,为技术选型提供了实用指南。

weixin_30787531的博客 351

基于搜索的路径规划算法(Dijkstra and A*)

总结课程《深蓝学院移动机器人路径规划-高飞》 深度优先遍历:栈 广度优先遍历:队列 1.Dijkstra Dijkstra = 广度优先遍历 + 权重 在Dijkstra 算法中,相当于在每条路径上添加了权重。在每次弹出扩展点的时候,需要计算代价函数g(n)最小的节点。如果通过该节点所扩展得到的邻居节点并不在容器中,则需要直接添加进去。如果已经存在在容器中,则需要对比从该节点出发所得到的代价是否比其原有代价更小。 代价函数:f(n)=g(n) 2. A* A*= Dijkstra + 启发式 Dijk.

秃头队长 1572

VPI与Matlab协同仿真:相干光通信接收端DSP算法全解析

本文详细解析了如何利用VPI与Matlab协同仿真,构建完整的相干光通信接收端DSP算法处理闭环。重点介绍了从VPI导出数据后,在Matlab中实现时钟恢复、偏振解复用和载波相位估计等核心算法的步骤与原理,并阐述了如何通过误码率计算完成仿真验证,为相干光通信系统算法研究与验证提供了高效实用的方法。

ll5678的博客 610

基于搜索的路径规划

设节点坐标为 (node.x, node.y),起点为 (start.x, start.y),终点为 (goal.x, goal.y)在 A* 中,许多节点会出现相同的 f 值,如果不作区分,会导致算法效率下降。Jump Point Search 是一种针对栅格图的加速搜索方法,适用于具有均匀代价的网格(如 4/8 邻接网格)。JPS 的核心思想是跳过中间那些“没有必要检查”的节点,只在关键方向上进行跳跃式扩展,提高搜索速度。启发式搜索根据启发函数估计到目标的距离,从而优先扩展更“接近目标”的节点。

weixin_65874645的博客 749

避坑指南:STM32H7不同DMA控制器(MDMA/DMA2D/BDMA)到底该用哪个?

本文深入解析STM32H7系列芯片的DMA控制器选型策略,涵盖MDMA、DMA2D、BDMA等不同控制器的架构原理与性能对比。通过实际项目案例,提供高速TCM数据搬运、GUI加速、低功耗传输等场景的选型决策树,并分享性能优化与调试技巧,帮助工程师避开常见陷阱,提升系统效率。

weixin_26876073的博客 447

神经网络(十五)在VS Code下搭建PyTorch环境

pytorch在vscode中的配置和使用

就随便写写.... 5万+

移动机器人运动规划(二)--基于搜索的路径规划

继续我们的学习。本节课主要介绍了基于搜索的路径规划方法。

weixin_43619346的博客 2373

Qt上位机实战:5步搞定STM32 IAP固件升级(附拖拽文件处理技巧)

本文详细介绍了如何使用Qt开发STM32 IAP固件升级上位机。通过五个核心步骤,包括理解IAP机制、搭建Qt环境、实现拖拽文件加载、封装串口通信以及设计可靠通信协议,帮助开发者快速构建一个稳定、易用且支持图形化操作的固件升级工具,显著提升嵌入式产品开发与维护效率。

ss78901的博客 1076

运动规划一:基于搜索的路径搜索

基于搜索的路径搜索1.Graph Search Basis1.1 配置空间下的规划1.2 图搜索整体思想:1.3 图遍历2.Dijkstra and A*算法工程实现3. Jump Point Search4. Homework参考 1.Graph Search Basis 1.1 配置空间下的规划 工作空间:机器人有不同的形状和尺寸,进行碰撞检测就需要花费很多时间,并且较难。 配置空间:把机器人当成一个点,把障碍物进行膨胀,规划就进行了简化。 1.2 图搜索整体思想: 搜索树的节点,然后从目标点回溯到

W1H1J1的博客 380

用户存续期价值评估CLV(三) Gamma-Gamma模型 Python模拟

Gamma-Gamma模型 前面已经提到过,Pareto/NBD和BG/NBD模型只对客户存续时间和交易次数进行建模,并不涉及客户未来交易所带来的现金价值。 Gamma-Gamma模型就是对这个问题的一个扩展解决方案。 Gamma-Gamma模型做了如下假设: 从客户角度上来说,交易金额在每个客户的平均交易价值上随机波动。(这一点并不是很有说服力) 所观察到的交易价值均值是隐含价值均值 ????(????) 的非完美计量 交易价值均值在客户中是变化的,即使这个值是稳定的(这个假设非常大) 在客户中的平

weixin_43171270的博客 4368

STM32 W5500 Freemodbus Modbus TCP协议功能实现

STM32F103VCT6 W5500(SPI1),实现Modbus-TCP协议的功能

坚韧与专注 2万+

【深蓝学院】移动机器人运动规划--第2章 基于搜索的路径规划--笔记

【深蓝学院】移动机器人运动规划--第2章 基于搜索的路径规划--笔记

qq_37746927的博客 2488

华为OD机试 - 服务中心选址(Python)

一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。先输入区域数组positions的长度n(1 ≤ n ≤ 10^5)接下来 n 行每行输入成对的left和right值,以空格隔开。输出为location。

m0_46181452的博客 282

路径规划算法_路径规划金典算法汇总

Path Planning第1节基于图搜索的路径规划算法Dijkstra算法、A*算法、JPS(Jump Point Search)算法1、基本的图遍历算法---BFS and DFS1.DFS------remove or expand the deepest node in the container.(因为它维护的是一个堆栈,所以对于图中的节点来说是后进先出)2.BFS--...

weixin_39629947的博客 3149

win10解决IE浏览器安装不上的问题(卸载依然显示不能安装)

目前win10 系统不支持外部ie安装程序,所以必须用win10自带的应用来安装 一、错误的卸载的方式 在控制面板的当前安装的程序界面是看不到ie的,需要选择控制面板左上角的启用或关闭windows功能 将ie11前面的勾勾去掉 这种方法是很多网站上的误区,其实这并没有卸载成功ie只是把ie的功能关闭了,但是他还在你的电脑上。你可以理解为我们说的对文件夹执行的隐藏文件夹功能。那个隐藏的文件夹依...

清平乐的技术专栏 3万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

别再手动设计路线了,Python自动路径规划实战指南(稀缺资源)

告别繁琐的手动设计,用游戏AI路径规划Python实现智能寻路。涵盖A*、Dijkstra等核心算法,适用于2D/3D游戏开发与机器人导航场景,代码可复用、效率显著提升。实战案例解析+完整源码分享,值得收藏。

Instrustar的博客 1133

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

2基于图搜索路径规划-深蓝学院

basis 深蓝学院路径规划2basisconfiguration spacespace obstacleGraph and Search Methodbreadth First Search(BFS) vs Depth First SearchGreedy Best First Search(heuristic)Dijkstra & A*Jump Point SearchHW作业 configuration space 所有点的位姿描述 • Robot configuration: a speci

qq_37087723的博客 2644

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

移动机器人运动规划--基于搜索的全局路局规划

移动机器人运动规划–基于搜索的全局路局规划 由于种种原因导致我又回过去将运动规划方面的知识做一个复习。=_= 文章目录移动机器人运动规划--基于搜索的全局路局规划前言一、基础搜索算法二、使用步骤1.引入库2.读入数据总结 前言 基于图搜索算法的总体流程: Graph Search Overview 维护一个容器,这个容器存储将来要被访问的节点 容器初始放置的是起始节点 Loop \quad根据某种指标从容器中弹出一个节点 \quad扩展该节点,获得所有的邻居节点

weixin_44423355的博客 698

Matlab实现A*、Dijkstra和Dstar路径规划算法对比

路径规划是机器人导航和自动驾驶领域的核心技术,通过图搜索算法在环境地图中寻找最优路径。Dijkstra算法作为基础广度优先搜索,保证找到最短路径但效率较低;A*算法引入启发式函数,在保持最优性的同时显著提升搜索效率;Dstar算法则专注于动态环境中的增量式重规划。这三种经典算法在Matlab中的实现,不仅帮助理解路径规划原理,也为机器人运动控制、无人机航迹规划等工程应用提供基础解决方案。通过可视化比较不同算法在搜索效率、路径质量方面的表现,开发者可以针对静态或动态场景选择合适的规划策略。

weixin_30596023的博客 448

A*寻路算法:从核心原理到Python实现与优化

路径规划是计算机科学和人工智能中的基础问题,旨在寻找从起点到目标点的最优或可行路径。其核心原理在于通过评估不同路径的代价,在状态空间中进行有导向的搜索。A*算法融合了Dijkstra算法的最优性保证和贪心搜索的效率导向,通过引入启发式函数,极大地缩小了搜索范围,在游戏开发、机器人导航和物流调度等领域具有极高的技术价值。本文以网格地图为例,深入解析了A*算法的三要素——实际代价G(n)、启发估计H(n)和综合优先级F(n),并提供了清晰的Python实现代码。同时,探讨了启发函数选择、权重A*、Jump Po

weixin_33997389的博客 504

【游戏AI路径规划Python】:揭秘5大核心算法与实战代码实现

掌握游戏AI路径规划Python核心方法,本文详解A*、Dijkstra等5大算法原理与优化技巧,涵盖网格寻路、障碍规避等实战场景。代码基于Python实现,高效易用,助你快速构建智能角色移动系统,值得收藏。

FastProceed的博客 684
上一篇: 对LOAM算法原理和代码的理解
下一篇: Navigation:costmap是什么?
首飞爱玩机器人
博客等级 码龄14年 6989粉丝 120原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首飞爱玩机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值