1.3装箱问题与背包问题
Pascal经典算法-背包问题析ppt课件

递归概念
我们可以用choose(I,z)来表示后i个物品在只剩下v个体积的空间中取的最 大价值
所谓的背包问题,可以描画如下: 一个小偷打劫一个保险箱,发现柜子里有N
个不同大小与价值的物品,但小偷只需一 个容积为M的背包来装东西,背包问题就 是要找出一个小偷选择所偷物品的组合, 以使偷走的物品总价值最大。我们标识每 个物品的价为VI,大小是ZI
算法描画
对于0/1背包相关的问题我们有多种方法可 以处理
end;
end;
0/1背包问题的分析
该背包问题的目的在于求最优解,所以我们要用 回溯的方法将一切的解求出来,逐一比较求最优 秀的解;
对于每个节点的扩展只需两种类能够要不取,要 不不取,所以该搜索树为一个N层的二叉树。
解空间的长度是<=n。 解空间的组织方式是一棵2叉树,一个可行的解就
是从根节点到叶子节点的一条途径。每个解为一 个长度不超越N的0/1代码序列 控制战略那么是前面的选择没有超越背包的容量。
end;
for i:=算符最小值 to 算符最大值 do
begin
算符i作用于生成stack[k-1]产生子形状stack[k];
if stack[k]满足约束条件 then make(k+1);{假设不满足,那么经过for循环换一个算
算符扩展。注:假设在扩展stack[k].state时运用过全局变量,那么应插入假设干条语句,恢
二、回溯的通用描画算法
program 程序名;
背包问题课件

刷表法——手推
【样例输入】package.in
10 4
21
for(int i=1;i<=n;++i)
Hale Waihona Puke 33for(int v=m;v>=w[i];--v)
45
f[v]=max(f[v],f[v-w[i]]+c[i])
79
【样例输出】package.out
12
i
W[i]
C[i]
i=0
0
0
i=1
2
1
i=2
理一件物品,作为一个阶段,共有n个 阶段 2、定义状态:
定义f[i][v]是前i件物品恰好放 入一个容量为v的背包,所得到的最大 价值 3、状态转移方程: 若第i件物品没有放入背包,则f[i][v]=f[i-
1][v] 若第i件物品放入背包,则f[i][v]=f[i-1][v-
w[i]]+c[i] 根据状态定义,f[i][v]=max(f[i-1][v],f[i-
【输出格式】 仅一行,一个数,表示最大总价值。
【样例输入】package.in 10 4 21 33 45 79
【样例输出】package.out 12
01背包
【问题描述】 一个旅行者有一个最多能用m公斤的
背包,现在有n件物品,它们的重量分别是 W1,W2,...,Wn,它们的价值分别为 C1,C2,...,Cn.若每种物品只有一件求旅行者 能获得最大总价值。 【输入格式】
1][v-w[i]]+c[i]) 4、临界值: 当i==0时,表示一件物品也没有, f[0][v]=0,数组f在main函数前定义即可
刷表法——手推
【样例输入】package.in 10 4
最新1.3装箱问题与背包问题

装箱问题的LINGO软件求解
例1 已知30个物品,其中6个长0.51m,6个长 0.27m,6个长0.26m,余下12个长0.23m, 箱子长为1m,问最少需多少个箱子才能把30 个物品全部装进箱子。
见lingo程序
装箱问题的近似求解算法
NF(Next Fit-下次适应)算法:按照物 体给定的顺序装箱:把物品wi放到它第 一个能放进去的箱子中。Bj是具有最大 下标的使用过的箱子,若wi的长度不大 于Bj的剩余长度,则把wi放入Bj,否则 把wi放入一个新的箱子Bj+1,且Bj在以 后的装箱中不再使用。
多机调度问题要求给出一种作业调度方案,使所给的n个 作业在尽可能短的时间内由m台机器加工处理完成。
[分析]这个问题可以看成装箱问题,也是NP完全问题。对 于这一类问题,用贪婪选择策略有时可以设计出较好的近似 算法。采用最长处理时间作业优先的贪婪选择策略可以设计 出解多处理器调度问题的较好的近似算法。按此策略,当 n≤m时,我们只要将机器i的[0,ti]时间区间分配给作业i即 可。
适应算法的特点是当处理当前物品,如果有已经打 开的箱子中能够放下这个物品,则不打开新的箱子。
在线算法:如果一个近似装箱算法在执行过程中, 每当一个物品到达时,就立刻决定把该物品放入哪 个箱子中,而不管后序物品如何,这种算法就被称 为在线算法。下次适应算法、首次适应算法等都是 在线算法,其时间复杂度都为O(n) 。
FFD算法: { 输入箱子的容积; 输入物品种数n; 按体积从大到小顺序,输入各物品的体积; 预置已用箱子链为空; 预置已用箱子计数器box_count为0; for (i=0;i<n;i ++ ) { 从已用的第一只箱子 开始顺序寻找能放入物品i 的箱子j;
数据结构 背包问题

数据结构背包问题引言概述:数据结构是计算机科学中非常重要的一个领域,它涉及到如何组织和存储数据,以便能够高效地进行操作和处理。
背包问题是一个经典的计算机科学问题,它涉及到如何在给定的背包容量下,选择一些物品放入背包中,使得背包的总价值最大化。
本文将从五个大点来详细阐述背包问题的相关内容。
正文内容:1. 背包问题的定义与分类1.1 背包问题的定义:背包问题是指在给定的背包容量和一组物品的重量和价值下,如何选择物品放入背包中,使得背包的总价值最大化。
1.2 背包问题的分类:背包问题可以分为0/1背包问题、分数背包问题和多重背包问题。
0/1背包问题要求每个物品只能选择放入背包一次或不放入;分数背包问题允许物品被分割成若干部分放入背包;多重背包问题允许每个物品有多个可选的数量。
2. 背包问题的解决方法2.1 动态规划法:动态规划是解决背包问题的常用方法。
它将问题划分为子问题,并利用子问题的解来构建原问题的解。
通过构建一个二维数组来保存每个子问题的解,可以逐步求解出整个问题的最优解。
2.2 贪心算法:贪心算法是一种简单而高效的解决背包问题的方法。
它通过每次选择当前最优的物品来构建解决方案。
贪心算法的优势在于其计算速度快,但可能无法得到全局最优解。
2.3 回溯算法:回溯算法是一种通过试探和回溯的方式来解决问题的方法。
它通过遍历所有可能的解决方案来找到最优解。
回溯算法的优势在于可以找到全局最优解,但计算速度较慢。
3. 背包问题的优化3.1 剪枝策略:剪枝策略是一种通过提前终止无效的搜索分支来减少计算量的方法。
通过判断当前路径是否有可能达到更优解,可以避免无效的搜索。
3.2 近似算法:近似算法是一种通过近似解来求解问题的方法。
它可以在较短的时间内得到一个接近最优解的解决方案,但无法保证其准确性。
3.3 动态规划的优化:动态规划法可以通过一些优化技巧来提高算法的效率,如使用滚动数组来减少空间复杂度,或者使用一些启发式规则来提前终止无效的计算。
背包问题九讲

背包问题九讲2.0RC1崔添翼(Tianyi Cui)*2011-09-28†本文题为《背包问题九讲》,从属于《动态规划的思考艺术》系列。
这系列文章的第一版于2007年下半年使用EmacsMuse制作,以HTML格式发布到网上,转载众多,有一定影响力。
2011年9月,本系列文章由原作者用L A T E X重新制作并全面修订,您现在看到的是2.0alpha版本,修订历史及最新版本请访问https:///tianyicui/pack查阅。
本文版权归原作者所有,采用CC BY-NC-SA协议发布。
Contents101背包问题31.1题目 (3)1.2基本思路 (3)1.3优化空间复杂度 (3)1.4初始化的细节问题 (4)1.5一个常数优化 (4)1.6小结 (5)2完全背包问题52.1题目 (5)2.2基本思路 (5)2.3一个简单有效的优化 (5)2.4转化为01背包问题求解 (6)2.5O(V N)的算法 (6)2.6小结 (7)3多重背包问题73.1题目 (7)3.2基本算法 (7)3.3转化为01背包问题 (7)3.4可行性问题O(V N)的算法 (8)*a.k.a.dd_engi†Build2011092818380013.5小结 (9)4混合三种背包问题94.1问题 (9)4.201背包与完全背包的混合 (9)4.3再加上多重背包 (9)4.4小结 (10)5二维费用的背包问题105.1问题 (10)5.2算法 (10)5.3物品总个数的限制 (10)5.4二维整数域N2上的背包问题 (11)5.5小结 (11)6分组的背包问题116.1问题 (11)6.2算法 (11)6.3小结 (12)7有依赖的背包问题127.1简化的问题 (12)7.2算法 (12)7.3较一般的问题 (12)7.4小结 (13)8泛化物品138.1定义 (13)8.2泛化物品的和 (13)8.3背包问题的泛化物品 (14)8.4小结 (14)9背包问题问法的变化149.1输出方案 (15)9.2输出字典序最小的最优方案 (15)9.3求方案总数 (15)9.4最优方案的总数 (16)9.5求次优解、第K优解 (16)9.6小结 (17)2101背包问题1.1题目有N件物品和一个容量为V的背包。
数学建模背包问题

背包问题背包问题(Knapsack problem)是一种组合优化的NP 完全问题。
问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
问题的名称来源于如何选择最合适的物品放置于给定背包中。
相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。
也可以将背包问题描述为决定性问题,即在总重量不超过W 的前提下,总价值是否能达到V ?它是在1978年由Merkel 和Hellman 提出的一、定义:背包问题属于组合优化问题,一般的最优化问题由目标函数和约束条件两部部分组成:我们有n 种物品,物品i 的重量为w i ,价格为p i 。
我们假定所有物品的重量和价格都是非负的。
背包所能承受的最大重量为W 。
如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。
可以用公式表示为:1max ni i i p x =∑1..,ni i i S T w x W =≤∑ {}0,1i x ∈如果限定物品i 最多只能选择b i 个,则问题称为有界背包问题。
可以用公式表示为:1max ni i i p x =∑1..,n i i i S T w xW =≤∑ {}0,1,,i i x b ∈⋅⋅⋅如果不限定每种物品的数量,则问题称为无界背包问题。
各类复杂的背包问题总可以变换为简单的0-1背包问题进行求解。
二、基本模型的建立方法1、0-1背包问题的数学模型(最基础的背包问题)分类:0-1背包问题简单分为一维背包和二维背包问题。
特点:每种物品仅有一件,可以选择放或不放。
1.1 一维背包问题问题:一个旅行者准备进行徒步旅行,为此他必须决定携带若干物品。
设有n 件物品可供他选择,编号为1,2,...,n 第i 件物品重量为i w 千克,价值为i p 元,他能携带的最大重量为w 千克。
他应该装入哪几件物品价值最大。
解:引入变量i x ,且设1,(1,2,,)0,i i x i n i ⎧==⎨⎩表示将第种物品装入包中表示不将第种物品装入包于是此问题的数学模型为:1max ni i i f p x ==∑1122.....01,1,2,...,.n n iw x w x w x W S T x i n +++≤⎧⎨==⎩或 1.2 二维背包问题一维背包问题只考虑了背包重量的限制,如果再增加背包体积的限制为V ,并设第i 件物品的体积i v ,问如何携带可使总价值最大。
背包问题的算法
背包问题是一种经典的优化问题,通常用于解决在给定一组物品和它们的重量、价值等信息的情况下,如何选择一些物品放入一个容量有限的背包中,使得背包中物品的总价值最大或总重量最小等问题。
以下是背包问题的一种经典算法——动态规划法:
1. 定义状态:设f[i][j]表示前i个物品中选择若干个物品放入容量为j的背包中所能获得的最大价值或最小重量。
2. 状态转移方程:对于第i个物品,有两种情况:
- 不放入背包中,此时f[i][j]=f[i-1][j];
- 放入背包中,此时f[i][j]=max(f[i-1][j], f[i-1][j-w[i]]+v[i]),其中w[i]和v[i]分别表示第i 个物品的重量和价值。
3. 初始化:f[0][0]=0。
4. 计算最优解:根据状态转移方程,从上到下依次计算每个物品的状态值,最终得到f[n][m]即为所求的最优解。
时间复杂度:O(n*m),其中n为物品数量,m为背包容量。
空间复杂度:O(n*m)。
01背包问题的数学逻辑
01背包问题的数学逻辑摘要:一、背包问题概述二、背包问题的数学模型1.基本形式2.扩展形式3.多维背包问题三、求解背包问题的算法1.暴力枚举法2.动态规划法3.贪心算法4.回溯算法四、背包问题的应用1.运筹学2.物流管理3.投资决策五、提高背包问题求解效率的方法1.优化数据结构2.改进算法策略3.利用贪心策略正文:一、背包问题概述背包问题是一个经典的组合优化问题,起源于运筹学领域。
它描述了一个旅行者需要在有限的重量和容量限制下,从一系列物品中选择最有价值的物品装入背包的过程。
背包问题具有广泛的应用背景,如物流管理、投资决策等。
二、背包问题的数学模型1.基本形式背包问题基本形式可以用以下数学模型表示:给定一组物品,每种物品都有一定的重量和价值,求在背包重量限制下,如何选择物品使得背包内物品的总价值最大。
2.扩展形式在基本形式的基础上,背包问题还可以扩展为多个背包、有先后顺序的物品、有特殊约束条件等。
3.多维背包问题多维背包问题是在二维平面上的扩展,不仅需要考虑物品的重量和价值,还要考虑物品之间的相互依赖关系。
三、求解背包问题的算法1.暴力枚举法暴力枚举法是一种简单的求解背包问题的方法,通过遍历所有可能的物品组合,找到满足条件的最优解。
但该方法时间复杂度高,不适合处理大规模问题。
2.动态规划法动态规划法是将背包问题分解为子问题,通过递归的方式求解。
该方法具有较好的时间复杂度,但需要合理设计状态转移方程。
3.贪心算法贪心算法在每一步都选择当前最优的解,但不一定能得到全局最优解。
在背包问题中,贪心算法可以通过物品的价值与重量比来选择装入背包的物品。
4.回溯算法回溯算法是一种试探性的搜索算法,通过逐步尝试的方式寻找最优解。
在背包问题中,回溯算法可以通过剪枝策略减少搜索空间。
四、背包问题的应用1.运筹学背包问题是运筹学领域的一个典型例子,通过求解背包问题,可以优化物流、仓储等领域的运营管理。
2.物流管理在物流领域,背包问题可以用于优化路径规划、货物分拣等问题。
背包问题的数学模型
背包问题的数学模型摘要:1.背包问题的定义2.背包问题的数学模型3.背包问题的求解方法4.背包问题的应用实例正文:一、背包问题的定义背包问题是一个经典的优化问题,它的问题是给定一个背包和n 种物品,其中,背包的容量为V,第i 种物品的质量为c_i,价值为p_i,如何通过物品选择,使得装入背包中的物品总价值最大。
二、背包问题的数学模型为了更好地理解背包问题,我们可以将其建立一个数学模型。
假设有n 种物品,分别用v_i 表示第i 种物品的价值,c_i 表示第i 种物品的质量,那么背包问题的数学模型可以表示为:f(x) = max {v_1x_1 + v_2x_2 +...+ v_nx_n}s.t.c_1x_1 + c_2x_2 +...+ c_nx_n <= Vx_i >= 0, i = 1,2,...,n其中,f(x) 表示背包中物品的总价值,x_i 表示第i 种物品的数量,V 表示背包的容量,c_i 表示第i 种物品的质量,v_i 表示第i 种物品的价值。
三、背包问题的求解方法背包问题的求解方法有很多,常见的有动态规划法、回溯法、贪心算法等。
这里我们以动态规划法为例进行介绍。
动态规划法的基本思想是将问题分解为子问题,通过求解子问题,最终得到原问题的解。
对于背包问题,我们可以将问题分解为:在容量为V 的情况下,如何选择物品使得总价值最大。
然后,我们可以通过递归的方式,依次求解子问题,最终得到原问题的解。
四、背包问题的应用实例背包问题是一个非常实用的优化问题,它在现实生活中有很多应用。
例如,一个果农需要根据市场需求和成本,选择合适的水果进行装箱;一个旅行者需要根据行李箱的容量和物品的价值,选择携带的物品等。
这些都可以通过背包问题来求解。
综上所述,背包问题是一个经典的优化问题,它有着广泛的应用。
背包问题
(0-1)背包问题的解法小结1.动态规划法递推关系:– 考虑一个由前i 个物品(1≤i ≤n )定义的实例,物品的重量分别为w 1,…,w i ,价值分别为v 1,…,v i ,背包的承重量为j (1≤j ≤W )。
设V [I,j]为该实例的最优解的物品总价值– 分成两类子集:• 根据定义,在不包括第i 个物品的子集中,最优子集的价值是V [i -1,j ]• 在包括第i 个物品的子集中(因此,j -w ≥0),最优子集是由该物品和前i -1个物品中能够放进承重量为i -w j 的背包的最优子集组成。
这种最忧子集的总价值等于v i +V [i -1,j -w i ].0]0,[时,0 当0;][0,时,0初始条件:当],1[}],1[],,1[max{],[=≥=≥<≥⎩⎨⎧-+---=i V i j V j w j w j j i V v w j i V j i V j i V i i i i以记忆功能为基础的算法:用自顶向下的方式对给定的问题求解,另外维护一个类似自底向上动态规划算法使用的表格。
一开始的时候,用一种“null”符号创始化表中所有的单元,用来表明它们还没有被计算过。
然后,一旦需要计算一个新的值,该方法先检查表中相应的单元:如果该单元不是“null ”,它就简单地从表中取值;否则,就使用递归调用进行计算,然后把返回的结果记录在表中。
算法 MFKnapsack(I,j)//对背包问题实现记忆功能方法//输入:一个非负整数i 指出先考虑的物品数量,一个非负整数j 指出了背包的承重量 //输出:前i 个物品的最伏可行子集的价值//注意:我们把输入数组Weights[1..n],Values[1..n]和表格V[0..n,0..W]作为全局变量,除了行0和列0用0初始化以外,V 的所有单元都用-1做初始化。
if V[I,j]<01if j<Weights[i]value ←MFKnapsack(i-1,j)elsevalue ←max(MFKnapsack(i-1),j), Value[i]+MFKnapsack(i-1,j-eights[i]))V[I,j]←valuereturn V[I,j]2.贪心算法1) 背包问题基本步骤:首先计算每种物品单位重量的价值Vi/Wi ,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
其在工业生产及日常生活中有广泛的用途, 其应用在实际生活中无处不在,货物装运, 服装裁剪,以及我们计算机科学中的存储分 配、共享资源调度、文件存储都是装箱问题 在实际应用中的体现。所以具有重要的研究 价值。
【问题】 装箱问题
问题描述:装箱问题可简述如下:设有编 号为1、…、n的n种物品,体积分别为v1、 v2、…、vn。将这n种物品装到容量都为V的若 干箱子里(更一般的装箱问题还可以要求容量 不是相同的)。约定这n种物品的体积均不超过 V,即对于1≤i ≤ n,有0<vi≤V。不同的装箱方 案所需要的箱子数目可能不同。装箱问题要求 使装尽这n种物品的箱子数要少。
按本例所给数值,取j=0时,因就是前述普通贪婪 算法,已经得到100的结果;取j=1时,共有8种方 案,当用29或23先装入时,可得到54+29+23+1=107 的更好结果;取j=2时,共有28种方案,其中有能 将背包完全装满的结果(43+23+29+14+1=110)。 故知此问题当取k≥2时就可得到最优解。
xij =1表示物品j装入箱 子i ,反之表示物品j未
放入箱子i
若考察将n种物品的集合分划成n个或小于n个 物品的所有子集,最优解就可以找到。但所有 可能划分的总数太大。对适当大的n,找出所 有可能的划分要花费的时间是无法承受的。为 此,对装箱问题采用非常简单的近似算法,即 贪婪法。该算法依次将物品放到它第一个能放 进去的箱子中,该算法虽不能保证找到最优解, 但还是能找到非常好的解。
FFD算法: { 输入箱子的容积; 输入物品种数n; 按体积从大到小顺序,输入各物品的体积; 预置已用箱子链为空; 预置已用箱子计数器box_count为0; for (i=0;i<n;i ++ ) { 从已用的第一只箱子 开始顺序寻找能放入物品i 的箱子j;
if (已用箱子都不能再放物品i) { 另用一个箱子,并将物品i放入该箱子; box_count++; }
n≤m时,我们只要将机器i的[0,ti]时间区间分配给作业i即 可。
当n>m时,我们首先将n个作业依其所需的处理时间从大 到小排序。然后依此顺序将作业分配给空闲的处理器。
例 如 , 设 7 个 独 立 作 业 {1,2,3,4,5,6,7} 由 3 台 机 器 M1,M2,和M3来加工处理。各作业所需的处理时间分别为 {2,14,4,16,6,5,3}。按贪婪算法产生的作业调度如图所示, 所需的加工时间为17。
降序首次适应算法 (FFD): 先将物体按长度从大到小排序,然后按FF算法对 物体装箱.
不失一般性,对n件物品的体积按从大到小排好序, 即有v1≥v2≥…≥vn,然后按排序结果对物品重新 编号即可。
离线算法:如果算法在开始装箱之前,已经预先 得到了所有物品的信息而一次性的确定装箱策略, 这种算法就被称为离线算法。降序首次适应算法 和降序最佳适应算法是两个重要的离线算法。 这里的降序首次适应算法就是一种贪婪算法。
如果对上述算法作一些改进,可得到更好的结果。 先从n个物体中试着取j个总体积不超过C的装入背包, 剩下的(n-j)个物体则利用贪婪算法尽量往里装。此 j值从零开始逐渐增加,反复进行试探,直至j达到 某预先给定的常数k(0<k<n),最后从这些结果中取 其最好的一个。如果在试探中能得到一个完全装满 的方案,则此过程就可提前结束。因为从n个物体中 取出j个共有 C种nj方案,此值随着j的增加而增加较 快,但可以证明此改进算法的复杂性为O(knk+1), 因k是常数,故仍为多项式界的blem)
当你装一个箱子时,你会发现要使箱子尽 可能装满不是一件很容易的事,你往往需 要做些调整。从理论上讲,装箱问题是一 个很难的组合优化问题,即使用计算机也 是不容易解决的。
装箱问题是一个经典的NP难解问题,这 意味着该问题不存在在多项式时间内求 得精确解的算法(如果P≠NP),因此对 装箱问题算法的研究指的是对其近似算 法的研究,所谓近似算法即该算法可以 求得与精确解接近的结果,但不一定得到 精确解。
装箱问题在工业生产及日常生活中有广泛的用 途,其应用在实际生活中无处不在,如货物装运, 服装裁剪,以及我们计算机科学中的存储分配、共 享资源调度、文件存储都是装箱问题在实际应用中 的体现。所以具有重要的研究价值。
例2: 多处理器调度问题
设有n个独立的作业{1,2,…,n},由m台相同的机器进行
加工处理。作业i所需的处理时间为ti。现约定,任何作业 可以在任何一台机器上加工处理,但未完工前不允许中断处
背包问题也是经典的NP-hard组合优化问题之一, 在经济管理、资源分配、投资决策、装载设计等 领域有着重要的应用价值。
设 x j为二进制变量,如果物品j被放入背包,则 x j 1,否则 x j 0 。
背包问题的数学模型描述如下:
n
max c j x j j 1
n
s.t. w j x j W x j {0,1}, j 1,2, , n j 1
适应算法的特点是当处理当前物品,如果有已经打 开的箱子中能够放下这个物品,则不打开新的箱子。
在线算法:如果一个近似装箱算法在执行过程中, 每当一个物品到达时,就立刻决定把该物品放入哪 个箱子中,而不管后序物品如何,这种算法就被称 为在线算法。下次适应算法、首次适应算法等都是 在线算法,其时间复杂度都为O(n) 。
注: 1、算法主要的运算时间是用来对n个元素进行排序, 故其复杂性是O(nlogn)。 2、对于解决0/1背包问题,总得来讲,动态规划比 贪婪算法要好些,可以得到最优解。
最后循环
FF(First Fit-首次适应 )算法:按照物体 给定的顺序装箱:把物品wi放到第一个箱子 中。 B1 B2 …Bj是当前已经使用过的箱子, 在这些箱子中找一个长度不小于wi且下标最 小的箱子,将放入wi,如果不存在这样的箱子, 则另开一个新箱子Bj+1 , 将wi放入Bj+1中 。
以上算法都称为在线适应算法,
算法流程
(1)输入物品个数n, 背包的容量limitW, 每个物品的 重量wj 和价值cj。 (2)对物品按单位价值从大到小排序。
(3)将排序后的物品依次装入背包。对于当前物品j, 若背包剩余可装重量大于或等于wj , 则 (cj /wj) 将物品j装入背包, 继续考虑下一个物品j+1, 重复步 骤3,否则得到问题的解,输出。
理。任何作业不能拆分成更小的子作业。
多机调度问题要求给出一种作业调度方案,使所给的n个
作业在尽可能短的时间内由m台机器加工处理完成。
[分析]这个问题可以看成装箱问题,也是NP完全问题。对
于这一类问题,用贪婪选择策略有时可以设计出较好的近似
算法。采用最长处理时间作业优先的贪婪选择策略可以设计
出解多处理器调度问题的较好的近似算法。按此策略,当
装箱问题的LINGO软件求解
例1 已知30个物品,其中6个长0.51m,6个长 0.27m,6个长0.26m,余下12个长0.23m, 箱子长为1m,问最少需多少个箱子才能把30 个物品全部装进箱子。
见lingo程序
装箱问题的近似求解算法
NF(Next Fit-下次适应)算法:按照物 体给定的顺序装箱:把物品wi放到它第 一个能放进去的箱子中。Bj是具有最大 下标的使用过的箱子,若wi的长度不大 于Bj的剩余长度,则把wi放入Bj,否则 把wi放入一个新的箱子Bj+1,且Bj在以 后的装箱中不再使用。
装箱问题的数学表示如下( : 0-1规划模型)
n
min z( y) yi
i 1
n
s.t.
j xij Vyi
j 1
i N {1, , n}
n
xij
1 jN
yi =1表示箱子i装入物品, 反之表示箱子i空着
i 1
yi 0或1 i N xij 0或1 j N
如直接用贪婪算法,将物体由大到小顺次 装入背包,到装不下时再逐个试装更小的一些, 直至试到最小的一个或装满为止。按此处所给 数据,先装入54和45两个,容积尚余11,最后 只能再装入体积为1的一个,总体积达到100, 并不算太满。此方法的好处是节省时间,主要 的运算时间是用来对n个元素进行排序,故其复 杂性是O(nlogn)。
else 将物品i放入箱子j;
}}
装箱问题中最早被研究的是一维装箱问题。随 着研究的深入,人们发现实际生活中更多存在 的是一些带约束的装箱问题,因此也就抽象化 出了,如二维装箱问题(条形装箱问题、剪裁 问题)、三维装箱问题、变容装箱问题、有色 装箱问题、对偶装箱问题等等一系列的带约束 的装箱问题。但是由于这些问题所与生俱来的 复杂性,虽然已经有一些研究成果发表了,但 是其研究还是相当的困难。本文所讨论的还是 一维装箱问题。
问题自身的特性决定了该问题运用贪婪算法可以
得到最优解或较优解。通常这里有三种贪婪准则:
1、价值贪婪准则:从剩余的物品中,选出可以装入 背包的价值最大的物品,利用这种规则,价值最大 的物品首先被装入(假设有足够容量),然后是下 一个价值最大的物品,如此继续下去,这种策略不 能保证得到最优解。 2、质量贪婪准则:从剩下的物品中选择可装入背包 的重量最小的物品,在一般情况下也不一定能得到 最优解。 3、价值密度贪婪准则:从剩余物品中选择可装入包 的cj /wj 值最大的物品,即按cj/wj 非递增的次序装 入物品,只要正被考虑的物品装得进就装入背包, 这种策略可能会得到最优解。
当n>m时,因此算法所需的计算时间复杂度为O(nlogn) 。
例如,一个软件开发小组要在规定时间内完成 一项任务,系统分析员把任务划分成各个子任 务.由于每个子任务要求的花费程序员的时间 不同,不合理的分派将导致各程序员贻误工期. 这就是一个多处理器调度问题的应用。
二、一维0/1背包问题
设有n=8个体积分别为54,45,43,29,23,21, 14,1的物体和一个容积为C=110的背包,问选 择哪几个物体装入背包可以使其装的最满。