首页 > 编程语言 >机器学习中的算法—背包问题

机器学习中的算法—背包问题

时间:2024-10-28 14:47:50浏览次数:8  
标签:背包 机器 承载量 算法 质量 物品 价值 放入

原文链接:机器学习中的算法—背包问题 – 每天进步一点点

背包问题是一种资源分配算法,是一种非常典型的问题,是对资源分配最大化的体现。

倘若有n件物品,其中每件物品都有属于自己的质量和价值,现在仅有一个背包,但是背包最大的承载量为w,因此需要试图在这个背包里装一些物品,使得物品的价值之和最大且承载量不得超过背包的最大承载量。

背包问题根据选取物品的方式可以分为两种,一种是0-1背包问题,表示当前物品要么被选择要么不被选择;另外一种是部分背包问题,表示物品可以被拆分后选择商品的部分。整个物品的选择过程是独立事件,即在选择某件物品时与另外一件物品不存在关联关系。

0-1背包问题

0-1背包问题是指在某种情况下,可以采用穷举法的办法将所有物品的组合情况一一列出,然后选择在背包承重范围内价值最大的组合即可。这意味着,如果有n件物品,则组成的数量为2”种可能,因此每种物品都存在被选择或未被选择的可能。整个过程随着物品的增加呈现指数级增长,会有严重的性能问题。
除此之外,很容易想到的方法是,选择单位质量下价值最高的产品优先放入背包中,从直观而言似乎比较靠谱,但是通过实际分析却不尽如此。例如,存在一个承载量为10kg的背包,有若干商品,各物品质量和价值见下表。

物品 质量(Kg) 价值(元)
A 4 50
B 6 60
C 7 100
D 8 70

首先,分别计算每个物品在单位Kg下的平均价值,见下表:

物品 质量(Kg) 价值(元) 单位价值(元/Kg)
A 4 50 12.5
B 6 60 10.0
C 7 100 14.3
D 8 70 8,75

其次根据上表中单位价值进行排序,依次为物品C、A、B、D,因此首先将C物品放入背包,但是由于背包限重10kg,因此当C物品放入背包之后,无法继续放其他物品到背包中,此时背包装载物品的价值为100元。

但是,选择物品A和物品B的组合可以获得最大价值110元,并且承重在背包的限制范围内,而仅放入C物品时则不仅达不到最大的价值还未能充分利用背包的承载量。如果物品的集合为a1,a2...,an,假设当取得ak物品之后,在满足背包承载范围的情况下达到背包内物品价值之和最大。那么,在放人ak物品之前的ax1物品则是满足在背包当前承重之下减去ax物品质量之下的最大价值之和,即在每次放入一个物品之前,它的最大价值应当是背包承载量减去还未放人的物品质量。因此,可以利用递推的关系进行推导,用w表示背包的承载量,w;表示第i个物品的本身质量,v;表示第i个物品的价值,c[i,w]表示到放入第i个物品为止,在限制承载量w下的物品价值之和的最大值,公式如下所示:

上述公式表示当在最初时刻或者背包不能承载量时,最大价值为0;当背包的剩余承载量不小于某个物品的质量时,纳入该物品;当没有商品能够填补背包剩余承载量时,当前即为价值之和的最大值。

部分背包

部分背包问题的解决方式与0-1背包不同,部分背包意味着物品可以拆卸。因此,可以按照前面介绍的单位质量下的价值,根据前面表格对单位价值进行排序后的结果见下表:

物品 质量(Kg) 价值(元) 单位价值(元/Kg)
C 7 100 14.3
A 4 50 12.5
B 6 60 10.0
D 8 70 8.75

约定背包的限重依然为10kg,由于物品C的单位价值最大,因此首先放入物品C,然后放人A,但是由于物品A的质量为4kg,放入到背包之后背包超重,所以物品A并不能完全被放入,而最多只能放入3kg,因此物品A将被拆分,即仅能放入原始质量的3/4,价值也相应折扣为37.5元(12.5×3),最终背包累计得到的价值为137.5元(100+37.5)。

在实际的计算过程中,不会对单位质量的价值进行全部排序,因为超过背包质量的其他物品再进行排序也没有实质意义,例如,在表2-8中,物品C和A的质量之和已经超过了背包的限重,因此排序的物品C和A之后的B、D无须排序。

采用两种方式分析背包问题目的在于分析解决问题的本质。0-1背包问题是一个最优解的典型应用,不断从一个小的结果集中推导出全局最优的结果,采用的是动态规划思想的递归方法;而相对于部分背包问题,采用的是贪婪思想,每次选择当前最好的结果,然后不断得到一个最优的结果。

 

标签:背包,机器,承载量,算法,质量,物品,价值,放入
From: https://www.cnblogs.com/longkui-site/p/18510602

相关文章

  • 【计算机专业毕设选题推荐】基于协同过滤算法的的儿童图书推荐系统的设计与实现 【附
    ✍✍计算机编程指导师⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java实战|SpringBoot/SSMPython实战项目|Django微信小程......
  • 聊天机器人羲和的代码04。1
    项目目录结构codeXihuaChatbot/├──data/│└──train_data.jsonl├──logs/│└──(自动创建的日志文件)├──models/│└──xihua_model.pth│└──bert-base-chinese/├──icons/│└──icon.ico├──src/│├──init.py│......
  • 紫微斗数算法的实现流程
    题外话我想了又想大凡能够修炼成绝世高手的都是“魔鬼”。只有魔鬼才会纯粹的“敢贪,敢嗔,敢痴”。你我都困在了敢字。程序猿拿起拿锋利的刀,解构世间的一切吧!最近看西游有感而发。“联系是普遍存在的,规律是客观存在的”,那能不能用程序来解构命运的客观存在?那就来试试吧!​ 紫微......
  • SMO算法 公式推导
    ......
  • 背包问题-分支限界法求解
    此为课题组所指导本科生和低年级硕士生学习组合优化问题汇报所用教材:北京大学屈婉玲教授《算法设计与分析》课程资料:https://www.icourse163.org/course/PKU-1002525003承诺不用于任何商业用途,仅用于学术交流和分享更多内容请关注许志伟课题组官方中文主页:https://JaywayXu.g......
  • 川崎机器人故障报警代码维修排除方法
    川崎机器人故障排除参考方法 首先,第一时间做好系统数据备份工作。了解故障现象,通过现场一些设备的基本现象和现场技术人员的描述进行判断,这样机器人维修起来会比较有效率,。 例如,根据一位现场工程师的描述“川崎控制器偶发会产生自动重启现象,这个重启过程中会看到快要启动时,......
  • 代码随想录算法训练营第十一天|leetcode150. 逆波兰表达式求值、leetcode239. 滑动窗
    1leetcode150.逆波兰表达式求值题目链接:150.逆波兰表达式求值-力扣(LeetCode)文章链接:代码随想录视频链接:栈的最后表演!|LeetCode:150.逆波兰表达式求值_哔哩哔哩_bilibili自己的思路:这是一道有思路,但是思路并不多的题目,就是我会觉得是先将数据进行添加,然后对于符号通过倒......
  • 100种算法【Python版】第15篇——KMP算法
    本文目录1算法原理1.1部分匹配表2实现步骤3示例说明4python实例5算法应用领域1算法原理KMP(Knuth-Morris-Pratt)算法是一种用于高效字符串匹配的算法。它通过预处理模式字符串,构建一个部分匹配表(前缀函数),以避免重复比较,从而提高匹配效率。KMP算法通......
  • Lua代码——使用遗传进化算法(neat算法)玩超级玛丽游戏
    前文:模拟器运行环境及Lua代码——使用遗传进化算法(neat算法)玩超级玛丽游戏SuperMario_GeneticEvolution_Neat项目介绍:模拟器运行环境及Lua代码——使用遗传进化算法(neat算法)玩超级玛丽游戏代码地址:https://openi.pcl.ac.cn/devilmaycry812839668/SuperMario_GeneticEvol......
  • 【最新华为OD机试E卷-支持在线评测】机器人活动区域(200分)多语言题解-(Python/C/Java
    ......