分支限界法——布线问题和01背包问题

 布线问题要求我们只能水平或垂直经过格子,找到两个格子之间的最短路径。同时题目还会设置封锁格子,我们的路线不能穿过封锁,也就是说封锁格子是不可到达的。而且我们布线时经过的格子被占用后也是不可到达的。因此可选的分支实际上应该是与当前所在格子相邻并且可达的格子。

我们观察题目不难发现,其实两点之间的最短路径(在没有封锁的情况下),其在水平方向运动的格子数相当于二者的横坐标之差的绝对值,而在垂直方向运动的格子数相当于二者的纵坐标之差的绝对值。那么这个最短路径的下界就是ab的横纵坐标差的绝对值之和。而上界应当是每一次遍历出的最短路径,当前路径若小于最短路径则继续,若大于或等于则剪枝。

 题目用二维矩阵的值来确定格子类型,其中0代表可布线,1代表不能布线,而23456...等等数字代表当前格子的路径长度n,实际长度=n-2。

 图上的标距离是有问题的,每格需要加1,到达b时标距离是9,实际距离就是9-2+2=7,而ab间的距离是7+2=9(路径长+ab两格)。

 

 本题看起来更像回溯法,而且并不完整,比如上界和下界的剪枝条件未设置,也可以在main函数里设置。


 又是01背包问题。如何选择分支?看起来只要是重量能装的都能作为分支。

而界限应当找出背包物品价值的上界,我们想起装载问题,装载问题实际上可以看作01背包问题的变形,我们也可以运用优先队列来完成我们的解题。

用优先队列分支限界法解决的01背包问题也是一个经典例题分支限界法解决01背包问题 - 走看看 (zoukankan.com)

借用别人博客的总结

设有n个物体和一个背包,物体i的重量为wi价值为pi ,背包的载荷为M, 若将物体i(1<= i <=n)装入背包,则有价值为pi . 目标是找到一个方案, 使得能放入背包的物体总价值最高.

设N=3, W=(16,15,15),   P=(45,25,25), C=30(背包容量)

 首先像装载问题一样,我们对物品的选择就是01,一个物品要么装要么不装,因为是一个子集树问题。那么我们知道优先队列关键在于优先,我们要定义路径选择的优先级,也就是说对于物品的选择要有优先度,那么性价比就成为我们考虑优先度的第一选择,因此我们每层的选择以性价比为依据建立优先队列,

 我们以性价比为优先,建立了如下的堆

其中ub就代表了我们的价值在这一优先队列中的动态上界,ub代表的是物品价值上界=总物品价值-丢弃物品价值。在优先队列中我们优先遍历ub较高的孩子,其路径就是12569,而9是叶子节点代表我们遍历完毕,并且其ub=65,比7的ub=64要高,所以我们就对7剪枝。

 

 代码部分和上期装载问题基本相似,就不注释了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值