Python实现多维背包问题MKP算法(2)——动态多维背包(回溯法)
问题描述
MKP多维背包问题,特殊的背包问题,是著名的整数规划问题。要求从多个限制条件中选出满足所有条件的最佳组合,并计算出最优价值。
解题思路
用回溯法计算出每一个属性的所有可能性(不超过限制条件),然后将其加入列表里,用一个计数方法将其出现数满足m个属性的个数时,即为满足所有限制条件,再取其中最大值即可。
代码实现
创建输入文本
输入数据:(第一行第一个是商品个数,第二个是属性个数,第三个是计算出的最优价值;第二行是6个商品每一个的价值;第三行到倒数第二行是属性;最后一行是限制条件,最后一行第一个数是第一个属性的限制条件,第二是第二个属性的限制条件,以此类推,数据格式如下,不要有多余的空格或者空行。)
6 10 3800
100 600 1200 2400 500 2000
8 12 13 64 22 41
8 12 13 75 22 41
3 6 4 18 6 4
5 10 8 32 6 12
5 13 8 42 6 20
5 13 8 48 6 20
0 0 0 0 8 0
3 0 4 0 8 0
3 2 4 0 8 4
3 2 4 8 8 4
80 96 20 36 44 48 10 18 22 24
输出数据:
商品个数: 6 属性个数: 10
价值为: [100.0, 600.0, 1200.0, 2400.0, 500.0, 2000.0]
选中第2个商品,价值 600.0元 | 选中第3个商品,价值 1200.0元 | 选中第6个商品,价值 2000.0元 |
数据中给定的最佳价值为: 3800.0 元
算法计算得出的最大值为: 3800.0 元
import time as t
start =t.time()def backtrack(i): #回溯法计算不同的组合并赋值到posibility列表中global curSX,snumif i>=n:posibility.append(snum[:])else:if curSX+shuxing[i]<=xztj:snum[i]=value[i]curSX+=shuxing[i]backtrack(i+1)curSX-=shuxing[i]snum[i]=0backtrack(i+1)def check(num):a = 0print("正在计算最大值...")print("比较中...")for i in num:if num.count(i)==sp_m and sum(i)>a:a = sum(i)bestV = iprint("当前所选的最大价值为:",sum(i),i)print('\n')print('\n商品个数:',n,"属性个数:",sp_m)print("价值为:",value)for i in range(len(bestV)):if bestV[i]!=0:print('选中第%i个商品,价值'%(i+1),value[i],end='元 | ')print("\n数据中给定的最佳价值为:",bv,'元')print("算法计算得出的最大值为:",a,'元')if __name__ == '__main__':f1 = open("MKP input.txt") first_input = f1.read()#print("最开始读入的数据:",first_input)first_data = first_input.split() f1.close()all_data = [float(s) for s in first_data] #print("切割后的数据:",all_data)n = int(all_data[0]) # 读入商品数sp_m = int(all_data[1]) # 读入属性个数bv = float(all_data[2]) #读入最佳价格constraints =list(map(float,all_data[-sp_m:])) # 读入约束条件#print("约束条件为:",constraints)value = list(map(float,all_data[3:n+3])) # 读入商品的价值#print("商品价值为:",value)secend_data = first_input.split('\n') all_shuxing = []for i in range(2, sp_m + 2):all_shuxing.append(list(map(int, secend_data[i].split()))) #print("属性分别为",all_shuxing)curSX = 0 #当前的限制条件数posibility = [] # 记录符合各个限制条件的组合snum = [0 for i in range(n)] #遍历的记录,默认设为[0,0,0,0,0....]for m in range(0, sp_m):print("正在执行计算...")xztj = constraints[m] shuxing = all_shuxing[m] backtrack(0)posibility = posibility[:-1] #去除最后一个可能性,因为是都不选的,无意义check(posibility)end = t.time()print("所耗时间为:",end - start)
原创算法,如有想法请在评论区发表,一起交流学习。
Python实现多维背包问题MKP算法(2)——动态多维背包(回溯法)相关推荐
- Python实现多维背包问题MKP算法(1)——动态多维背包
问题描述 MKP多维背包问题,特殊的背包问题,是著名的整数规划问题.要求从多个限制条件中选出满足所有条件的最佳组合,并计算出最优价值. 解题思路 对一个属性进行不超过限制条件的选择(即01背包问题的列 ...
- 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
(1) 分治法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题 快速排序 快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面, 然后递归分治求解两个子区 ...
- 算法设计与分析 实验三 回溯法求解地图填色问题
回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...
- educoder算法设计与分析 实验五回溯法
实验五 回溯法 第1关:排列 第2关:子集合 第3关:TSP问题 第4关:n皇后问题 第5关:0-1背包 第1关:排列 题目描述: 1.设计算法从前m个大写字母(m≤26)种取出n个字母的所有排列(组 ...
- 【算法设计与分析】C++回溯法求全排列
一.问题描述 设计一个算法求 1-n 的 n 个整数 中取出 m 个整数的全排列,要求在每个排列中每个整数只能取一次. 二.算法分析 直接使用深搜,个数满足了m就输出即可 #include<io ...
- c语言定义可变大小二维数组,C中使用动态二维数组
a[j] = dataStart + j * rowSize; return a; } 参数w,h是所申请二维数组的列数和行数,size是数组单元的字节数.比如,申请一个4*5的int型的二维数组,使 ...
- python 解决 0-1 二维背包问题
问题描述:给定n种物品和一背包.物品i的重量是wi,体积是bi,其价值为vi,背包的容量为C,容积为D.问:应该如何选择装入背包种的物品,使得总价值最大? 其实,这就是一维0-1背包问题的推广,二维背 ...
- 【Python】秀儿!两行代码制作你的专属动态二维码
全文干货,建议收藏以后使用哟! 目录 普通二维码 带图片的艺术二维码 动态二维码 函数常用参数表 今天跟大家分享一个Python两行代码展现骚操作的小项目,生成自己专属的精美二维码,包括普通二维码.带 ...
- c语言 用回溯算法解决01背包问题,回溯法解决01背包问题
<回溯法解决01背包问题>由会员分享,可在线阅读,更多相关<回溯法解决01背包问题(21页珍藏版)>请在人人文库网上搜索. 1.回溯法解决01背包问题,回溯法解决01背包问题, ...
最新文章
- 你以为大厂的代码就不烂?看看这几个公众号怎么说!
- Windows下 更改 pip默认缓存目录
- SAP Spartacus 命名的由来
- C#中Socket通信用法实例详解
- [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
- 如何实现用户通信授权的可信、可知、可追溯?——通信授权服务技术解读
- undefinednbsp;referencenbsp;to…
- SpringBoot(13)--- 数据库操作(集成MyBatis)
- 引物设计软件primer_常用生物学软件的安装与应用(三)—Primer6
- 不怕辣眼睛!这个机器人用脸来摘辣椒
- spring boot2 整合(三)JOOQ工具
- Button的UseSubmitBehavior屬性
- IDEA快捷键的使用
- ffmpeg去除视频黑边命令
- 软件编程推荐书籍 大全
- 微信小程序setData修改数组某一项的值
- 将字符串中的数字字符转换为对应的数字,并且求和输出
- 融合通信无人值守系统解决方案
- C4D和Maya哪个学起来更容易
- (详细易懂)一篇文章让你读懂到底什么是Ajax