分支限界法——最大团问题和旅行售货员问题

本章的例题主要还是以回溯法章节的例题为主

据题目要求,一个图的团需要满足它是一个完全子图,并且不被更大的完全子图包含。然后需要我们求出这个图G的最大团,如果像如图给出的例子有三种最大团,也就是说最大团也不唯一。最大团也同时满足最大独立集(任意两点无连线)。

首先我们确定团包含的点集合肯定与排序无关,因此我们要构建的是一个子集树。

其次我们要根据题目的要求列出剪枝条件:

1.选取的顶点任意两点都存在边,也就是若已有n个顶点,每加入一个顶点要多n-1条边;

2.如果有更大团,就应当将最大团更新

3.最大团还是最大独立集(可以用于确定上界)

我们在回溯法时的总结依然适用,不过我们现在要用分支限界法来写。

由于分支限界法使用的是最大堆的结构,不过在这个题目里12345没有最大大小之分(虽然我们也可以以度的大小作为最大大小,但是为什么不这么做呢?原因是因为不方便我们进行界限的判断,往下看)。然后我们将在每层来判断图中对应节点是否选取,比如第一层(根节点不算)判断1是选取还是不选,选就走左子树,不选就是右子树,以此类推。

另外知道了分支,我们还要确定界限,很显然题目要求我们的最大团中每2个顶点之间都要有边,那么就用邻接表表示原图并看看选取的两个节点ij是否有边。这时也体现出按层来判断对应序号节点的好处了,这样我们就可以直接通过循环遍历,遍历n以内的数字节点和其他节点是否有边。

 

 


问题如下:某售货员要到若干个城市推销商品,已知各城市之间的路程(或旅费),他要选定一条从驻地出发,经过每个城市一遍最后回到驻地的路线,使总的路线(或总的旅费)最小。也就是说给定一个无向图,求遍历每一个顶点一次且仅一次的一条回路,最后回到起点的最小花费,这是一个无向图的最小回路问题。

用分支限界法来解决,我们依旧是使用堆的结构,不过要求最小值的话我们就用最小堆

分支原理还是一样的,每层代表一个节点,然后左子树代表选择,右子树代表没选。

界限上我们需要满足题目,首先我们要选取最优值,那么得记录当前最优解bestx吧,如果发现一条路径的路长>=bestx,那就不可能更小,就可以直接剪枝。

其次这个问题需要我们形成回路,那么我们在最后一层也就是n-1层(从0开始,叶子节点为结束点)一定就要和我们的第0层(出发点)的选择是一样的了,也就是说我们无需直接遍历到叶子节点,只需判断n-2层的节点是否能到达叶子节点,如果能就代表是有回路的,否则就直接剪枝。

 

 

 


从这两题我们可以总结出代码的编写规范了

在确定了分支条件和界限之后,我们要选择用堆的形式来判断分支选择,一般以每层来代表一个节点,然后对其进行上界和下界的剪枝,其中界限也是会动态变化的,因此也要用算法来确定动态变化的界限,最后当到达叶子节点则得到我们的答案。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值