vlambda博客
学习文章列表

广度优先搜索与深度优先搜索

    在了解了目标树之后,我们接下来学习搜索算法的概念。

    搜索算法的应用还是很广的,这是属于算法的基础。在机器人的应用也有,比如机器人的路径规划问题。

    而小编也是打算以路径规划为例子讲解搜索算法。

    今天就先来学习入门级的搜索算法:广度优先搜索和深度优先搜索。

    广度优先搜索和深度优先搜索都是属于盲目搜索算法,除此之外还有更加聪明的搜索算法,那就是启发式搜索算法。

    所谓盲目搜索,就是不管怎么样,把所有的路径都搜索一遍,自然就能得到一条或是不止一条到达终点的路。而对于这种盲目搜索也有两种方式。

    我们来看一张地图,接下来就针对这一张图进行路径规划。

    题目:现在处于S点,要去G点。

    有了题目之后,我们就尝试利用目标树来建立搜索路径。现在我们不管三七二十一,先把全部可能的路径都列出来:

    接下来我们使用列表的方式来讲解两种盲目搜索算法。

    深度优先搜索:

    所谓深度优先搜索,就是先针对一条路径,先一直搜索到底,如果最终没有到达终点,那么就返回上一个节点继续向下搜索。

    所以可以列表:


搜索次数

列表情况
1

S

2
SA

SB
3
SAB
SAD
SB
4
SABC
SAD
SB
5
SABCE
SAD SB
6

SADG SB

确认到达终点,搜索结束。


    虽然最终搜索到了一条路径,而且看上去搜索量也不大,但深度优先搜索有一很明显的弊端,那就是搜索到的路径很有可能不是最优路径。

    这就跟你打的士一样,你打到了黑车,司机带你绕远路,虽然最终是到达了目的地,但是你却要因为绕远路而付出更多的钱。

    广度优先搜索:

    所谓广度优先搜索,那就是一层一层往下搜索下去,直到搜索到路径为止,所以列表:


搜索次数

列表情况


1

S


2
SA

SB

3
SAB
SAD
SBA
SBC
4
SABC
SADG
SBAD
SBCE

已经搜索到终点,搜索结束。


    这个看上去貌似是最优解,但真的是这样吗?

    虽说对于这道题目来说,这个搜索结果就是最优解,但若是拓展到其它地图呢?这种搜索算法是没有算上路程来搜索的,所以这个搜索结果,只能说是经过节点最少的一条路径,所以它依然可能不是最优解。

    而且最最重要的就是,广度优先搜索搜索量非常庞大。或许在这种小地图看不到,但若是放到大地图呢?在路径复杂的情况下,节点众多的情况下,那个数据量就会非常庞大了。

    所以两种盲目搜索都是笨办法,虽然简单,但是很有可能它们会带你绕远路。所以要用的时候,只能祈祷,地图刚好适用这两种搜索算法。

    不过即使是这样,其实我们还可以对搜索树进行“剪枝”。

    可以发现一个问题,列表里有重复搜索的路径。比方说在搜索到SAB的时候,在这个之前就已经有搜索了SB,两者对比,自然是两者之间线段最短。所以我们呢可以对列表进行优化,剪掉这些重复,这就是扩展列表

    扫一下这个二维码,点击关注,获取更多知识。