【分支限界算法】单源最短路径Python实现

问题描述

  • 给定一个带权有向图 G = ( V , E ) G = (V , E) G=(V,E),其中每条边的权是非负实数,给定 V V V中的一个顶点,称为源
  • 计算从源到所有其他各顶点的最短路径长度

分支限界算法

  • 先用单源最短路径问题的一个具体实例来说明算法的基本思想
  • 在下图所给的有向图中,每条边都有一个非负边权,求从源顶点 S S S到目标顶点 T T T之间的最短路径

1

  • 解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表,其优先级是结点所对应的当前路长

  • 算法从图 G G G的源顶点 S S S和空优先队列开始,结点 S S S被扩展后,它的 3 3 3个儿子节点被依次插入堆中

  • 此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点,如果从当前扩展结点 i i i到顶点 j j j有边可达,且从源出发,途径顶点 i i i再到顶点 j j j的相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中

  • 结点的扩展过程一直持续到活结点优先队列为空时为止

  • 下图是用优先队列式分支限界法解上图的单源最短路径问题所产生的搜索树,其中每个结点旁边的数字表示该结点所对应的当前路长

  • 由于图中各边的权均非负,所以结点所对应的当前路长也是解空间树种以该结点为根的子树中所有结点对应的路长的一个下界

  • 在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结点为根的子树

  • 在算法中,利用结点间的控制关系进行剪枝

    • 在上图中,从源顶点 S S S出发,经过边 a a a e e e q q q(路长为 5 5 5)和经过边 c c c h h h(路长为 6 6 6)的 2 2 2条路径到达图 G G G的同一顶点
    • 在该问题的解空间树中,这 2 2 2条路径相应于解空间树的 2 2 2个不同的结点 A A A B B B
    • 由于结点 A A A所相应的路长小于结点 B B B所相应的路长,因此以结点 A A A为根的子树中所包含的从 S S S T T T的路长小于以结点 B B B为根的子树中所包含的从 S S S T T T的路长
    • 因而可以将以结点 B B B为根的子树剪去,这时称结点 A A A控制了结点 B B B
    • 显然,算法可将被控制结点所相应的子树剪去

  • 42
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分支限界法(Branch and Bound)是一种求解最优化问题的算法,它将问题分解成多个子问题,并通过优先级队列选取当前最有希望的子问题进行求解。在单源最短路径问题中,分支限界法可以用来找到从源点到其他各个顶点的最短路径。 对于单源最短路径,我们可以使用Dijkstra算法或者Bellman-Ford算法来解决。但是当图中边的权重为负值时,Dijkstra算法不能正确处理。因此,分支限界法可以作为一种解决带有负权边的单源最短路径问题的方法。 分支限界法的基本思想是将问题空间划分为多个子空间,并通过限定条件来减少搜索空间。在单源最短路径问题中,我们可以通过设定一个上界来限制搜索的深度,以避免搜索过程中陷入无限循环。 具体实现分支限界法的步骤如下: 1. 初始化一个优先级队列,将源点加入队列。 2. 从优先级队列中选取优先级最高的节点,并向其邻接节点扩展,计算当前路径长度。 3. 若当前路径长度小于已知最短路径长度,则更新最短路径长度,并将该节点加入优先级队列中。 4. 重复步骤2和3,直到搜索到目标节点或者优先级队列为空。 在C语言中实现分支限界法的单源最短路径算法,可以使用邻接矩阵或邻接表来表示图结构,并通过优先级队列来实现分支限界法的搜索过程。具体实现时需要定义适当的数据结构和算法逻辑来处理节点的扩展和路径长度的计算。 总之,分支限界法是一种有效解决带有负权边的单源最短路径问题的方法,它通过划分搜索空间和限定搜索条件来减少问题规模,从而达到高效求解的目的。在C语言中实现分支限界法的单源最短路径算法需要合理选择数据结构和算法逻辑,以实现路径长度的计算和节点的扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值