上篇博客中介绍了一些基本的图搜索算法,其中也重点介绍了基于势场来实现的Dijkstra算法。本篇博客将介绍关于Heuristic Function的图搜索算法


开源了一个结合Dijkstra,Greedy,以及Astar算法的代码,更新在了博主的github主页上,链接见文末


1. Greedy Best First Search Algorithm(贪心算法)

如上篇博客所介绍,BFS与Dijstra算法在搜索目标时是向所有方向进行节点拓展的。如果任务中是需要向多个目标点进行搜索,那么此类方法显然是合适的。但是如果仅仅只是需要向一个目标点进行搜索,那么这样的搜索会增加很多不必要的耗时。
那么此时我们可以尝试,将Dijkstra中的计算距离起点的cost修改为距离终点的cost。将节点的扩展导向终点。这种方法就可以称为贪心算法。
在贪心算法中,首先我们需要定义一个heuristic function来表述当前点距离终点的远近,通常我们会采用曼哈顿距离或者欧拉距离来实现此需求

1.1 算法伪代码

frontier = PriorityQueue()
frontier.put(start, 0)
came_from = dict()
came_from[start] = Nonewhile not frontier.empty():current = frontier.get()if current == goal:breakfor next in graph.neighbors(current):if next not in came_from:priority = heuristic(goal, next)frontier.put(next, priority)came_from[next] = current

1.2 效果对比

上图对比了Dijkstra与Greedy算法之间的效果区别,可以看出,

  • 当地图中没有障碍物遮挡时,Greedy算法的搜索范围以及效率是高于Dijkstra的,因为它让搜索更加具有目的性
  • 当地图中存在障碍物特别是凹形障碍物遮挡时,由于Greedy算法仅考虑与终点的距离,常常会造成"短视"的现象即距离障碍物特别近时才会改变方向重新搜索路径去往终点

2. Astar Algorithm(A* 算法)

上部分Greedy算法展示了引入终点因素后对于搜索算法的影响,其优点与缺点通过效果对比图可以清楚的看出。为了解决单纯考虑终点因素而导致的"短视"问题,我们引入了一个更加均衡的算法,Astar算法。

2.1 算法由来及定义

Astar算法既考虑了距离起点的actual cost同时也考虑了距离终点的heuristic cost,与Dijkstra以及Greedy算法相比较:

  • 与Dijkstra相比,Astar由于考虑与终点的距离因素,因此搜索上会减少很多无效搜索
  • 与Greedy算法相比,Astar通常可以搜索出最短路径(当Heuristic function距离采用曼哈顿距离时)

Astar中每个栅格的cost可以用以下公式表示:
f(n)=g(n)+h(n)f(n) = g(n) + h(n)f(n)=g(n)+h(n)
其中,
g(n)g(n)g(n)表示当前栅格与起点的actual cost
h(n)h(n)h(n)表示当前栅格距离终点的heristic cost
当g(n)g(n)g(n)恒等于0时,算法则变成了Greedy算法;当h(n)h(n)h(n)恒等于0时,算法则是Dijkstra算法。

2.2算法伪代码

frontier = PriorityQueue()
frontier.put(start, 0)
came_from = dict()
cost_so_far = dict()
came_from[start] = None
cost_so_far[start] = 0while not frontier.empty():current = frontier.get()if current == goal:breakfor next in graph.neighbors(current):new_cost = cost_so_far[current] + graph.cost(current, next)if next not in cost_so_far or new_cost < cost_so_far[next]:cost_so_far[next] = new_costpriority = new_cost + heuristic(goal, next)frontier.put(next, priority)came_from[next] = current

2.3 效果对比

上述部分分别介绍了Dijkstra,Greedy以及Astar算法的原理以及优缺点,下图展示了同样起终点以及地图的情况下各个算法的特点:

  1. Dijkstra算法搜索时间较长,搜索范围较大,但是可以搜索出最短路径
  2. Greedy算法搜索时间较短,搜索范围较小,但是路径不是最短路径
  3. Astar算法搜索时间较短,同时搜索范围较小,路径是最短路径(部分情况下

2.4 Astar算法的最短路径问题

上一篇博客所介绍的Dijkstra算法以及BFS算法,我们强调了其搜索效率可能较低,但是一定能够搜索出最短路径。而对于Astar算法而言,搜索出的路径是否是最短路径以及在实际工程应用中搜索最短路径的必要性都是需要去深入探讨与思考的。

Astar搜索到最短路径的条件。
首先,在介绍最短路径的条件之前,要介绍一个admissible heuristic的概念。 其定义是说

  • 对于任意节点n,cost_n代表该节点到达任意终点的代价值(其中到达终点的路径都为最短路径),如果heuristic cost h(n) <= cost_n, 那么此时的h(n)即为admissible heuristic (optimal)
  • 简单的理解,就是当Astar算法的启发函数h(n)h(n)h(n)为admissible function时,则搜索出的路径一定为最短路径

通常heuristic function我们会选用欧拉距离或者曼哈顿距离作为距离终点的计算方式。结合上述admissible heuristic 定义,我们可以知道,当选用欧拉距离时,Astar搜索的路径一定是最短路径;当选用曼哈顿距离时,搜索的路径不一定是最短路径,因为当地图中出现障碍物时,曼哈顿距离算出的值很可能是穿过障碍物的,如下图所示

绿色圆形为起点,紫色五角星为终点,蓝色为障碍物,红色线表示的是欧拉距离,黄色的线表示的是曼哈顿距离,绿色线表示最终搜索出的路径。可以看出曼哈顿距离在存在障碍物时,可能搜出的并不是最短距离。

2.5 示例代码

代码开源在了github主页,仅写了一个简单的demo,其中包括了grid map模块,分别使用Dijkstra,Greedy以及Astar算法进行搜索的模块。链接如下:
https://github.com/FleverX/GridSearch


下一篇博客将介绍Astar实际工程中的优化应用以及基于Astar算法又衍生出的图搜索算法

参考:
https://www.redblobgames.com/pathfinding/a-star/introduction.html

无人车路径规划算法---(4)基于搜索的路径规划算法 II(贪心/Astar)相关推荐

  1. 推荐算法概述(基于用户的协同过滤算法、基于物品的协同过滤算法、基于内容的推荐算法)

    "无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程." 目前推 ...

  2. [推荐算法]ItemCF,基于物品的协同过滤算法

     [推荐算法]ItemCF,基于物品的协同过滤算法 标签: ItemCF基于用户的协同过滤算法 2015-03-09 15:11 4144人阅读 评论(1) 收藏 举报 本文章已收录于: 分类: ...

  3. 【优化算法】基于matlab量子粒子群算法求解单目标优化问题【含Matlab源码 2203期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]基于matlab量子粒子群算法求解单目标优化问题[含Matlab源码 2203期] 点击上面蓝色字体,直接付费下载,即可. 获 ...

  4. 【聚类算法】基于matlab改进的粒子群算法优化K-means算法【含Matlab源码 1946期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[聚类算法]基于matlab改进的粒子群算法优化K-means算法[含Matlab源码 1946期] 点击上面蓝色字体,直接付费下载,即可 ...

  5. 【优化算法】基于matlab象鼻虫损害优化算法 (WDOA)【含Matlab源码 2228期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]基于matlab象鼻虫损害优化算法 (WDOA)[含Matlab源码 2228期] 点击上面蓝色字体,直接付费下载,即可. 获 ...

  6. 无人车路径规划算法—(3)基于搜索的路径规划算法 (BFS/DFS/Dijkstra)

    1.BFS(广度优先搜索) && DFS(深度优先搜索) 广度优先遍历图的方式为,一次性访问当前顶点的所有未访问状态相邻顶点,并依次对每个相邻顶点执行同样处理.因为要依次对每个相邻顶点 ...

  7. 1 基于搜索的路径规划 —— Dijkstra算法(python)

    文章目录 算法讲解 重要说明 栅格地图 有权图 1 def main() 1.1 设置机器人的起点和终点,栅格大小,机器人半径 1.2 设置障碍物的位置 1.3 绘制步骤1和2的图 2 class D ...

  8. 无人车仿真:带反馈的绕圈路径实现

    前期入门ros,无论是无人机还是无人车等的控制,基本都是先以仿真学习为主,成熟的仿真理解与功能实现,再搬到现实世界的无人车无人机就变得简单随意,也能减少许多不必要的硬件损坏.但是很多新手都面临过我曾面 ...

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

    对解空间的定义 先看我们会遇到的一个问题.上图描述了在地图中不同机器人的形状和尺寸.因为形状和尺寸的差异让碰撞检测问题变得非常复杂.很自然我们会想能不能仅用一个点来描述机器人呢?忽略掉形状和尺寸的差异 ...

最新文章

  1. MyPython--进阶篇--异常
  2. 人工智能:各种知识收集----不断追加内容
  3. VS2010环境下MFC使用DataGrid绑定数据源
  4. C#中用WebClient.UploadData 方法上载文件数据
  5. 织梦服务器系统win10,WIN服务器爆破DEDECMS后台目录
  6. [转载] Python杂记之 list.clear()方法,清空列表
  7. 从软件开发到 AI 领域工程师:模型训练篇
  8. 昆仑通态触摸屏用串口与西门子200通讯,用网口做数据中转,把PLC数据转发给其他modbusTCP客户端
  9. Javascript回显图片
  10. 青果教务处系统爬虫(java)
  11. 【Love2d从青铜到王者】第二篇:Love2d详细介绍以及官网安装
  12. Android 图片与屏幕坐标点
  13. 内核网络数据结构-SKB
  14. 钉钉小程序从搭建到引入地三方库到发布---企业内小程序
  15. 分数加减乘除混合运算带答案_100道题,分数加减法混合运算,要答案
  16. 金蝶系统服务器上怎样备份文件,金蝶服务器数据库备份
  17. web学习一——We简介、Tomcat、HTTP协议
  18. 讨教大学|六西格玛之属性值数据一致性分析
  19. 用于 CPX、CPX-VF 和 CRX-VF 探针台的新手提箱选项
  20. 【听】告別玻璃心的十三件事,走出舒适圈

热门文章

  1. python 循环写入excel sheet_python 使用xlsxwriter循环向excel中插入数据和图片的操作...
  2. python爬取酷狗音乐url_python-从酷狗下载爬取自己想要的音乐-可以直接拿来体验哟...
  3. Nodejs 中的非阻塞I/O、异步和事件驱动
  4. 软件工程导论第六版 第一章 软件工程学概述知识点总结(下)
  5. Hive-创建表的几种方式
  6. FFMPEG:SPS和PPS
  7. 4K显示器和防蓝光眼镜膜
  8. 嵌入式(十三):嵌入式系统概念
  9. macos安装更新错误_如何控制何时安装macOS更新
  10. lzo的正确c语言代码,LZO 使用跟介绍