每天进步一点点之(分支限界法)-----分支限界法与单源最短路径问题(四)

转自连接------风仲达------https://blog.csdn.net/liufeng_king/article/details/8900872
分支限界法描述:
(1)采用广度优先产生状态空间树的结点,并使用剪枝函数的方法称为分支界限法。
所谓分支是采用广度优先的策略,依次生成扩展结点的所有分支。
所谓的“限界”是在结点扩展的过程中计算结点的上界或下界,边搜索边剪掉搜索树的某些分支,从而提高搜索效率。
(2)原理:
按照广度优先的原则,一个活结点一旦称为扩展结点,算法将依次生成它的全部孩子结点,将那些导致不可行解或导致非最优解的儿子舍弃,其余儿子加入活结点表单中。然后,从活结点表中取出一个结点作为当前的扩展结点。重复上述结点扩展过程,直至找到问题的解或判定无解为止。
(3)分支限界法与回溯法
1)求解目标:回溯法的求解目标是找出解空间中满足约束条件的所有解,而分支界限法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
2)搜索方式的不同
回溯法以深度优先的方式搜索解空间,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。
(4)常见的分支限界法
1)FIFO分支限界法(队列式分支限界法)
基本思想:按照队列先进先出原则选取下一个活结点为扩展结点
搜索策略:一开始,根结点是唯一的活结点,根结点入队。对当前的扩展结点,先从左到右的产生它的所有儿子,用约束条件检查,把所有满足约束条件的儿子都加入到活结点队列中。再从活结点表中取出队首结点(队中最先进来的结点)为当前扩展结点。。。。,直到找到一个解或活结点队列为空为止。
2)LC分支限界法(优先队列式分支限界法)
基本思想:为了加速搜索的进程,因该采用有效的方式选择活结点进行扩展。按照优先队列中规定的优先级选取优先级最高的接点成为当前的扩展结点。
(5)单源最短路径问题
问题描述
在有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径
算法设计
算法从图G的源顶点s和空优先队列开始。结点s被扩展后,它的儿子结点依次被插入到堆中。此后,算法从堆中选取具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。
**
具有最小当前路长的结点是指在达到某个结点的所有从源结点的出发的所有路径的最小值,此时只有在最短路径上的这个结点被当作活结点得以继续展开,而不是活结点得结点则停止。但是在没有扩展到出现相同结点之时,就需要继续扩展下u去
***********重点分析要牢记

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于优先队列分支限界法单源最短路径的Python实现,可以参考以下代码: ```python import heapq def dijkstra(graph, start): """ Find shortest path to all nodes from the given start node using Dijkstra's algorithm with priority queue and branch and bound technique. :param graph: Graph structure represented as adjacency list :param start: Starting node :return: Shortest path to all nodes from the start node """ # Initialize distances to all nodes as infinity except start node distances = {node: float('inf') for node in graph} distances[start] = 0 # Initialize priority queue pq = [(0, start)] heapq.heapify(pq) while pq: # Get vertex with minimum known distance curr_dist, curr_vert = heapq.heappop(pq) # Ignore nodes whose distance is already determined if curr_dist > distances[curr_vert]: continue # Explore all edges outgoing from current vertex for adj_vert, edge_weight in graph[curr_vert].items(): # Calculate new tentative distance to adjacent vertex tentative_dist = distances[curr_vert] + edge_weight # Update tentative distance if it's less than the already known distance if tentative_dist < distances[adj_vert]: distances[adj_vert] = tentative_dist heapq.heappush(pq, (tentative_dist, adj_vert)) return distances ``` 这个函数使用优先队列和分支限界技术实现了Dijkstra算法。它接受一个图结构的邻接列表和一个起始节点作为输入,并返回起始节点到所有节点的最短路径。 希望这个代码能够帮到你,如果你还有其他问题,可以继续问我哦!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值