0-1背包问题优化算法详解
★代码实现(python):
#-*- coding:utf-8 -*-
from copy import copy
def add(p,x,c): #对应元素分别相加,p中每个元素都是元组,x也是一个元组
resultlist=[(i[0]+x[0],i[1]+x[1]) for i in p if i[0]+x[0]<=c]
return resultlist
def union(p,q): #求并集,同时删除坏点
pp=copy(p)
qq=copy(q)
delelement=[]
for i in pp:
for j in qq:
if(i[0]>=j[0] and i[1]<=j[1]):
delelement.append(i)
break
if(i[0]<=j[0] and i[1]>=j[1]):
delelement.append(j)
break
for i in delelement:
if i in pp:
pp.remove(i)
else:
qq.remove(i)
qq.extend(pp)
qq.sort()
return qq
def package2(w,v,c,n):#动态规划主函数
p=[[]]*(n+2)
p[n+1]=[(0,0)]
q= [[]] * (n + 2)
for i in range(n+1,1,-1):
q[i]=add(p[i],(w[i-2],v[i-2]),c)
p[i-1] = union(p[i], q[i])
return p,q
def out(w,v,p,q,n): #构造最优解
maxpoint=p[1][-1]
choose=[]
for i in range(1,n+1):
if((maxpoint in q[i+1]) and (maxpoint not in p[i+1])):
choose.append(True)
maxpoint=(maxpoint[0]-w[i-1],maxpoint[1]-v[i-1])
else:
choose.append(False)
print 'max weight and value:', p[1][-1]
print 'choose or not:', choose
if __name__=='__main__':
w=[2,2,6,5,4]
v=[6,3,5,4,6]
p,q=package2(w, v, 10, 5)
out(w,v,p,q,5)
★结果输出:
max weight and value: (8, 15)
choose or not: [True, True, False, False, True]
★复杂度分析
从之前的分析过程可以看出,每一个物品都存在选或者不选,如果没有删除坏点,
则要计算的转折点个数为2^n个,即指数级的,但是正是因为中间过程删除了很多
的坏点,因此实际复杂度并不是很高。
和前一篇最直接的动态规划相比,如果背包容量和物品重量的量级相差不大而
物品选择很多时,用直接动态规划方法效果可能更好。
而如果出现入本文开头引入的情况,即背包容量量级很大,而可选物品很少时,
用优化算法要快很多。因此,具体哪种好要视情况而定。
因为博客园编辑公式不太方便,因此写好了文档再截屏的。 以上内容为原创,希望能帮到大家。
转载于:https://www.cnblogs.com/xiaotan-code/p/6674902.html
0-1背包问题优化算法详解相关推荐
- id3算法c语言实现,从ID3到C5.0的故事:算法详解及实践应用
原标题:从ID3到C5.0的故事:算法详解及实践应用 在前面,我们分别概述性地介绍了决策树的基本知识: 1.算法概述 ID3(Iterative Dichotomiser3)算法可以说决策树算法中最著 ...
- 机器学习、深度学习中常用的优化算法详解——梯度下降法、牛顿法、共轭梯度法
一.梯度下降法 1.总述: 在机器学习中,基于基本的梯度下降法发展了三种梯度下降方法,分别为随机梯度下降法,批量梯度下降法以及小批量梯度下降法. (1)批量梯度下降法(Batch Gradient D ...
- 【机器学习基础】优化算法详解
本文来源于吴恩达老师的深度学习课程[1]和深度学习课程[2]笔记部分. 作者:黄海广[3] 备注:笔记和作业(含数据.原始作业文件).视频都在 github[4]中下载. 导语 在学习机器学习的过程中 ...
- Adam 优化算法详解
据牛津字典的定义,优化是指最好或最有效地利用一种情况或资源,或者简单地使自己的事物达到最佳状态的行为. 通常,如果可以对某事进行数学建模,则很有可能可以对其进行优化. 这在深度学习领域起着至关重要的作 ...
- 差分分组的合作协同进化的大规模优化算法详解
合作协同进化已经引入协同进化算法,目的是通过分而治之的范式解决日益复杂的优化问题.理论上,协同改 变子成分的想法是十分适合解决大规模优化问题的.然而在实践中,没有关于问题的先验知识, 问题应如何分解是 ...
- 重叠时间段问题优化算法详解
目录 一.问题提出 1. 描述 2. 分析 二.优化重叠查询 1. 自关联 2. 游标+内存临时表 三.改进取得活跃时段的算法 1. 最小范围算法(表连接) 2. 正负计数器算法(一次扫描) 四.My ...
- 深度学习中的Adam优化算法详解
Adam论文:https://arxiv.org/pdf/1412.6980.pdf (一).什么是Adam算法? Adam(Adaptive momentum)是一种自适应动量的随机优化方法(A m ...
- 基础排序算法详解与优化
文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...
- Apollo6.0代码Lattice算法详解——Part5: 生成横纵向轨迹
Apollo6.0代码Lattice算法详解--Part5: 生成横纵向轨迹 0.前置知识 1.涉及主要函数 2.函数关系 3.部分函数代码详解 3.1 lattice_planner.cc中代码部分 ...
最新文章
- 电源上的sense什么意思_冷知识:电源开关上的这两个标识有什么含义?
- python编程语言是什么-Python是一种什么样的编程语言?解释?编译?汇编?机械?...
- web.xml 配置中classpath: 与classpath*:的区别
- 如何做一名优秀的博士生--施一公教授
- boost::process::system相关的测试程序
- python做成绩表_自学Python笔记:用Python做成绩分析(2)
- SSDT Hook的妙用-对抗ring0 inline hook
- Zookeeper--ZAB与Paxos算法联系与区别
- JavWeb笔记:JavaScript总结
- M1芯片Mac也可以安装Windows系统啦 使用PD16虚拟机安装ARM版Windows10教程
- 关于大型asp.net应用系统的架构—如何做到高性能高可伸缩性
- Go语言struct{}类型的channel
- java 调用三角函数_Java中的三角函数方法
- 百度网盘分享旁边的个人说明如何修改
- 同济大学软件学院特聘教授朱少民谈《测试,从哪里来,到哪里去》
- HALCON图像格式
- 5.8GHz雷达感应模块应用,智能家居照明技术,微波雷达传感器
- 成为一名合格的算法工程师需要掌握哪些技能?
- PHA挖kuang什么时候开始?
- 机器学习笔记-多分类下的召回率和F值
热门文章
- BZOJ 3990: [SDOI2015]排序(搜索+剪枝)
- Linux下MySql插入汉字报错解决(/etc/my.cnf不存在)
- 查看apache连接数及apache工作原理
- JAVA基础知识(6)
- Reading Club week 3 prepare document
- 避免资源放在收藏夹里面吃灰的方法(如从typora上直接能导出html并且无缝连接到微信公众号的神奇网站)
- Google colab基本页面layout和需要注意的地方!
- 委瑞内拉遭网络攻击全国停电,他们可能忽视哪些安全威胁?...
- 谈论linux同组多用户操作问题
- 爪哇国新游记之三十一----日期时间与字符串间的转化