基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题(附完整源码下载)

背包问题算法设计

问题要求在一个物品集合中选择合适的物品放入背包,在放入背包中的物品总重量不超过背包容量的前提下,希望放入背包的物品总价值最大。根据是否允许部分物品放入背包的要求,背包问题可以分为【分数背包问题】和【0-1背包问题】。

1. 概要设计

  • 分数背包问题,使用贪心算法得到最优解。
  • 0-1背包问题,若求近似解,使用贪心算法;若求最优解,则分别使用蛮力法、动态规划法及记忆功能改进的动态规划法求解,对于两种动态规划法,返回最终得到的动态规划表。

算法具体功能设计流程如图:

2. 具体算法设计

  • 贪心算法

①求分数背包问题最优解,其思想是求出每个物品的单位价值,并由高至低依次选择物品放入背包,若物品重量小于等于背包容量,则放入背包;否则,将物品进行拆分,将部分物品装进背包中。当背包剩余容量为0时,停止循环,返回最优总价值。函数设计如下:

def Greedy_F(n,c):   #贪心算法求解分数背包问题最优解#n表示物品个数,c表示背包容量global opt1Sumvalue1 = 0  #记录背包内物品总价值opt1 = [0]*n  #记录选择的物品danwei_v = []for i in range(n):d = v[i]/w[i]    #计算物品单位价值danwei_v.append(d)   value = list(enumerate(danwei_v))  #enumerate()函数将物品序号与其对应单位价值组合为一组数对value.sort(key=lambda a: a[1], reverse=True)  #按物品单位价值降序排序while c > 0:for i in range(n):if  w[value[i][0]] <= c:Sumvalue1 += v[value[i][0]]opt1[value[i][0]] = w[value[i][0]]c -= w[value[i][0]]else:Sumvalue1 += c*danwei_v[value[i][0]]opt1[value[i][0]] = celse:breakreturn Sumvalue1  #返回最优总价值

②求0-1背包问题近似解,首先求出每个物品的单位价值,利用循环语句,每次选择单位价值最高的物品装入背包,若物品重量小于等于背包容量,则放入背包,否则,比较下一个物品,直到背包剩余容量为0或已经遍历完所有物品时,停止循环,返回最优总价值。函数设计如下:

def Greedy_I(n,c):     #贪心算法求解0-1背包近似解global opt2Sumvalue2 = 0opt2 = [0]*ndanwei_v = []for i in range(n):d = v[i]/w[i]danwei_v.append(d)value = list(enumerate(danwei_v))value.sort(key=lambda a: a[11], reverse=True)while c > 0:for i in range(n):if  w[value[i][0]] <= c:Sumvalue2 += v[value[i][0]]opt2[value[i][0]] = 1c -= w[value[i][0]]else:breakreturn Sumvalue2
  • 蛮力法

求0-1背包问题最优解。首先穷举物品的全部子集,设置一个记录最大价值的变量maxvalue,遍历所有子集,计算每个子集物品的总重量,若能装入背包,且当前的背包价值大于maxvalue,则将当前值赋值给maxvalue,最后循环遍历完所有的物品组合得到最优解,函数设计如下:

def Brute(n,c):   #蛮力法求解0-1背包最优解a = [0,1]l = list(product(a,repeat=n))#求解[0,1]中元素的全排列组合,repeat=n表示单个元素最大重复次数maxvalue = 0    #记录最大价值global opt3opt3 = []for i in range(len(l)):   #遍历所有子集sumweight = 0  # 将总重量与总价值清零,计算下一子集sumvalue = 0for j in range(n):sumweight += l[j][i]*w[j]   #计算子集的总重量sumvalue += l[j][i]*v[j]if sumweight <= c and sumvalue > maxvalue:   #判断该子集物品能否装入背包,并与最大价值比较进行更新maxvalue = sumvalueopt3 = list(l[i])return maxvalue
  • 动态规划法

动态规划算法求0-1背包问题最优解,初始化动态规划表,表中所有元素为0。单元格F(i,j)表示i个物品,承重量为j的背包最优解时的物品总价值,根据递推关系式:

利用循环逐行填表,最后一个单元格的值F(n,c)即为所要求的的最大总价值,函数设计如下:

def DP(n,c):   #动态规划法求解0-1背包问题最优解for i in range(1,n+1):for j in range(1,c+1):if j-w[i-1] < 0:F1[i][j] = F1[i-2][j]   #F1为初始化动态规划表,且为全局变量else:F1[i][j] = max(F1[i-1][j],F1[i-1][j-w[i-1]]+v[i-1])return F1[n][c]   #最大总价值
  • 记忆功能改进动态规划算法

该算法重点在于维护一个类似自底向上动态规划算法使用的表格,初始化动态规划表,表中第一行和第一列元素均为0,其他元素为-1,表明该单元格还没有被计算过。F(i,j)表示i个物品,承重量为j的背包最优解时的物品总价值。首先检查表中单元格的值是否小于0,若小于0,根据动态规划法的递推关系式使用递归调用进行计算,将返回的结果记录在表中,否则,直接返回单元格中的值。函数设计如下:

def MFK(i,j):   #记忆功能改进动态规划法value = 0if F2[i][j] < 0:    #F2为初始化动态规划表,且为全局变量if j < w[i-1]:value = MFK(i-1,j)else:value = max(MFK(i-1,j),v[i-1]+MFK(i-1,w[i-1]))F2[i][j] = value  #注意缩进return F2[i][j]
  • 回溯表格单元求最优子集的组成元素

利用while循环及条件判断语句,从最后一个单元格开始,若F[i][j]>F[i-1][j],表明物品i以及F[i-1][j-w[i]]的一个最优子集包括在最优解中;否则,物品i不是最优子集的一部分,比较F[i-1][j]与F[i-2][j],当回溯至背包剩余容量为0时,返回最优解。函数设计如下:

def show(F,n,c):   #F为动态规划表global opt4opt4 = [0]*n   #记录物品选择状态i = nj = cwhile c > 0:if F[i][j] > F[i-1][j]:opt4[i-1] = 1j -= w[i - 1]c -= w[i - 1]i -= 1else:i -= 1return opt4

3. 项目测试

考虑下列数据给出的实例:

  • 分数背包问题

通过贪心算法求得最优总价值为38.333,最优解为{物品2,物品3,物品4},物品3只有2/3放入了背包。

  • 0-1背包问题

1、贪心算法求其近似解,得到最大总价值为37,近似解为{物品1,物品2,物品4}。

2、蛮力法、动态规划法、记忆功能改进的动态规划法求最优解,得到最优总价值为37,最优解为{物品1,物品2,物品4}。可以看出,动态规划表F1中每个单元格的值都进行了计算,在F2中,-1表示没有计算的值,即只计算了11个值,从而应用记忆功能改进后,动态规划法的效率得到了提高。

根据测试结果可以看出,对于该实例,用贪心算法得到的近似解与蛮力法等得到的最优解是一样的,即该近似解就是最优解,但该算法并不总是能给出最优解,反例如下:

利用贪心算法得到近似解为{物品1},总价值为40;而利用蛮力法得到最优解为{物品2,物品3},最优总价值为50,即该近似解不是最优解。

完整源码下载

基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题源码+项目说明及注释.zip

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

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

相关文章

形态图像处理

形态图像处理 预备知识 反射、平移结构元 腐蚀和膨胀 腐蚀 将 B 平移&#xff0c;当其原点位于 z 时&#xff0c;其包含在 A 中&#xff0c;则 z 为一个有效的位置&#xff0c;所有有效的z构成了腐蚀之后的结果腐蚀缩小或细化了二值图像中的物体可以将腐蚀看作形态学滤波操…

Solidity 小白教程:12. 事件

Solidity 小白教程&#xff1a;12. 事件 这一讲&#xff0c;我们用转账 ERC20 代币为例来介绍solidity中的事件&#xff08;event&#xff09;。 事件 Solidity中的事件&#xff08;event&#xff09;是EVM上日志的抽象&#xff0c;它具有两个特点&#xff1a; 响应&#x…

探索云计算和大数据分析的崛起:API行业的机遇与挑战【电商大数据与电商API接入】

I. 引言 随着云计算和大数据分析技术的快速发展&#xff0c;企业和个人对数据分析和处理的需求不断增加。在这个信息爆炸的时代&#xff0c;数据已成为企业决策和战略规划的重要基础。云计算提供了强大的计算和存储能力&#xff0c;使得大规模数据的处理和分析变得更加容易和高…

科技成果鉴定测试报告一般包含哪些测试内容?

软件测评报告 一、科技成果评价是需要做第三方软件测评报告&#xff0c;一般是证明技术指标点是否完善&#xff0c;覆盖主要申报内容&#xff0c;应用软件项目科技成果鉴定测试内容&#xff1a; &#xff08;一&#xff09;是否完成合同或计划任务书要求的指标&#xff1b; …

List常见面试问题

List的特点有哪些&#xff1f; Java中的List是一种存放有序的、可以重复的数据的集合&#xff0c;它允许重复元素的存在。List中的元素都有对应的一个序列号(索引)记录着元素的位置&#xff0c;因此可以通过这个序列号来访问元素。 ‍ Java中集合有哪些&#xff1f; Java中…

Ubuntu tmux 默认安装 快捷键

安装 sudo apt install tmux 启动tmux tmux 注意下方已显示[0] 0:bash 左右分屏 依次输入两组快捷键&#xff1a;Ctrlb, Shift5 即:% 上下分屏 依次输入两组快捷键&#xff1a;Ctrlb, Shift 即:" 切换窗口&#xff08;注意&#xff1a;鼠标点击没有切换效果&#x…

【LeetCode算法系列题解】第61~65题

CONTENTS LeetCode 61. 旋转链表&#xff08;中等&#xff09;LeetCode 62. 不同路径&#xff08;中等&#xff09;LeetCode 63. 不同路径 II&#xff08;中等&#xff09;LeetCode 64. 最小路径和&#xff08;中等&#xff09;LeetCode 65. 有效数字&#xff08;困难&#xff…

Neo-reGeorg隧道搭建

目录 Neo-regeorg前言 环境搭建 具体使用 kail安装Neo-reGeorg kail内生成webshell并设置密码 kail与win10连接 windows server内打开服务 kail虚拟机访问windows server以及所在的内网 Neo-regeorg前言 regeorg为reDuh的升级版&#xff0c;主要功能就是把内网服务器的…

IJ中PHP环境的搭建和使用教程

目录 目录 前言 思维导图 1&#xff0c;PHP环境下载 1.下载链接 2.进行安装 3,自定义路径 4.进行相关的一些库的选择下载 2&#xff0c;进行IJ中PHP环境的配置 2.1,下载PHP插件 2.2,下载过程中的注意事项 3&#xff0c;为什么这么做呢? 3.1,原因 3.2,进行代码…

从0开始的ios自动化测试

最近由于工作内容调整&#xff0c;需要开始弄ios自动化了。网上信息有点杂乱&#xff0c;这边我就按我的实际情况&#xff0c;顺便记录下来&#xff0c;看是否能帮到有需要的人。 环境准备 安装tidevice pip3 install -U “tidevice[openssl]”它的作用是&#xff0c;帮你绕…

企业架构LNMP学习笔记28

企业架构LNMP高可用负载均衡服务器之Nginx&#xff1a; 1&#xff09;能够描述负载均衡的作用&#xff1b;loadbalance LB。 2&#xff09;能够了解负载均衡常见的实现方式&#xff1b; 3&#xff09;能够使用nginx实现负载均衡&#xff1b; 4&#xff09;能够描述nginx的常…

上海控安携汽车网络安全新研产品出席AUTOSEMO“恒以致远,共创共赢”主题研讨会

8月31日&#xff0c;AUTOSEMO“恒以致远&#xff0c;共创共赢”主题研讨会在天津成功召开。本次大会由中国汽车工业协会软件分会中国汽车基础软件生态标委会&#xff08;简称&#xff1a;AUTOSEMO&#xff09;与天津市西青区人民政府联合主办。现场汇聚了100余位来自产学研政企…

如何进行SEO优化数据分析?(掌握正确的数据分析方法,让您的网站更上一层楼!)

在互联网时代&#xff0c;SEO优化已经成为了每一个网站运营者必备的技能。而在SEO优化中&#xff0c;数据分析更是至关重要的一环。在本文中&#xff0c;我们将会详细介绍如何正确的进行SEO优化数据分析&#xff0c;让您的网站更上一层楼&#xff01; 数据分析的重要性 数据分…

网络原理(二)TCP的可靠传输

网络原理&#xff08;一&#xff09;目录 网络原理应用层传输层先说UDP&#xff08;不可靠传输&#xff09;重点说明&#xff34;&#xff23;&#xff30;&#xff08;可靠传输&#xff09;一、确认应答二、超时重传三、链接管理建立连接断开链接 四、滑动窗口五、流量控制&am…

rocky(centos) 安装redis,并设置开机自启动

一、下载并安装 1、官网下载Redis 并安装 Download | RedisRedisYou can download the last Redis source files here. For additional options, see the Redis downloads section below.Stable (7.2)Redis 7.2 …https://redis.io/download/ 2、上传下载好的redis压缩包到 /…

k8s 搭建基于session模式的flink集群

1.flink集群搭建 不废话直接上代码&#xff0c;都是基于官网的&#xff0c;在此记录一下 Kubernetes | Apache Flink flink-configuration-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: flink-configlabels:app: flink data:flink-conf.yaml: |jobmanager…

【Vue篇】Vue 项目下载、介绍(详细版)

如何创建一个vue项目&#xff1f;首先要有环境&#xff0c;如下&#xff1a; nodejs vue-cli如果有以上的工具就直接跳过安装教程 【Vue篇】mac上Vue 开发环境搭建、运行Vue项目&#xff08;保姆级&#xff09; 创建vue项目 选择一个位置&#xff0c;你要存放项目的路径&…

海保人寿:开源治理保障科技与保险融合,助力保险业务数字化改革创新

海保人寿保险股份有限公司&#xff08;简称“海保人寿”&#xff09;是第一家在海南筹建开业的全国性保险机构。从成立之初&#xff0c;便深耕于数字化创新&#xff0c;在自身多业务环节中实现数字化转型&#xff0c;依托优秀的研发体系与数智融合的业务系统&#xff0c;不断推…

RocketMQMessageListener使用错误问题分析与排查

背景 RocketMQ与SpingBoot相结合可以大大降低我们开发的复杂度&#xff0c;但是最近在一个新项目中使用RocketMQMessageListener 监听消息&#xff0c;导致消费者启动失败&#xff0c;提示该消费组已经被创建了&#xff0c;请重新申请一个消费者组。 Caused by: org.apache.r…

【深度学习】 Python 和 NumPy 系列教程(三):Python容器:1、列表List详解(初始化、索引、切片、更新、删除、常用函数、拆包、遍历)

目录 一、前言 二、实验环境 三、Python容器&#xff08;Containers&#xff09; 0、容器介绍 1、列表&#xff08;List&#xff09; 1. 初始化 a. 创建空列表 b. 使用现有元素初始化列表 c. 使用列表生成式 d. 复制列表 2. 索引和切片 a. 索引 b. 负数索引 c. 切…