搜索算法

本文主要以一些概念对较为常见的搜索作简单介绍:

一、盲目搜索

对一个图进行搜索意味着按照某种特定的顺序依次访问其顶点。在所有搜索方式中,广度优先算法和深度优先搜索算法都十分重要,因为它们提供了一套系统地访问图数据结构的方法。我们着重讲解广度优先搜索算法。

1.深度优先搜索
深度优先搜索算法(简称DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点的所在边都己被探寻过,搜索将回溯到发现节点的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。由于深度优先搜索不是接下来最短路径算法的基础,因此这里不做拓展。
2.广度优先搜索
广度优先搜索算法(简称BFS)又称为宽度优先搜索从起点开始,首先遍历起点周围邻近的点,然后再遍历已经遍历过的点邻近的点,逐步的向外扩散,直到找到终点。
在执行算法的过程中,每个点需要记录达到该点的前一个点的位置 —父节点。这样做之后,一旦到达终点,便可以从终点开始,反过来顺着父节点的顺序找到起点,由此就构成了一条路径。
以上两种算法的不同搜索策略可以通过下面网页查看动图,这是两种相邻节点之间的移动代价相等时用到的算法,图中的边不设权值。
https://cs.stanford.edu/people/abisee/tutorial/bfsdfs.html
3.Dijkstra算法
Dijkstra算法是由计算机科学家Edsger W.Dijkstra在1956年提出的。
考虑这样一种场景,在一些情况下,图形中相邻节点之间的移动代价并不相等。例如,游戏中的一幅图,既有平地也有山脉,那么游戏中的角色在平地和山脉中移动的速度通常是不相等的。在Dijkstra算法中,需要计算每一个节点距离起点的总移动代价。同时,还需要一个优先队列结构。对于所有待遍历的节点,放入优先队列中会按照代价进行排序。在算法运行的过程中,每次都从优先队列中选出代价最小的作为下一个遍历的节点。直到到达终点为止。
对比了不考虑节点移动代价差异的广度优先搜索与考虑移动代价的Dijkstra算法,又如下动图所示:

可以看出当图形为网格图,并且每个节点之间的移动代价是相等的,那么Dijkstra算法将和广度优先算法变得一样。以下网址链接可以自行设置绿色网格的位置。

Dijkstra算法(可自行设置障碍物)

二、启发式搜索算法

1.贪婪最佳优先
在Dijkstra算法中,我已经发现了其最终要的缺陷,搜索存在盲目性。在这里,我们只针对这个痛点,采用贪婪最佳优先搜索来解决。如何解决?我们只需稍微改变下观念即可,在Dijkstra算法中,优先队列采用的是,每个顶点到起始顶点的预估值来进行排序。在贪婪最佳优先搜索采用的是,每个顶点到目标顶点的预估值来进行排序。
两者的搜索过程对比如下动图所示:

明显看到右边的算法(贪婪最佳优先搜索 )寻找速度要快于左侧,虽然它的路径不是最优和最短的,但障碍物最少的时候,他的速度却足够的快。这就是贪心算法的优势,基于目标去搜索,而不是完全搜索。
贪婪最佳优先搜索动态图(可自行设置障碍物)

2.A star算法
我们找到了最短路径和搜索顶点最少数量的两种方案,Dijkstra 算法和贪婪最佳优先搜索。接下来能否汲取两者的有点选择既速度快又能得到最优解的算法?.
A star算法正是这么做了,它吸取了Dijkstra 算法中的当前代价,为每个边长设置权值,不停的计算每个顶点到起始顶点的距离,以获得最短路线,同时也汲取贪婪最佳优先搜索算法中不断向目标前进优势,并持续计算每个顶点到目标顶点的距离,以引导搜索队列不断想目标逼近,从而搜索更少的顶点,保持寻路的最优解。A star算法在运算过程中,每次从优先队列中选取f(n)值最小(优先级最高)的节点作为下一个待遍历的节点。A star算法使用两个集合来表示待遍历的节点,与已经遍历过的节点,这通常称之为open_set和close_set。
A star算法优先队列排序方式基于估价值,估价值由顶点到起始顶点的距离(代价)加上顶点到目标顶点的距离(启发函数)之和构成。
A star算法、贪婪最佳优先、Dijkstra算法三者的静态效果图如下:

三者动态效果图对比(可自行设置障碍物)

三、启发函数

f(n)=g(n)+h(n)f(n)=g(n)+h(n)f(n)=g(n)+h(n)
f(n)是节点n的综合优先级。当我们选择下一个要遍历的节点时,我们总会选取综合优先级最高(值最小)的节点。g(n) 是节点n距离起点的代价。h(n)是节点n距离终点的预计代价,这也就是A star算法的启发函数。
上面已经提到,启发函数会影响A star算法的行为。
在极端情况下,当启发函数h(n)始终为0,则将由g(n)决定节点的优先级,此时算法就退化成了Dijkstra算法。
如果h(n)始终小于等于节点n到终点的代价,则A star算法保证一定能够找到最短路径。但是当h(n)的值越小,算法将遍历越多的节点,也就导致算法越慢。
如果h(n)完全等于节点n到终点的代价,则A star算法将找到最佳路径,并且速度很快。可惜的是,并非所有场景下都能做到这一点。因为在没有达到终点之前,我们很难确切算出距离终点还有多远。
如果h(n)的值比节点n到终点的代价要大,则A star算法不能保证找到最短路径,不过此时会很快。在另外一个极端情况下,如果h(n)相较于g(n)大很多,则此时只有h(n)产生效果,这也就变成了贪婪最佳优先搜索。
由上面这些信息我们可以知道,通过调节启发函数我们可以控制算法的速度和精确度。因为在一些情况,我们可能未必需要最短路径,而是希望能够尽快找到一个路径即可。这也是A star算法比较灵活的地方。对于网格形式的图,有以下这些启发函数可以使用:
如果图形中只允许朝上下左右四个方向移动,则可以使用曼哈顿距离。
如果图形中允许朝八个方向移动,则可以使用对角距离。
如果图形中允许朝任何方向移动,则可以使用欧几里得距离。

总结

以下网页是五种不同搜索算法的搜索过程对比:

五种搜索算法(可进行添加多种障碍物)

下面对在有权图(紫)和无权图(黄)上利用搜索算法的特点做一个总结:

本文相关PDF文件:
Graph Search Algorithms

本文参考文章链接:

http://frankorz.com/2017/12/16/greedy-best-find-search/
https://cs.stanford.edu/people/abisee/tutorial/customize.html
https://zhuanlan.zhihu.com/p/54510444?utm_source=com.tencent.tim&utm_medium=social&utm_oi=774664375033163776
https://www.gameres.com/777251.html

常用搜索算法—盲目搜索和启发式搜索相关推荐

  1. 【算法】搜索算法—盲目搜索和启发式搜索

    搜索算法 本文主要以一些概念对较为常见的搜索作简单介绍: 一.盲目搜索 对一个图进行搜索意味着按照某种特定的顺序依次访问其顶点.在所有搜索方式中,广度优先算法和深度优先搜索算法都十分重要,因为它们提供 ...

  2. 与或树的盲目搜索和启发式搜索

    与或树的盲目搜索 与或树的一般搜索过程如下 (1)把原始问题作为初始节点S0,并把它作为当前节点 (2)应用分解或等价变换操作对当前节点进行扩展 (3)为每个子节点设置指向父节点的指针 (4)选择合适 ...

  3. 启发式搜索 迭代加深搜索 搜索对象的压缩存储

    常见的几种搜索算法 常见的几种搜索算法_唐宋缘明卿_cris的博客-CSDN博客_搜索算法有哪些 搜索 -- 启发式搜索 搜索 -- 启发式搜索_Alex_McAvoy的博客-CSDN博客_启发式搜索 ...

  4. 基于启发式搜索的一字棋

    一字棋游戏简介 "一字棋"游戏(又叫"三子棋"或"井字棋"),是一款十分经典的益智小游戏."井字棋"的棋盘很简单,是一个 ...

  5. 人工智能作业 八数码启发式搜索与bfs比较

    问题描述 3×3九宫棋盘,放置数码为1 -8的8个棋牌,剩下一个空格,只能通过棋牌向空格的移动来改变棋盘的布局. 要求:根据给定初始布局(即初始状态)和目标布局(即目标状态),如何移动棋牌才能从初始布 ...

  6. RLChina2022-强化学习暑期课程-博弈搜索算法

    <RLChina2022-强化学习暑期课程-博弈搜索算法>的学习笔记 主讲人:中科院自动化 林舒老师 RLChina2022-强化学习暑期课程-博弈搜索算法学习笔记 序列决策问题 定义与模 ...

  7. 本科-人工智能复习题

    填空题 首次提出"人工智能"是在(1956)年 . 下列不属于人工智能的研究方法的是(动作模拟法). (语义网络法)是知识的一种结构化图解表示,它由节点和弧线或链线组成,能把实体的 ...

  8. 程序员成长之路(一)

    最近 ,总感觉有点郁闷,工作原因! 我是一名程序员,但完全没有经历过过正统的的程序员之路,一直在自我摸索,迷茫了,总结一下,找到迷茫的原因,再继续, 直到现在,仍旧如此.有的人限于能力愿意,到了某个高 ...

  9. 《游戏人工智能》学习笔记

    复习笔记 chapter 1 游戏人工智能是人工智能科学技术领域的一个分支 人工智能游戏的研究内容是如何将人工智能的理论.方法和技术应用于开发智能游戏.提高游戏角色的智能水平,主要包括智能游戏角色的行 ...

  10. 人工智能复习(期末考试)

    1.框架表示法有什么特点?继承性,自然性,结构性. 2.产生式表示法的优点缺点:模块性,清晰性,自然性,有效性 缺点:效率不高,不能表示具有结构关系的知识 3.什么是产生式系统,它是由什么组成的 把一 ...

最新文章

  1. 数字图像处理:(3)一阶微分算子在图像处理中的应用
  2. 成功人士的十个故事- -
  3. 强化学习(十二) Dueling DQN
  4. (Java常用类)Object类
  5. 全球及中国焦炉气制天然气用催化剂行业前景动态与未来可行性研究报告2022版
  6. 从Top500、天河一号和超级计算机引起的话题
  7. Android启动Activity的两种方式与四种启动模式
  8. 【Linux入门基础知识】Linux 脚本编写基础
  9. Qt与FFmpeg联合开发指南(二)——解码(2):封装和界面设计
  10. XCode5.1.1怎样实现代码块自己主动排版
  11. SharePoint无代码工作流设计开发实例——交通费报销流程(二)
  12. mysqlmodify_modify与change的区别
  13. java户名的正则表达式_java – 用于验证用户名的正则表达式
  14. ReentrantLock1.8源码
  15. Dos命令大全完整版
  16. poedit使用(本地化和国际化)
  17. css的nth选择器,CSS选择器之nth
  18. 什么是重载?重载的作用?
  19. 《DFC-Net:Deep Flow-Guided Video Inpainting》论文笔记
  20. Python爬虫实战--58同城二手商品爬虫

热门文章

  1. html页面右下角添加js广告,javascript实现右下角广告框效果
  2. java歌词解析器_Java LRC 歌词解析
  3. MATLAB中前馈+反馈系统搭建-基于matlab控制系统工具箱
  4. php 解析p2p节目源,P2P加速解析与伪一次解析源码教程
  5. 城市智慧停车管理模式方案科普
  6. 深度学习 个人理解使用余弦相似度对人脸图片识别的过程
  7. STM32用热敏电阻测温
  8. logback开启异步打印
  9. 宝马和戴姆勒冻结自动驾驶合作项目
  10. 比较5个最佳的PHP表单生成器(和4个免费脚本)