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

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

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

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

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

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

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

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

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

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

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

 

 


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

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

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

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

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

 

 

 


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

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

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分支限界是一种用于求解组合优化问题的算,可以用来解决旅行售货员问题(TSP,Traveling Salesman Problem)。TSP是一个经典的NP困难问题,目标是寻找一条路径,使得旅行售货员能够经过所有城市并且总路程最短。 下面是使用分支限界求解TSP的实验说明: 1. **问题建模**:将TSP问题转化为图论问题。将城市视为图的节点,城市间的距离视为图的边权重。 2. **初始界限计算**:计算初始上界(UB)和初始下界(LB)。UB可以设置为一个较大的值,而LB可以通过启发式算(如最小生成树算)得到。 3. **状态空间树构建**:构建状态空间树,并根据约束条件进行剪枝。状态空间树的每个节点表示一个可能的路径。 4. **分支规则**:选择一个节点进行分支分支规则可以根据不同策略选择下一个要探索的节点,例如选择下一个未访问的城市进行扩展。 5. **子问题求解**:对每个分支节点,求解子问题。子问题是在当前路径基础上添加一个城市,并计算新的上界和下界。 6. **剪枝策略**:根据上界和下界进行剪枝。如果某个分支节点的下界大于当前已知的最优解(UB),则可以剪枝。 7. **回溯和更新最优解**:在搜索过程中,记录当前最优解,并在搜索到叶子节点或者剪枝时进行更新。 8. **迭代搜索**:重复进行分支、求解子问题、剪枝等步骤,直到找到最优解或者搜索空间被完全搜索。 9. **结果输出**:输出找到的最优解路径和总路程。 需要注意的是,TSP是一个NP困难问题,随着城市数量的增加,问题的规模将呈指数级增长,求解时间会非常长。因此,在实际应用中,通常采用启发式算等近似方来求解TSP问题。 希望以上实验说明对您有所帮助,如果您有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值