优先队列分支限界法求解旅行商最短路径问题

目录

1.题目分析
2.解题思路
3.C++源代码(部分)
4.结论

1.题目分析

旅行商问题内容:一个售货员必须访问n个城市,恰好访问每个城市一次,并最终回到出发城市,且整个旅行费用最低。

分析:这个问题的实质就是在一个带权的完全无向图当中寻找一个总权值最小的回路, 它是一个NP完全问题。对于NP完全问题,我们可以采取动态规划法或者分支限界法求解,很多情况下,这两种方式比穷举搜索法有效得多。

4顶点无向带权图

n=4时旅行商问题的解空间树

2.解题思路

旅行商问题的解空间树是一棵排列树。分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。采取分支限界法的原因是在寻找到一个最优解之后,如果在接下来的某个过程当中所得到的权值已经超过最优解,那么我们就可以将这个节点及之后的节点舍弃,转而去遍历新的一个可能。在获得新的最优解之后再去替换之前的最优解,然后重复循环以上过程。我们就可以以一个比较高的效率去遍历出旅行商问题的最优解。

优先队列式的分支界限法将活结点表组织成一个优先队列,并按优先队列中规定的结点优先级选取优先级最高的下一个结点成为当前扩展结点。对排列树的优先队列式分支界限法有两种不同的实现方式。我们采用的是其中一种,仅使用优先队列来存储活结点。优先队列中的每个活结点都存储从根到该活结点的相应路径。

3.C++源代码(部分)

  1. 实现子树存在最优解时,将结点插入最小堆,源代码如下:

  1. 判断该叶结点相应一条可行回路,且最短路径小于当前最短路径,源代码如下:

4.结论

分支限界法,首先确认上下界,根据界限函数估计结点的目标函数的可能取值,设计出界限函数,进行广度优先搜索,并对根节点到该节点路径大小进行保存,求得最优解后不断回溯,确定最优解的各个分量。采用活结点将所有的可行子节点进行拓展,并估算最后的可能值,如果比最优解大,就舍弃,重新规划路线。否则,更新为最优解。这种方法能够简化计算量,提高效率。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值