分支限界法——以单源最短路径为例,理解什么是分支限界法

分支限界法——以单源最短路径为例,理解什么是分支限界法_第1张图片

        书中开篇以回溯法举例,我们经过上一章的学习知道,回溯法实质上就是将问题的解空间列为树的结构,然后以深度优先遍历来获取我们想要的答案。而分支限界法的搜索策略与其类似,我们同样将解空间化为树结构,然后以广度优先策略或最小耗费优先的方式来搜索解空间。

        分支限界法可以拆分为两个词:分支和限界。所谓分支,就是以当前为父结点的结点为起点,向它的子节点进行分支,选择下一步的拓展节点。而限界即为对于我们选择下一结点的所谓选择依据,以便让我们从所有分支中选择出最有利的拓展结点。

         在应用范围来看,分支限界法适合于找出一个满足条件的解或者在满足条件的情况下找出某个最优解。

分支限界法——以单源最短路径为例,理解什么是分支限界法_第2张图片

这么一看,分支限界法其实和回溯法非常的相似,


分支限界法——以单源最短路径为例,理解什么是分支限界法_第3张图片

        题目要求从S到t的最短路径,我们来看看用分支限界法应当怎么解决。

分支限界法——以单源最短路径为例,理解什么是分支限界法_第4张图片

 我们看到,在图6-2所给出的解空间子树中,每个父结点其下的子节点,都是其父节点所有可能的路径。

然而例题给出的例子实在太抽象了,我们看简单一点的。

分支限界法——以单源最短路径为例,理解什么是分支限界法_第5张图片

分支限界法——以单源最短路径为例,理解什么是分支限界法_第6张图片

 这个子树是怎么得到的呢,首先在图1中我们可以看到a到bcd都有路径,在树中每个结点旁边的数字即为它的下界,比如b的下界是3=1+2,即入度+最小出度。对应的,c是7,d是11。然后我们需要舍弃掉下界最大的那个子树即为d的子树。接下来按广度优先遍历第三层,同理我们发现abc这条路径上,c的下界是6,而ac路径上c的下界是7,也就是说abc优于ac,因此我们舍弃了ac的子树不再遍历。第四层发现defg中最小下界是f和g,因此保留这两个子树。第五层发现最小下界是e,因此得道abcfet这条路径。

看懂了这个树,我可算才看懂例题给出的是什么意思,只能说太麻烦,但是确实应该是最好的方法。

在这里插入图片描述在这里插入图片描述

 借用别人博客的两张图(出处:(33条消息) 分支限界法之单源最短路径_Stig_Yu的博客-CSDN博客_分支限界法最短路径

什么意思呢?首先例题给出的遍历条件有两个:

1.对于这个树所构成的堆,我们每次需要选择其中最小的路长进行遍历。

2.如果有重复遍历的结点,对于路长更大的那个结点我们对其子树应当剪枝。

来看看是怎么遍历的,首先第一层是s开始,然后我们分别遍历三个结点:ABC,对应路长234。我们每次遍历都选择其中最短 的路长,比如现在是选2。然后遍历其子节点,为ued三条路径,即为549三个结点

然后在这个堆中,s到b的路长是3,是现在最小的,因此遍历3的子节点gf。

下一步我们发现最短的是4,优先遍历浅层的,因此遍历ch。然后是sae,然后是sau,然后是bg,然后是saeq。我们发现aug,aeq,bg,ch实际上到达的都是同一个顶点,即为我们标志的D点。而我们对于重复遍历的结点,仅仅保留最短路径的子树,即aeq和bg两个,其他的都剪枝,其余顶点也是同理。因此我认为例题给出的图片ch处就应当剪枝,没有chl,chm两条路径,这也是我百思不得其解的地方。在百度了之后依然得不到解决。

分支限界法——以单源最短路径为例,理解什么是分支限界法_第7张图片

分支限界法——以单源最短路径为例,理解什么是分支限界法_第8张图片

分支限界法——以单源最短路径为例,理解什么是分支限界法_第9张图片 代码 中我们可以看到,每次遍历后会将当前这个入堆的结点加入活结点优先队列,用N来表示这个新遍历的顶点j,并加入到堆H中。H.DeleteMin(E)应当是出队了堆中最短路长的子树,用于作为下一次拓展的活结点E,其函数内部应当也包含了ShortesPaths(E)这个函数的调用。最后直到优先队列为空为止结束。

 但是代码实在有点抽象,本人的能力无法完全理解,只能暂时作罢。

你可能感兴趣的:(算法设计与分析例题分析,深度优先,算法)