01背包问题 —— 【算法设计】分支限界法
分支限界
问题背景
有N个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
注意:01背包问题要求一个物品只有0/1两种状态,即装入背包或不装入背包。不能将物品拆分成更小的单位装入,即不能部分装入。对于物品可以部分装入背包的问题,称之为背包问题
分支限界
- 基本思想
分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。
在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。 - 与回溯法的区别
- 求解目标:
回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。 - 搜索方式的不同:
回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。
分支限界下的01背包问题
- 思想
采用优先队列方式,按照物品的单位价值从大到小进行优先级排序,使用大根堆结构存储物品数据。
构造上界函数maxbound( )计算当前结点下的价值上界,如果当前结点下的价值上界比当前的最优值大,则将当前结点加入堆中,否则剪去该节点下的所有路径(即剪去子集树的枝),直到堆中所有结点均被弹出。 - 过程
- 首先,要对输入数据进行预处理,将各物品依其单位重量价值从大到小进行排列
- 节点的优先级由已装袋的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和
- 算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中
- 当右儿子结点满足上界约束时将它加入子集树和活结点优先队列
分支限界01背包-Python代码
本代码为python3下的分支限界01背包代码
关键步骤已标记注释
import heapq# 物品信息
weight=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
value=[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]print("物品信息如下:")
print("重量:")
print(weight)
print("价值:")
print(value)
# 背包容量
maxcap=35
print("最大背包容量为:%d\n"%maxcap)
n=len(weight)
# 当前重量与当前价值
cweight=0
cvalue=0
# 最优价值
bestv=0
bests=[]
num=0
heap=[]
heapq.heapify# 上界函数:计算当前结点下的价值上界
def maxbound(i):global cweightglobal cvalueglobal nglobal weightglobal valueglobal maxcapleft = maxcap-cweightb=cvaluewhile i<n and weight[i]<=left:left-=weight[i]b+=value[i]i+=1if i<n:b+=(value[i]/weight[i])*leftreturn b# 分支限界算法求解01背包
i=0
upper=maxbound(i)
str=''while(1):wt=cweight+weight[i]#print("wt:")#print(wt)if wt<=maxcap:if cvalue+value[i]>bestv:#print("i=%d"%i)bestv=cvalue+value[i]#print("bestv=%d"%bestv)# 存储当前最优值的最优路径bests=str+'1'bests=bests+'0'*(n-len(bests))# 入堆: 由于python只有小根堆,因此通过对上界值取倒,实现上界值大,优先级高 if i+1<n:heapq.heappush(heap,[1/upper,cweight+weight[i],cvalue+value[i],i+1,str+'1'])upper=maxbound(i+1)if upper>=bestv:if i+1<n:heapq.heappush(heap,[1/upper,cweight,cvalue,i+1,str+'0'])if len(heap)==0:print("%d个物品的状态(1为被装入背包,0为未被装入背包):%s"%(n,bests))print("最优价值为: %d"%bestv)break#print("heap:")#print(heap)node=heapq.heappop(heap)upper=1/node[0]cweight=node[1]cvalue=node[2]i=node[3]str=node[4]#print('node:')#print(node)
- 测试运行
参考文章
https://www.cnblogs.com/ttltry-air/archive/2012/08/02/2620763.html
分界线
**************************
Date:2020/1/19
Category:算法设计
Author:Ver.
**************************
01背包问题 —— 【算法设计】分支限界法相关推荐
- 01背包问题分支限界java_分支限界法-01背包问题
1.分支限界法介绍 分支限界法类似于回溯法,也是在问题的解空间上搜索问题解的算法.一般情况下,分支限界法与回溯法的求解目标不同.回溯法的求解目标是找出解空间中满足约束条件的所有解:而分支限界法的求解目 ...
- 贪心算法 0-1背包c语言,贪心算法0-1背包问题(算法实验代码).pdf
. 实验三. 0-1 背包问题(贪心算法) 实验代码: #include int max(int a,int b) { if(a>b) return a; else return b; } vo ...
- 基于改进遗传退火算法的0-1背包问题设计与实现
JISHOUUNIVERSITY 本科生毕业设计 题 目: 基于改进遗传退火算法的0-1背包问题设计与实现 作 者: 秦峰 学 号: 20144042001 所属学院: 信息科学与工程 ...
- 算法设计 - 01背包问题
学习来源 [自制]01背包问题算法动画讲解_哔哩哔哩_bilibili 问题描述 有N件物品,第i件物品的重量是w[i],价值是p[i]. 有一个背包,背包的承重是W. 求解:将哪些物品装入背包可获得 ...
- 0-1背包问题(0-1 knapsack problem)c++实现
文章目录 1 问题描述 2 基本原理 3代码实现 1 问题描述 有n个物品,它们有各自的重量和价值,现有一给定最大载重的背包,如何让背包里装入的物品具有最大的价值总和而又不超过最大载重? 比如: 商品 ...
- 算法设计与分析结课论文
1背包问题 1.1基于动态规划的01背包问题算法实现 问题描述: 动态规划算法实现(Java): import java.util.Scanner;public class Packageof01 { ...
- 分支限界法 01背包c语言,算法笔记分支限界法01背包问题
<算法笔记分支限界法01背包问题>由会员分享,可在线阅读,更多相关<算法笔记分支限界法01背包问题(12页珍藏版)>请在人人文库网上搜索. 1.问题描述给定n种物品和一背包.物 ...
- 分支界限算法【0-1背包问题】按照优先队列式(LC)分支限界法求解0-1背包问题, 并给出限界函数,并画出该实例的状态空间树。
目 录 回溯算法[0-1背包问题] 分支界限算法[0-1背包问题] 作业题(期末考试必考) 小结 回溯算法[0-1背包问题] 分支界限算法[0-1背包问题] 解决思路:采用优先队列式分支限界 Ø ...
- 算法设计与分析--01背包问题(动态规划法解决)
算法设计与分析--01背包问题(动态规划法解决) 参考文章: (1)算法设计与分析--01背包问题(动态规划法解决) (2)https://www.cnblogs.com/2228212230qq/p ...
- 01背包问题 —— 【算法设计】动态规划
动态规划 问题背景 有N个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 注意:01背包问题要求一个物品只有0/1两种状态,即装入背包或不装入背包.不能将 ...
最新文章
- 上帝的指纹——分形与混沌
- 监听者模式理解(Swing)
- 以application/json 方式提交 然后用在php中读取原始数据流的方式获取 在json_encode...
- Hibernate简答题
- 【造轮子】打造一个简单的万能Excel读写工具
- 从零开始入门 K8s | 理解容器运行时接口 CRI
- Cisco配置单臂路由及静态路由
- html 轮播 平移,网站轮播图的实现-平移版
- LeetCode 606. 根据二叉树创建字符串(递归)
- PyTorch框架学习十二——损失函数
- JavaScript-数组相关作业
- Linux 文件拓展名及文件解压方式
- 【2000*】【Codeforces Round #518 (Div. 1) [Thanks, Mail.Ru!] B】Multihedgehog
- sublime实用快捷键 mac版
- 【Linux下载安装jdk8】
- 虚拟串口服务器怎manager,VSPManager虚拟串口管理软件
- 小米公司在区块链领域的布局:小米WiFi链也开始种“米”了
- w10计算机恢复出厂设置,win10强制恢复出厂设置教程
- 在电脑双屏使用时,搜狗输入法在别的屏幕(转)
- 多人连线的枪战游戏-补充