问题描述

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)——动态多维背包(回溯法)相关推荐

  1. Python实现多维背包问题MKP算法(1)——动态多维背包

    问题描述 MKP多维背包问题,特殊的背包问题,是著名的整数规划问题.要求从多个限制条件中选出满足所有条件的最佳组合,并计算出最优价值. 解题思路 对一个属性进行不超过限制条件的选择(即01背包问题的列 ...

  2. 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

    (1) 分治法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题 快速排序 快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面, 然后递归分治求解两个子区 ...

  3. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  4. educoder算法设计与分析 实验五回溯法

    实验五 回溯法 第1关:排列 第2关:子集合 第3关:TSP问题 第4关:n皇后问题 第5关:0-1背包 第1关:排列 题目描述: 1.设计算法从前m个大写字母(m≤26)种取出n个字母的所有排列(组 ...

  5. 【算法设计与分析】C++回溯法求全排列

    一.问题描述 设计一个算法求 1-n 的 n 个整数 中取出 m 个整数的全排列,要求在每个排列中每个整数只能取一次. 二.算法分析 直接使用深搜,个数满足了m就输出即可 #include<io ...

  6. c语言定义可变大小二维数组,C中使用动态二维数组

    a[j] = dataStart + j * rowSize; return a; } 参数w,h是所申请二维数组的列数和行数,size是数组单元的字节数.比如,申请一个4*5的int型的二维数组,使 ...

  7. python 解决 0-1 二维背包问题

    问题描述:给定n种物品和一背包.物品i的重量是wi,体积是bi,其价值为vi,背包的容量为C,容积为D.问:应该如何选择装入背包种的物品,使得总价值最大? 其实,这就是一维0-1背包问题的推广,二维背 ...

  8. 【Python】秀儿!两行代码制作你的专属动态二维码

    全文干货,建议收藏以后使用哟! 目录 普通二维码 带图片的艺术二维码 动态二维码 函数常用参数表 今天跟大家分享一个Python两行代码展现骚操作的小项目,生成自己专属的精美二维码,包括普通二维码.带 ...

  9. c语言 用回溯算法解决01背包问题,回溯法解决01背包问题

    <回溯法解决01背包问题>由会员分享,可在线阅读,更多相关<回溯法解决01背包问题(21页珍藏版)>请在人人文库网上搜索. 1.回溯法解决01背包问题,回溯法解决01背包问题, ...

最新文章

  1. 你以为大厂的代码就不烂?看看这几个公众号怎么说!
  2. Windows下 更改 pip默认缓存目录
  3. SAP Spartacus 命名的由来
  4. C#中Socket通信用法实例详解
  5. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
  6. 如何实现用户通信授权的可信、可知、可追溯?——通信授权服务技术解读
  7. undefinednbsp;referencenbsp;to…
  8. SpringBoot(13)--- 数据库操作(集成MyBatis)
  9. 引物设计软件primer_常用生物学软件的安装与应用(三)—Primer6
  10. 不怕辣眼睛!这个机器人用脸来摘辣椒
  11. spring boot2 整合(三)JOOQ工具
  12. Button的UseSubmitBehavior屬性
  13. IDEA快捷键的使用
  14. ffmpeg去除视频黑边命令
  15. 软件编程推荐书籍 大全
  16. 微信小程序setData修改数组某一项的值
  17. 将字符串中的数字字符转换为对应的数字,并且求和输出
  18. 融合通信无人值守系统解决方案
  19. C4D和Maya哪个学起来更容易
  20. (详细易懂)一篇文章让你读懂到底什么是Ajax

热门文章

  1. 计算机函数汇总,计算机二级EXCEL必考函数汇总
  2. Influence Maximization影响力最大化
  3. rtl仿真器-incisive安装和测试
  4. html5腾讯地图自动定位,HTML5定位,腾讯地图公交导航。
  5. 《Linux就该这么学》第十节课学习笔记
  6. Windows家庭版-本地组策略添加用户或组
  7. TF2.0 TFRecord创建和读取
  8. 一年十倍的期货操盘策略(四):无形套利模式
  9. 2023全网最新微信支付宝QQ三合一支付生成PHP源码
  10. Sketch、Figma 和 XD 怎么相互转换格式?