`

深度理解基本图搜索算法

阅读更多

 

这篇随笔是在综合看了多本书,包括算法导论,人工智能等之后,写自己的一些感悟。

  适合的读者:如果你已经能够思路清晰的回答以下问题,那么请直接忽略本文~

l  A*,BFS,DFS算法的实现思路?

l  A*,BFS,DFS算法本质上最主要的不同点?

以上可以看做是随便的摘要,将从以下几个部分展开:

  1. 图的基本表示
  2. 图搜索问题本身的抽象
  3. 图搜索三种基本算法,BFS,DFS,A*的实现。
  4. 三种算法进一步抽象理解,以及简单扩展。

 

一.      图的基本表示方法

  既然文章主要讨论的是图的搜索算法,那么我们首先来看图在计算机中的表示方法,主要以下两种:

  1. 邻接表
  2. 邻接矩阵

这个部分比较基础,我简单说一下。

 

 

二.      图搜索

状态机理论上来说,把每个图看成是一个状态,那么图搜索便是这样一个问题,从起始状态,经过一系列的转移(或者说操作),达到最终状态。

在这么一个过程中,可以从很多面引出很多问题。主要会有从以下几个方面产生问题:

  1. 关于操作。例如操作的最小次数(最大次数,或者某个适合的次数),操作的最小代价等等。
  2. 关于状态。例如是否每个初始状态都有最终状态可达,有几个初始状态可达最终状态,能达几个最终状态等等。

 

这个过程,加上以上两条之一做为约束之后便能形成一个问题了,便是经常我们见到的形式,从A点到B点最快需要几个点,A点是否能到B点等等。

 

 

三.      图搜索的基本算法

我们都知道,算法是针对某个问题,或者某类问题存在的。在上一部分我们提出问题后,接下来进行解答,也就是算法部分的介绍。

在介绍具体算法之前,让我们先自己来想想如何解决此类问题,是否有一个相对抽象的模型(以下我们会看到,这也是这三个算法的基本模型),这将有助于我们对算法的理解,使得算法来的不那么“突然”。

为了方便模型的描述,我们将问题实例化为一个现实的例子,要从点A找到点B,你不能问路,只能自己“搜索”,你所知道的就是你现在的初始的位置A和目标B的样子,那么让我们开始:

图搜索解决思路\模型:

  1. 记住前一步。当你走到新的一步的时候,要记得你是从哪走过来的,要不然等你走到了B点,却又不知道怎么走回去,便是白走了。
  2. 判断当前一步。判断当前步是否为最终状态,如果是,就别再走了,沿路返回吧。
  3. 走好下一步。当你有很多下一步的选择的时候,你需要去选择哪个作为你的下一步(这便是几个算法最大的不同),由于走错可以重来,倒也只是时间代价的问题。

不断重复以上三步,直到找到终点,或者你再也找不到可选的下一步了~~搜索便完毕了,这便是你能做的所有事情,是不是感觉很熟悉?其实人生也是一场搜索,记住过去,把握现在,规划未来~~~

 

扯远了,回到算法本身上来,既然我们已经抽象出算法模型,那么我们进一步将模型转到计算机领域相关内容上来。

  1. 将当前一步的指针指向前一步,从而记录前一步的走法。
  2. 将当前一步与最终点B进行对比,若相同,则通过每一步所留下的前一步的指针找回到初始位置便是一条路。
  3. 把所有接下来可选的下一步列出来,作为下一步的参考方向。根据不同的算法,有不同的做法。

 

 

那么问题已经很清晰了,所有的算法基本上都只对第三步起作用,前两步是完全相同的,那么最基本的三种算法都做了哪些工作呢。

 

      广度优先算法(DFS):

      我们直接根据上文考虑第三步,广度优先算法故名思意便是我从某点可能去的某个方向之后,返回前一个方向继续试没走过的方向,直到前一步能去的所有方向都试完之后才从另一个方向试,并且去过的我就不再傻傻的再去了。

      深度优先算法(DFS):

      考虑第三步,深度优先算法故名思意便是我从某点可能去的方向挑一个去,并且下一步不返回原点,继续在走过的基础上再走下去,并且去过的我就不再傻傻的再去了。

      A*算法,又名启发式算法。

     考虑第三步,首先去过的地方我是不会再去了,然后可选的下一步地方我都列出来,通过某种科学的评估方式,判定哪个下一步比较靠谱,就走哪一步。

 

上面三种方法描述不够严谨,但是却很简明的体现出了这三种方法的特点,深度和广度优先算法都被称作盲目搜索,因为在选择下一步的时候只是通过自己的某种“习惯”作搜索而已,A*搜索通过了某种科学的评估方式,所以显得就比较“智能”了。

 

在网上有大量的关于深度优先,广度优先,A*算法的实现,案例,各种语言的代码,相信大家都能找到,所以本着“复用”的思想,就不在此做过多实现上的介绍。(算法导论书上的介绍非常详细和严谨,推荐)

 

四.      算法的扩展和提炼

其实文章到这里差不多结束了,但是还是有几点后续关注点和大家分享一下。

  1. 关于第三步所走过的所有状态。

我们都知道,整个搜索过程中,可能我们只需要最终初始位置走向最终位置的那条路就好了。但是每个算法所走过的节点(正确的或者错误的),是可以记录下来,作为一种特殊的数据组织起来,通过这个特殊的数据,我们可以评判一个算法所经历的时间,错误节点数量,从而来评判一个算法的优劣。就像DEBUG,我们需要记录整个过程中的所有信息~~~

于是,广度优先算法在搜索过程中将形成广度优先树,深度优先算法在搜索过程更是能够形成括号结构的特殊性质,而A*所形成的搜索产物呢?是一个被完美剪支过后的树~~(A*搜索产物完全是个人看法的,不对欢迎讨论和指正)

    2.关于下一步的的选择,OPEN表。

实际上DFS用的是一个先进先出的队列结构来实现,BFS基本可以看成是先进后出的栈找下一步,而A*需要每次重新排序来确定下一步。

再通俗一点,如果读者对这三个算法有点熟悉的话,都知道在这个过程中需要两个关键的数据结构,分别来储存已经去过的点(名closed表),和可选的点(OPEN表),CLOSED表实现没什么特殊之处。

而OPEN表中,DFS是用队列,BFS用栈,而A*每次对OPEN进行重新排序。

      3.关于A*的评估函数

明眼人一下就看出来了,A*算法最关键的部分在于,那个评估函数究竟是什么?怎么样来确定一个好的评估函数便是用A*解决问题最关键的钥匙~~~,但是并不会有一个通用的函数,就像你在不同的地方需要不同的地图~~

当然还是会有很多经典的评估函数,例如用A*解决八数码问题所用到的评估函数等等……

 更多信息请查看 java进阶网 http://www.javady.com

1
0
分享到:
评论
1 楼 502220545 2012-07-05  
记住过去,把握现在,规划未来  总结的经典

相关推荐

    图的基本操作算法并用高级语言实现 C/C++语言源代码

    这一步骤在算法中应执行多次,每执行一次,集合TE和U都将发生变化,分别增加一条边和一个顶点,因此,TE和U是两个动态的集合,这一点在理解算法时要密切注意。 3)如果U=V,则算法结束;否则重复步骤2。可以把本步骤...

    算法引论:一种创造性方法.[美]Udi Manber(带详细书签).pdf

    7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4 拓扑排序 7.5 单源最短路径 7.6 最小代价生成树 7.7 全部最短路径 7.8 传递闭包 7.9 图的分解 7.9.1 双连通分支 7.9.2 强连通分支 7.9.3 利用图分解的例子 ...

    分布式算法 作者:(美)Nancy A.Lynch 舒继武 李国东part1

    4.2.2 基本的广度优先搜索算法 33 4.2.3 应用 34 4.3 最短路径 35 4.4 最小生成树 36 4.4.1 问题 36 4.4.2 基本定理 36 4.4.3 算法 37 4.5 最大独立集 39 4.5.1 问题 40 4.5.2 随机化算法 40 4.5.3 分析* 42 4.6 ...

    算法导论(part2)

    书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算法或数据结构课程使用。因为书中讨论...

    图的基本遍历和一些代码.cpp

    1.用邻接表作为图的存储结构建立一个图,并对此图分别进行深度优先搜索和广度优先搜索遍历(验证性内容)。 2.用邻接矩阵作为图的存储结构建立一个网,并构造该网的最小生成树(设计性内容)。 三、实验要求 1...

    算法导论(part1)

    书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算法或数据结构课程使用。因为书中讨论...

    人工智能导论模型与算法吴飞pdf

    从逻辑推理、搜索求解、监督学习、无监督学习、深度学习、强化学习和博 弈对抗介绍人工智能基本概念和模型算法,帮助学习者了解人工智能历史、趋势、 应用及挑战,掌握人工智能在自然语言理解和视觉分析等方面赋能...

    人工智能课件第三章搜索原理

    学习要求 重点掌握宽度优先和深度优先搜索算法 掌握等代价搜索算法 掌握启发式搜索相关知识 理解博弈树搜索相关技术 掌握遗传算法基本原理 理解模拟退火算法基本原理

    BFS, DFS, Dijkstra, Greedy Best First Search, A*五种路径规划算法Python实现

    (BFS、DFS)广度和深度优先搜索,最基本的暴力求解算法 (Dijkstra)在BFS的基础之上添加了低成本优先的贪心策略(估价函数) (Greedy Best First Search)在BFS的基础之上添加了启发式 (A*)结合了估价函数和...

    数据结构实验报告 图.doc

    本实验通过实现图的构造、遍历、插入、删除等基本操作,理解图的基本概念,掌握图的邻接矩阵和邻接表存储结构,掌握对图进行插入、删除等操作的实现方法,掌握图的深度优先搜索和广度优先搜索遍历算法。 理解最小...

    八数码问题

    综合应用“深度优先搜索”、“宽度优先搜索”、“启发式搜索”这三种人工智能搜索技术的基本知识以及程序设计的相关知识。 z2. 通过设计一个八数码问题求解程序,学习、了解状态空间搜索的思想,进一步加深对人工...

    GridWorld实训答案

    GridWorld案例提供了一个图形化环境用于可视化对象在二维网格中的交互。在这个案例中,你将设计和制造各种...同时扩展任务可以锻炼参训学生图像处理能力和学习、理解、应用深度优先搜索算法,广度优先搜索算法的能力。

    [人工智能]alpha-beta剪枝算法及实践.pdf

    算法伪码 先看极⼤极⼩搜索算法: alpha-beta剪枝就在极⼤极⼩搜索算法上优化: //node记录当前player,depth记录搜索深度 function minimax(node, depth) // 如果能得到确定的结果或者深度为零,使⽤评估函数返回局...

    我对人工智能的理解与看法.pdf

    总结 机器学习算法在指纹识别、⼈脸检测等领域的应⽤基本达到了商业化的要求或者特定场景的商业化⽔平,但每前进⼀步都异常艰难,直到深度学习算法的出现,⼈⼯智能才开始⼤爆 发,继续拓展⼈⼯智能的领域,如:⽆...

    我对人工智能的理解与看法(2).pdf

    总结 机器学习算法在指纹识别、⼈脸检测等领域的应⽤基本达到了商业化的要求或者特定场景的商业化⽔平,但每前进⼀步都异常艰难,直到深度学习算法的出现,⼈⼯智能才开始⼤爆 发,继续拓展⼈⼯智能的领域,如:⽆...

    我对人工智能的理解与看法(1).pdf

    总结 机器学习算法在指纹识别、⼈脸检测等领域的应⽤基本达到了商业化的要求或者特定场景的商业化⽔平,但每前进⼀步都异常艰难,直到深度学习算法的出现,⼈⼯智能才开始⼤爆 发,继续拓展⼈⼯智能的领域,如:⽆...

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    1.7.5 图的遍历(1)——深度优先搜索 1.7.6 图的遍历(2)——广度优先搜索 1.7.7 实例与分析 第2章 常用的查找与排序方法 2.1 顺序查找 2.2 折半查找 2.3 排序的概述 2.4 直接插入排序 2.5 选择排序 2.6 冒泡排序...

    图的存储与遍历(数据结构)

    对于《图的存储与遍历》这一课题来说,所要求掌握的数据结构知识主要有:图的邻接表存贮结构、队列的基本运算实现、邻接表的算法实现、图的广度优先搜索周游算法实现、图的深度优先搜索周游算法实现。 二是通过实习...

    人工智能-深度学习-机器学习的范畴大小排序.docx

    虽然在此门课程中对算法的实现不能独立完成,但在一些简单的基本的算法上还是有一定的理解和认识。我也在此次课程设计的过程中不断的学习,反复的调式和思考问题,终于在我的坚持下能够很好地理解算法转换为实际代码...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 2.5 结构化程序设计方法 31 3 数据类型、运算符与表达式 3.1 C语言的数据类型 32 ...

Global site tag (gtag.js) - Google Analytics