分支限界法求解单源最短路径问题

439 阅读3分钟

分支限界法介绍

分支限界法(Branch and Bound method)是20世纪60年代由Richard Manning.Karp(理查德.卡普)提出,并成功解决了含有65个城市的旅行商问题,创造了当时的记录。

与回溯法比较

分支限界法与回溯法类似,是在问题的解空间树上搜索问题解的算法。与回溯法不同的是,分支限界法的求解目标是找出满足约束条件的一个解,或者在满足约束条件的解中找出是某一目标函数值达到极大或者极小的解,也就是某种意义下的最优解。而回溯法的求解目标是找出解空间中满足约束条件的一个解(或所有解),并不一定是最优解。

分支限界法原理

分支限界法以广度优先或者最小耗费(或最大收益)优先的方式搜索问题的解空间树,在遍历过程中,对已处理的每一个节点根据限界函数估算目标函数的可能取值,从中选取使目标函数取得极值(极大或极小)的结点优先进行广度优先搜索,以尽快找到问题的解。

采用方法

优先队列式,也就是对每个结点设置一个优先级,并按照优先级的高低排列,优先级高的结点成为扩展结点。

我们一般采用优先队列方式,一般需要构造一个大顶堆或者一个小顶堆,以便对其进行处理。其求解步骤一般为:

步骤

  1. 使用评价函数(限界函数或者约束条件)构造一个堆,首先构造由根节点组成的一元堆。
  2. 考察该堆的根元结点是否是目标结点,如果是,则停止,否则执行步骤3.
  3. 从该堆中删除根元结点,并扩展该元素,把这个元素的后代添加到堆中。
  4. 如果该堆是空,那么失败。否则转向步骤2。

单元最短路径求解

接下来我们使用分支限界法求解单源最短路径问题,来深入学习分支限界法。

题目:针对下面的有向网,求从起点s到t的最短路径。\ image.png

  1. 首先画出解空间树 图片2.png 在树中标出从s到t的所有路径,这是所有的解,但我们要求的是最优解,也就是路径最短的那个解

  2. 分支限界算法分析:

采用分支限界法求解问题的关键是先要建立一个约束条件,也就是剪枝的判断条件。显然从起点到达图中同一顶点的路径之和越短,其结果也就越符合求解要求,反之越长的结点所对应的子树也就应该从求解空间中剪去。

求解时应该建立一个小顶堆空间,用于存储活结点表,并在求解过程中不断的构建堆,直到处理完所有的结点。该堆中的结点表示从起点到该点的当前最短路径的结点编号,并保存其路径长度。

以上面的图为例,其小顶堆的构建过程如下:

step1.png

step2.png

step3.png

step4.png

step5.png

step6.png

在该题中,插入堆中的结点,其求得的从起点到该结点的最短距离值必须小于当前已求得的最小值。当然从起点到该结点的距离的初值应设置为无穷大,这样才能进行有效的比较。

在求解过程中,需要搜索与堆顶结点相接的所有相邻结点,并将该距离加上当前结点的距离值,然后与此前求得的距离进行比较。同时在堆中如果删除堆顶结点,需要对堆进行调整,形成新的最小堆。