本文其实与智能算法无关,这是最优化课程的一个小作业,之所以放在智能算法一栏,是因为这个问题的大部分解法都是智能算法。下面出场的是背包问题的一个变种——带约束的多背包问题,这个问题的精确算法复杂度极高,所以一般退而求其次寻找拥有固定近似比的近似算法,本文求解采取的则是一种基于DP动态规划的近似算法,巧妙的并不是算法本身,算法也不能保证求出最优解,精华在于近似比的证明部分,这一部分证明我参考了相关文献,分享给大家细细品味。

❖ 问题描述


有个物品,每个物品的重量为wi,另有m个背包,每个背包的容量为cj,另外每个物品有放入限制R,Rij=1则表明物品i可以放入背包j中,Rij=0则不能,因此R是一个n*m的矩阵。

那么在不违背放入限制规则,同时每个背包内物品不超过相应容量时,如何使背包所装物品的重量最大?上述问题可以用以下数学模型来描述:

❖ 算法描述


  1. 设置是否放入标记列表isPut,初始化为False

  2. 依次遍历每一个背包,记当前背包的编号为

  3. 枚举出当前isPut=FalseR[i][j]=1的所有物品集item

  4. 利用DP动态规划求出从item中取出物品放入背包的最优解,并将取出物品的isPut标记为True(表示前i个物品能放入容量为j背包的最大重量)

  5. 回到step 1求解下一背包

❖ 近似比证明


上述算法求得的目标函数值.

Prove

我们假设上述算法执行的目标结果为T,且背包中的物品重量之和为Wj,而该算法中没有被放置于任何背包的物品集为M,接下来证明其余任何可行解从M中取出放入背包的物品重量总和S≤T。

【反证法】 假设存在一个可行解,使得S>T,那么总有一个背包内的物品重量之和>Wk,即背包k里面存在一个物品集。注意到DP动态规划求得的是最优解,即Wk是当时剩下物品放入背包k的最优方案,而M中的物品在上述算法中没有被放入任何背包,从而可以将I中物品放入背包获得更优解,矛盾!从而S≤T得证。

另外从M外放入背包的物品总量最多即为T,从而背包总量≤T+S≤2T。

❖ 求解结果


背包 放入物品编号 背包内物品重量之和 背包容量
0 2, 5, 6, 11, 12, 13 866 866
1 3, 14, 16, 19, 20, 22 908 908
2 1, 7, 10, 18, 21, 24, 30, 31 1361 1361
3 4, 9, 15, 17, 23, 26, 33 559 559
4 8, 27, 28, 32, 36, 39, 40, 42, 47, 49 1216 1216
5 29, 35, 38, 41, 51, 52 983 983
6 25, 34, 37, 53, 54, 55 1111 1111
7 71, 72, 80, 83 300 300
8 46, 50, 56, 57, 63 857 857
9 44, 48, 58, 61, 62, 64, 70 1462 1462

问题Sample下载: 多背包问题.

所有背包均装满,可以确定是最优解。

❖ 总结


事实上根据证明过程可以看出,任意一个能够求出0-1单背包问题最优解的算法都可以替换DP算法达到1/2的下界。同时可以举例证明1/2是最优下界,如背包容量{C+ε,C},物品重量为{ε,C,C+ε}。最优解为2C+ε,而实际运行结果可能为C+ε,两者比值

由此可见,如果将物品重量从高到低排列后再进行DP求解可以优化算法结果。

❖ C ☺ D E


import numpy as np
import pandas as pd
from copy import deepcopy as dpload = np.array(pd.read_excel("/Users/starlitrover/Downloads/最优化/背包问题.xlsx", header=4, usecols=range(1, 11)))
value = np.array(
pd.read_excel("/Users/starlitrover/Downloads/最优化/背包问题.xlsx", header=4, usecols=[11]).iloc[:,0])
size = np.array(
pd.read_excel("/Users/starlitrover/Downloads/最优化/背包问题.xlsx", usecols=range(1, 11), nrows=1).iloc[0, :])isPut = [False] * len(value)
total = []
list = []
for i in range(len(size)):item = []for j in range(len(value)):if not isPut[j] and load[j, i] == 1:item.append(j)f = np.zeros([len(item), size[i] + 1])it = [[[] for a in range(size[i] + 1)] for b in range(len(item))]for a in range(1, len(item)):for b in range(value[item[a]], size[i] + 1):if value[item[a]] + f[a - 1, b - value[item[a]]] > f[a - 1, b]:f[a, b] = value[item[a]] + f[a - 1, b - value[item[a]]]it[a][b] = dp(it[a - 1][b - value[item[a]]])it[a][b].append(item[a])else:f[a, b] = f[a - 1, b]it[a][b] = dp(it[a - 1][b])for k in it[len(item) - 1][size[i]]:isPut[k] = Trueif len(item) > 0:total.append(f[len(item) - 1, size[i]])list.append(it[len(item) - 1][size[i]])PutIn=pd.DataFrame(columns=range(10),index=range(100))
PutIn.fillna(0,inplace=True)
for i in range(len(list)):for j in list[i]:PutIn[i][j]=1print(PutIn)

❖ References


  • [1] Approximation Algorithms for the Multiple Knapsack Problem with Assignment Restrictions

  • [2] Chapter 6: Multiple knapsack problem , Knapsack Problems

0-1多背包带约束问题(MKAR)相关推荐

  1. 【MySQL8.0学习笔记】约束:主键约束、自增长约束、非空约束、唯一性约束、默认约束与零填充约束

    本文对MySQL数据库的约束相关知识进行了归纳总结,包括主键约束.自增长约束.非空约束.唯一性约束.默认约束与零填充约束. 本专栏长期更新,敬请关注. 文章目录 1 MySQL约束简介 2 主键约束 ...

  2. mysql启动和关闭外键约束的方法

    关闭外键约束,输入命令:SET FOREIGN_KEY_CHECKS=0; 启动外键约束,输入命令:SET FOREIGN_KEY_CHECKS=1; 查看当前是否有外键约束:SELECT  @@FO ...

  3. mysql取消外码约束_MySQL 关闭子表的外键约束检察方法

    准备: 定义一个教师表.一个学生表:在学生表中引用教师表ID create table teachers(teacherID int not null auto_increment primary k ...

  4. JSR303(Bean Validation 1.0)

    Bean Validation的1.0版本 1.约束定义 1.1 约束注解 Constraint 可用于字段.方法.属性.类型.注解类型,validatedBy返回的是ConstraintValida ...

  5. 罚函数法求解约束问题最优解

    问题描述: 约束问题的最优解可以描述为: s.t. minf(x)gi(x)≥0,i=1,⋯,mhj(x)=0,j=1,⋯,l \begin{matrix} & minf(x) \\ s.t. ...

  6. SQL的主键和外键约束

    SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...

  7. 最小二乘拟合,L1、L2正则化约束--转

    原文地址:http://blog.csdn.net/u013164528/article/details/45042895 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找 ...

  8. MySQL学习笔记 约束以及修改数据表

    *** 约束保证数据的完整性和一致性 *** 约束分为表级约束和列级约束 *** 约束类型包括: NOT NULL(非空约束) PRIMARY KEY(主键约束) UNIQUE KEY(唯一约束) D ...

  9. 万字长文了解模拟退火算法原理及求解复杂约束问题(源码实现)

    模拟退火算法原理 退火这个词,其实是铁匠发明的.它的意思很简单,就是将铁匠炉烧热后,再把下边的火撤掉,让金属在炉子里边慢慢冷却.人们发现,这个缓慢的降温过程能消除金属内部的各种缺陷,使得其恢复能量最低 ...

  10. 万字长文带你了解蚁群算法及求解复杂约束问题【源码实现】

    蚁群算法 蚁群算法是一种源于大自然生物世界的新的仿生进化算法,由意大利学者M. Dorigo, V. Maniezzo和A. Colorni等人于20世纪90年代初期通过模拟自然界中蚂蚁集体寻径行为而 ...

最新文章

  1. dispatcherservlet发送2次请求_Spring源码分析(三):MVC请求分发器DispatcherServlet设计实现...
  2. 世界级安全技术专家力作——《Linux防火墙》
  3. 拉登游戏开发--C#实现过程
  4. 机器学习博主推荐、博文推荐
  5. 《The C++ Standard Library》第50页 关于传递auto_ptr的问题
  6. 面试官问:如果MySQL引起CPU消耗过大,你会怎么优化
  7. 中科院院士:最让人讨厌的10种研究生导师
  8. MicroNets:更小更快更好的MicroNet,三大CV任务都秒杀MobileNetV3
  9. 零基础实战Keras模型转化为RKNN格式模型成功运行在RK3399Pro板子上
  10. springboot上传文件到resources_SpringBoot进行文件上传(一)
  11. php函数find的用法,fleaphp crud操作之findByField函数的用法
  12. 计算机系统的用户分几类,计算机操作系统的几种分类方式
  13. Snagit 2019 快速截图
  14. springboot+微信小程序基于微信小程序的高校学生疫情在校封闭管理系统毕业设计源码240904
  15. 什么是SaaS系统,SaaS系统有哪些优势
  16. 微控制器编程技术c语言,8位单片机C语言编程:基于PIC16(用c语言对pic16微控制器进行编程的实用指导)...
  17. 罗技 连点 脚本_走心分享!当评测罗技MASTER 3遇上ANYWHERE 3
  18. 好物推荐:2020 年常用软件锦集!帮你解决 90% 的软件问题
  19. 各系统安装NetFrameWork3.5 安装
  20. mysql association_Mybatis的一对多(collection)和一对一(association)查询

热门文章

  1. 几种主流的定时分布式任务
  2. NVIDIA控制面板怎么打开?
  3. 个在 Android 上实现录像和录音功能的小例子。
  4. HMM+GMM语音识别技术详解级PMTK3中的实例
  5. 职业打假从来就不是保护出来的
  6. html5+css3学习收获与总结(思维和代码构建能力)
  7. Docker id的申请注册
  8. 微信在浏览器中打开提示
  9. 沉淀,熬夜整理100个接口测试的知识点(专业扫盲)
  10. 【拉普拉斯变换】4. 复频域分析