贪心算法在背包问题上的运用(Python)

在这里插入图片描述

背包问题

有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

这就是典型的背包问题(又称为0-1背包问题),也是具体的、没有经过任何延伸的背包问题模型。

背包问题的传统求解方法较为复杂,现定义有一个可以载重为8kg的背包,另外还有4个物品,物品的价值和质量数据如下表,不考虑背包的容量。4个物品的总质量大于8kg,所以要想在有限载重的背包携带更多质量的物品,就要有一套算法进行取舍,最终寻找到最优解。
\begin{table}[!h!tbp]
\caption{各个物品的参数}\label{tableproblem1}
\centering
\begin{tabular}{ccccc}
\hline
物品序号i & 1 & 2 & 3 & 4\
\hline
质量w(kg) & 2 & 3 & 4 & 5 \
价值v(元) & 3 & 4 & 5 & 6 \
\hline
\end{tabular}
\end{table}

传统的背包问题解法是根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)找出0-1背包问题的最优解以及解组成。实现流程图如图:
在这里插入图片描述

根据算法流程,不妨计算一下上述问题,由于物体有8个,且其质量都是整千克数,背包最大载荷是8kg,定义V(i,j)为当前背包容量为j,前i个物品最佳组合对应的价值。建立一个4行8列的表格,如表:
\begin{table}[!h]
\caption{V(i,j)取值表}\label{tableproblem12}
\centering
\begin{tabular}{c|c| c |c| c| c|c|c|c}
\hline
\diagbox{i}{j} & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8\
\hline
1 & & & & & & & &\\hline
2 & & & & & & & &\\hline
3 & & & & & & & &\\hline
4 & & & & & & & &\
\hline
\end{tabular}
\end{table}

在表中,依次计算每列的数据,如i=1,j=1时,对应的方块的值V(1,1)代表当前背包容量为1,前1个物品(即表\ref{tableproblem1}中的物品1)最佳组合对应的价值。因为第1个物品质量为2kg,所以不能装进背包,故V(1,1)=0.继续计算V(1,2),比较V(1-1,2)=V(0,2)=0与V(1-1,2-w(1))+v(1)=3的值,V(1,2)即为两者中的较大值3.因为i=1时,仅有物品1可以装进背包,所以不论背包容量是多少都最多只能放入物品1,所以i=1对应的其余V都是3,即:V(1,3)=V(1,4)=V(1,5)=V(1,6)=V(1,7)=V(1,8)=3.

继续计算i=2的情况。V(2,1)很显然等于1,因为2-w(2)<0,所以V(2,2)=3.V(2,3)的取值用V(2-1,3)=3和V(2-1,3-w(2))+v(2)=V(1,0)+v(2)=0+4=4两者的大值,所以V(2,3)=4.同理,V(2,4)的取值用V(2-1,4)=3和V(2-1,4-w(2))+v(2)=V(1,1)+v(2)=0+4=4两者的大值,所以V(2,4)=4.V(2,5)用V(2-1,5)=3和V(2-1,5-w(2))+v(2)=V(1,2)+v(2)=3+4=7两者的大值,所以V(2,5)=7.基于此方法,可以求得所有的V(i,j),如表:
在这里插入图片描述

根据表的结果,背包最大能存放价值为10元的物品。通过查阅资料,了解到此结果为确定的最优解。但是如果例子里的数值范围较大,如表\ref{tableproblem2},难道需要列一个60行的表格计算吗?如果甚至质量值不是整数呢?因此,就有了下面的贪心算法。

贪心算法

贪心算法,又称贪婪算法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好的或最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好或最优的解。贪婪法的每次决策都以当前情况为基础并根据某个最优原则进行选择,不从整体上考虑其他各种可能的情况。

正是因为贪心算法只考虑当前步骤,而不对整体优化问题的其余任何部位进行考虑,所以它往往没有较好的搜索终点的能力,更无法找到理想的解,所以贪心算法会跟其他算法进行融合,或者说是对其他算法进行补充,以达到快速计算的目的。

贪心算法用于背包问

更改前述问题数值,将背包载重扩大到150kg,各物品参数如表\ref{tableproblem2}。
\begin{table}[!h!tbp]
\caption{各个物品的参数}\label{tableproblem2}
\centering
\ 50 & 40 & 10 & 25 \
价值(元) & 10 & 40 & 30 & 50 & 35 & 40 & 30 \
\hline
\end{tabular}
\end{table}

运用最小重量贪心策略(python程序见附录),结果如图\ref{结果}。求得最终总重量为:140,总价值为:155。
若运用最小价值密度\footnote{价值密度定义为重量/价值,可以兼具重量小于价值高的要求}贪心策略,求得最终总重量为:150,总价值为:170。
\begin{figure}[h]
\centering
\includegraphics[width=0.6\textwidth]{结果.jpg}
\caption{两种贪心策略的运算结果}\label{结果}
\end{figure}

总结

传统算法精度高,能找到确定的值。贪心算法运算过程非常快,但是从两种不同贪心策略的计算结果不同这个事实即可认为贪心算法的解精度可能并不高,甚至会与真实值偏离较大,所以一般并不适用于作为某个求解问题的最终算法。

python代码

# edit by JBR, data 2020.11.21
class Good:def __init__(self, weight, value, status):self.weight 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/405287.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JNA调用DLL报堆栈溢出错误(0xC00000FD)

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

C++观察者模式Observer

组件协作 –(都是晚绑定的&#xff09; ----观察者模式 为某些对象建立一种通知依赖的关系&#xff0c; 只要这个对象状态发生改变&#xff0c;观察者对象都能得到通知。 但是依赖关系要松耦合&#xff0c;不要太依赖。 eg&#xff1a;做一个文件分割器&#xff0c;需要一个…

React学习笔记(一)——react基础

1. React 介绍 1.1 React是什么 React由Meta公司研发&#xff0c;是一个用于 构建Web和原生交互界面的库 1.2 React的优势 相较于传统基于DOM开发的优势&#xff1a; 组件化的开发方式不错的性能 相较于其它前端框架的优势&#xff1a; 丰富的生态跨平台支持 1.3 React的市场…

基于MATLAB视觉的静态手势识别系统

一、课题介绍及思路 为了丰富手势识别方法的多样性&#xff0c;提高手势识别的正确率&#xff0c;提出了一种基于手势轮廓像素变化的手势识别方法。在Matlab环境下&#xff0c;设计并开发了一个基于视觉的静态手势识别系统。系统主要由两部分组成&#xff1a;手势分割与手势识…

数据科学已死?

既然有了人工智能&#xff0c;训练自己的机器学习模型是否还值得&#xff1f; 既然有了人工智能&#xff0c;学习 Python 是否还值得&#xff1f; 既然有了人工智能&#xff0c;KNIME 还在营业吗&#xff1f; 既然有了人工智能&#xff0c;数据科学是否仍然需要&#xff1f;…

指挥调度平台——数字赋能,让出行更有温度

智慧交通指挥调度平台是基于信息技术和智能化系统的创新解决方案&#xff0c;旨在提升城市交通管理效率、改善交通流畅度、减少拥堵问题&#xff0c;以及增强城市交通运行的智能化水平。该平台整合了大数据分析、实时监测、智能优化算法等技术&#xff0c;为交通管理部门提供全…

牛!6个大模型的核心技术!

大家好&#xff0c;我是花哥。本文我们谈下火爆的大模型背后&#xff0c;有哪些的核心技术&#xff01; 一、Transformer Transformer 是大模型的底层模型。在深度学习的早期阶段&#xff0c;循环神经网络&#xff08;RNN&#xff09;是处理序列数据的常用方法。尽管RNN及其变…

1.XV6环境配置

安装虚拟机 这个就不多说了&#xff0c;搞一台Ubuntu虚拟机即可&#xff0c;最好是通过vscode 用ssh远程连接进行实验会比较方便&#xff0c;具体怎么做可参考我这篇博客&#xff1a; VsCode配置SSH连接远程服务器&#xff08;手把手&#xff0c;学不会打我&#xff09;_vsco…

【GitLab】使用 Docker 安装 GitLab 1:配置 SSH 端口

使用 Docker 安装 GitLab 要求修改ssh端口 GitLab 使用 SSH 通过 SSH 与 Git 交互。默认情况下,GitLab 使用端口22。 要在使用 GitLab Docker 映像时使用其他端口,您可以执行以下操作之一: 更改服务器的 SSH 端口(推荐)。 更改 GitLab Shell SSH 端口。 更改服务器的 SSH …

数据链路层 III(介质访问控制)【★★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 介质访问控制所要完成的主要任务是&#xff1a;为使用介质的每个结点隔离来自同一信道上其他结点所传送的信号&#xff0c;以协调活动结点的传输。 下图所示是广播…

ubuntu安装虚拟环境(tensorflow、torch)

一、安装需求 1、确保ubuntu可以ping通百度 2、设置好了pip镜像源&#xff0c;&#xff08;具体可看&#xff1a;ubuntu配pip的源-CSDN博客&#xff09; 二、安装虚拟环境&#xff08;务必使用sudo进行&#xff09; step1&#xff1a;执行安装命令 更改了pip默认使用pip3的…

基于WonderJourney生成电影级连续的3D场景视频

在本文中,我将详细记录在Windows环境下配置和使用WonderJourney项目的完整流程,包括环境搭建、常见问题的解决方案以及如何修改源码以兼容Windows系统。WonderJourney项目能够生成高度逼真的村庄视频,并允许用户通过配置文件对视频生成过程进行精细化控制。 由于官方文档在…

基于Java语言的能源管理系统-水电气热油数据采集系统

介绍 基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 适用于建筑、工厂、商场、医院、园区、高耗能企业、城市双碳建设平台等的水、电、气、热、油等能源数据采集、加工、分析、预警、碳指标、碳排放计算…

vue使用axios请求后端数据

前后端分离项目的基础&#xff1a; 前后端跨域访问 vite.config.js中加入 // 1.为什么要跨域 //因为浏览器的同源策略,不同站点之间访问需要跨域 //实现跨域的方式&#xff1a;server: {proxy: {// 假设要跨域访问的后端 API 地址以 /api 开头/api: { //表示拦截以/api开头的…

域名注册查询方法

域名不仅是网站的地址标识&#xff0c;更是企业和个人在互联网上的身份证明。要确保自己的在线品牌安全&#xff0c;了解域名注册查询方法至关重要。本文将介绍几种常见的域名查询方式&#xff0c;帮助您轻松了解网络资产的归属。 1. WHOIS查询&#xff1a; WHOIS&#xff08;…

产品经理-​​实习中的自我迭代(41)

实习中的自我迭代,优秀实习生必备素质 跟大家认识了之后&#xff0c;就要开始做事情了&#xff0c;那我们怎么做一个优秀的实习生呢&#xff1f;以下几点作为参考。 1. 目标明确 知道自己的工作为什么要做&#xff0c;要做到什么程度&#xff0c;目前存在什么问题&#xff0c;该…

C++11:右值引用、移动语义和完美转发

目录 前言 1. 左值引用和右值引用 2. 引用范围 3. 左值引用的缺陷 4. 右值引用的作用 5. 右值引用的深入场景 6. 完美转发 总结 前言 C11作为一次重大的更新&#xff0c;引入了许多革命性的特性&#xff0c;其中之一便是右值引用和移动语义。本文将深入探讨其中引入的…

如何科学设定短信群发频率

在利用短信群发作为营销策略时&#xff0c;平衡好发送频率至关重要。过于频繁的短信可能招致客户反感甚至被屏蔽&#xff0c;而发送不足则可能导致品牌信息被遗忘。因此&#xff0c;精准把握短信群发频率&#xff0c;是提升客户体验与品牌记忆度的关键。以下是几个常见行业短信…

Aop切面编程

学习视频 一、定义模型&#xff1a;订单保存模型&#xff0c;订单更新模型&#xff0c;业务层&#xff0c;日志模型 订单保存模型 /*** author durunwu* date 2024-08-20-21:04*/ Data public class SaveOrder {private Long id; }订单更新模型 /*** author durunwu* date …

Veritas NBU8.3.0.2 安装Master Server及汉化包(篇二)

一、环境自检阶段 1、Master角色地址为192.168.189.2&#xff0c;计算机名称为bakmaster&#xff0c;域名为sszz.com 2、防火墙均已关闭 二、安装Master Server 1、右击“Browser”以管理员身份运行 2、单击“NetBackup Server Software Installation” 3、忽略UAC告警&#…