第06讲 装箱问题
贪心算法之装箱问题
贪⼼算法之装箱问题问题描述装箱问题可简述如下:设有编号为 0、1、…、n - 1 的 n 种物品,体积分别为v0、v1、…、vn-1。
将这 n 种物品装到容量都为 V 的若⼲箱⼦⾥。
约定这 n 种物品的体积均不超过 V,即对于 0≤ i<n,有 0<vi ≤ v。
不同的装箱⽅案所需要的箱⼦数⽬可能不同。
装箱问题要求使装尽这 n 种物品的箱⼦数要少。
贪⼼求解使⽤⼀种贪⼼策略:每次都想将当前体积最⼤的物品装⼊箱中,在这块类似于这个问题 ->>>其实在⽣活中这也是很常见的⼀种做法,在没有充⾜时间去考虑如何最优解决这类问题时直觉(第六感狗头保命)告诉我们可以这么去试试。
更直接的⼀个例⼦,⼒扣上有这么⼀道题:在柠檬⽔摊上,每⼀杯柠檬⽔的售价为 5 美元。
顾客排队购买你的产品,(按账单 bills ⽀付的顺序)⼀次购买⼀杯。
每位顾客只买⼀杯柠檬⽔,然后向你付 5 美元、10 美元或20美元。
你必须给每个顾客正确找零,也就是说净交易是每位顾客向你⽀付 5 美元。
注意,⼀开始你⼿头没有任何零钱。
注:上⾯⿊体部分内容引⾃很明显,当客户给我们$20进⾏找零时,⾃然⽽然地就给ta找了⼀张$10加上⼀张$5,为什么这么做?⾯对$20,我们有两种⽅案可以使⽤:找三张$5给顾客找⼀张$10 以及⼀张 $5 给顾客选择第⼆种⽅案的原因对于做⽣意的⽼板应该不陌⽣,营业过程中我们需要备上⼀部分零钱在交易时⽅便找零,不⾄于出现⽆法找零的尴尬局⾯,这是商⼈们所想的,在上题中也同样适⽤。
但贪⼼算法的弊端也很明显:不考虑之前解带来的影响,仅仅为了达到当前最优解,这样”⼀根筋“的策略也不能在任何情况下得到最优解。
如只有⾯值分别为 1、5 和 11 单位的硬币,⽽希望找回总额为 15 单位的硬币。
按贪婪算法,应找 1 个 11 单位⾯值的硬币和 4 个 1 单位⾯值的硬币,共找回 5 个硬币。
但最优的解应是 3 个 5 单位⾯值的硬币。
穷举法--装箱问题
装箱问题{2001p4--穷举法}问题描述有一个箱子容量为V(正整数,0<=V<=20000),同时有N个物品(0<n<=30),每个物品的体积值为正整数。
要求从n个物品中,选取若干个装入箱内,使箱子的剩余空间最小。
输入:1行整数,第一个数表示箱子的容量,第二个数表示有n个物品,后面n个数分别表示这n个物品各自的体积。
输出:1个整数,表示箱子的剩余空间。
输入输出样例:输入:24 6 8 3 12 7 9 7输出:简单穷举varv,n,I,j:integer;w: array[1 .. 30] of integer; {存储N件物品的体积}a: array[0 .. 30] of integer; {存储N件物品的选取状态,1表示选取,0表示不选取} min,:Integer; {统计最小剩余量}s:integer; {累加器,统计物品体积和}beginread(v);min:=v; {初始时设定空间最小剩余量为箱子总容量}read(n);for i:=1 to n do read(w[i]);for i:=0 to n do a[i]:=0;while a[0]=0 do { a[0]作为循环控制开关}beginj:=n;while a[j]=1 do j:=j-1; {逢一进位}a[j]:=1; {设定新的状态}for i:=j+1 to n do a[i]:=0;s:=0;for i:=1 to n do s:=s+a[i]*w[i]; {计算物品的体积和}if (v-s>=0) and (v-s<min) then min:=v-s; { min存储目前的最小剩余量}end;writeln(min);end.穷举改进varv,n:integer;w: array[1 .. 30] of integer;a: array[0 .. 30] of integer;i,j,min,s,temp:Integer;beginread(v);min:=v;read(n);for i:=1 to n do read(w[i]);for i:=1 to n-1 do {排序}for j:=i+1 to n doif w[i]>w[j] thenbegintemp:=w[i]; w[i]:=w[j]; w[j]:=temp;end;for i:=0 to n do a[i]:=0;while a[0]=0 dobeginj:=n;while a[j]=1 do j:=j-1;a[j]:=1;for i:=j+1 to n do a[i]:=0;s:=0;for i:=1 to n do s:=s+a[i]*w[i];if v<s then for i:=j+1 to n do a[i]:=1 {体积总和超过容量,不再继续穷举} else if v-s<min then min:=v-s; {更正min }end;writeln(min);end.。
装箱问题和排序问题(课堂PPT)
数的上界是 M : 1 。因此,所有不同 是 R C M M K .这是一个固定的常数。 的装箱数目地上界为 P C R n R .这是关于 n 多项式时间通过枚举找 出最优解。
限制装箱问题
.
12
引理 2。给定 0.考虑每个物件大小至少 是的限制装箱问题,则存 在该限制装箱 问题的(1 )- 近似算法。
通俗地说,把 a 1 , a 2 ,..., a n ( 0分,1 ] 成最少的组数, 使得每组数的和不超过1。
在工业中有许多应用,譬如在下料问题中,箱子 代表标准木料的长度,而 a i 表示实际问题中需要 裁截成的木料长度。当然,需要的标准料越少越 好。
Bin Packing
.
3
First FitAlgorithm: 1.将物件按任意顺序, 排譬 列如
装箱问题和排序问题
.
1
装箱问题(Bin Packing)
最小完工时间安排(排序问题)(Minimum Makespan Scheduling)
本讲主要内容
.
2
装箱问题:给定n个物件,大小为 a 1 , a 2 ,..., a n ( 0 ,1 ] 用单位体积的箱子来装这些物件,找一个装箱方 案使得所用的箱子数目最少?
a1, a2,...,an 2.在算法第 i步,假定 a1, a2,...,ai1已经装箱
B1, B2,...,Bk.现考虑ai ,若其不能装入任Bj一 (1 j k) 则打开一个新的箱 Bk子 1,将ai装入其中。 3.直到所有物件装完。
一个2倍近似算法
.
4
假定算法中用了 m个箱子,则至少有 m 1个箱子
(Asym PopltyT ontiA o im cm pep iiaro lS onx ch im em a
装箱设计问题
承诺书我们仔细阅读了中国大学生数学建模竞赛的竞赛规则.我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。
我们知道,抄袭别人的成果是违反竞赛规则的, 如果引用别人的成果或其他公开的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。
我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正、公平性。
如有违反竞赛规则的行为,我们将受到严肃处理。
我们参赛选择的题号是(从A/B/C/D中选择一项填写): A我们的参赛报名号为(如果赛区设置报名号的话):所属学校(请填写完整的全名):参赛队员(打印并签名) :1.2.3.指导教师或指导教师组负责人(打印并签名):日期: 2011 年 07 月 16 日赛区评阅编号(由赛区组委会评阅前进行编号):编号专用页赛区评阅编号(由赛区组委会评阅前进行编号):全国统一编号(由赛区组委会送交全国前编号):全国评阅编号(由全国组委会评阅前进行编号):摘要题目要求及有关数据我们可以把平板车装包装箱问题看成线性规划的问题进行处理,首先我们把求浪费空间最小转化为求装包装箱空间最大的问题,同时我们取每种包装箱的数量为变量,然后我们根据每一种包装箱的厚度列出每一辆车的装货时占用的空间,我们先把两辆车看成一个整体,求出两辆车占用的空间之和,然后再把这个整体分成两部分,也就是求每一辆车上所装包装箱的种类和数量。
这样我们就可以以占用两辆车的空间之和作为目标函数MAX S。
根据题意装在每一辆车上的包装箱总厚度不能超过平板车的长度;装在每一辆车上的总重量不能超过每一辆平板车的最大载重量;还有对第5、6、7类包装箱占用的空间不能超过题目中的要求;同时,装在两辆车上的同类包装箱的总件数不能超过题目给的件数,并且变量要取正整数。
在这些约束条件之下对目标函数进行求解,我们使用LINGO软件进行编程求解,最后得到装包装箱的总的最大空间为2039.9cm,即浪费的最小空间为0.1cm。
锁具装箱问题
问题重述
我们首先来回顾问题的背景,如下: 某厂生产一种弹子锁具,每个锁具的钥匙有 5 个槽,每个槽的高度从 1,2, 3,4,5,6 的 6 个数中任意的取一数,但对于每个钥匙的 5 个槽高的取值需要 满足以下两个条件 1、至少有 3 个不同的数 2、相邻的两槽的高度差不能为 5 满足以上两个条件的所有不同的锁具称为一批,而对于两把锁具是否可以互 开有以下规律:如果两者对应的槽高度中有 4 个相同,另一个槽高度相差为 1,则 可能互开;否则一定不能互开。 原来销售部门随意的取 60 个装一箱出售。团体顾客往往购买几箱到几十箱, 他们抱怨购得锁具会出现互开的情况。 需要解决的问题如下: 1、每批锁具的总数,装箱总数。 2、为销售部门提供一种方案,包括如何装箱。 3、采取你提出的方案,团体顾客的购买量不超过多少箱,就能保证不会产生
我们通过列举或者在模型计算中的枚举法中得880/60=98(箱),如果我们保证一箱中所有锁具的 槽高度之和都是奇数或者偶数并在箱上进行标记,如都是奇数的标 O,都是 偶数的表 E。那么任意买一箱都不能出现互开的情况,我们的问题便能很好 的解决。同时可以最大程度的减少顾客的抱怨程度。
胡兆阳 3014203234 孔玮琦 3014203237
CONTENT
问题重述................................................................................................................ 2 问题分析................................................................................................................ 2 基本假设................................................................................................................ 4 模型设计................................................................................................................ 4
三年级乘除混合应用题装箱问题
三年级乘除混合应用题装箱问题摘要:1.问题背景和意义2.乘除混合应用题的基本类型3.装箱问题的解决方法4.实际应用与练习5.总结与建议正文:随着年龄的增长,孩子们的数学能力也在不断提高。
乘除混合应用题是三年级数学学习中的一项重要内容,不仅能够检验学生对乘法和除法运算的掌握程度,还能培养他们的逻辑思维能力。
本文将以乘除混合应用题的装箱问题为例,详细介绍这类问题的解决方法,以帮助孩子们更好地应对这类题目。
一、问题背景和意义在现实生活中,装箱问题是一种非常常见的情况。
例如,在物流运输、商品销售等领域,我们需要将不同尺寸的物品装入容器中,以求最大限度地利用空间。
乘除混合应用题的装箱问题就是在此基础上提出的,它要求学生在解答过程中运用乘法和除法运算。
二、乘除混合应用题的基本类型乘除混合应用题的装箱问题主要包括以下几种类型:1.给定容器体积和物品体积,求最多可以装多少个物品。
2.给定物品体积和容器数量,求每个容器最多可以装多少个物品。
3.给定容器体积和物品数量,求最少需要多少个容器。
4.给定物品体积、容器数量和每个容器的装载量,求最多可以装多少个物品。
三、装箱问题的解决方法1.理解题意,确定解题目标。
首先要明确题目要求求解的是最多可以装多少个物品、每个容器最多可以装多少个物品、最少需要多少个容器等问题。
2.分析数据关系。
根据题目给出的数据,找出物品体积、容器体积和装载量之间的关系。
3.运用乘除法运算。
根据分析得出的关系,将数据代入相应的公式进行计算。
4.结合实际情境,进行合理推断。
在计算过程中,要结合实际情境进行合理推断,例如:当物品体积大于容器体积时,无法装入;当物品体积小于容器体积时,可以装入一个容器;当物品体积等于容器体积时,最多可以装入一个容器。
四、实际应用与练习为了更好地掌握乘除混合应用题的装箱问题,我们可以通过以下实际应用和练习进行巩固:1.妈妈买了5斤苹果,每斤10元,一共需要支付多少钱?2.一个集装箱长10米,宽6米,高4米,另一个集装箱长8米,宽4米,高2米。
装箱问题的近似解PPT课件
编辑课件
Байду номын сангаас
1
First fit strategy:places an object in the first bin in which it fits.
FFD strategy is a modification that sorts the objects first so that they are considered in order of non-increasing size.
所以存在k0, k是第一个满足只含有1个object, 而余下的opt(s)-k个箱子中包含2个object的箱子下标。
编辑课件
8
利用“最优”情况导出矛盾
在最优解的情况下,所有object都会放置在 opt(s) 个箱子中。
不失一般性,我们假定前k个箱子不含有
object k+1 , …,i-1.
编辑课件
12
定理13.11
RFFD(m)4/3+1/ ( 3m) 无限的情况下:
SFFD(m)3/2 R和S的意义参见P572页
编辑课件
13
证明
设输入序列为(s1,s2, ,sn),opt(S)=m, 则FFD放在附加箱子的object个数至多为 opt(s)-1,它们至多占用(opt(s)-1)/3个 箱子。
if (used[j]+si 1.0)
bin[i]=j;
used[j]+= si;
break; 编辑课件
4
四、FFD算法的复杂性
O(n logn)+O(n(n-1)/2) O(n 2)
编辑课件
5
装箱问题算法实现讲解
装箱问题算法实现讲解有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0≤n≤30),每个物品有一个体积(正整数)。
要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
[样例]输入:24 一个整数,表示箱子容量6 一个整数,表示有n个物品8 接下来n行,分别表示这n个物品的各自体积。
312797输出:0 一个整数,表示箱子剩余空间算法分析:本题是经典问题:0-1背包的特殊例子(加强了已知条件)。
用整形数组volume存储各件物品的体积,用布尔型函数h(i,k)表示前i个物品通过组合能否恰好装满容量k的空间,则考虑第i件物品,如果没有被选中,则问题转化为h(i-1,k);如果第i件物品被选中了,则问题转化为h(i-1,k-volume[i]),因此有如下的表达式:h(i,k)=h(i-1,k-volume[i]) || h(i-1,k);k从V开始递减,判断h(n,k)是否为真,第一个符号要求的k即为剩余空间最小时消耗的体积。
如果此时直接编写程序,就要定义一个二维数组,空间复杂度时n*v,注意到了n,v的取值范围很大,所以用二维数组存储就会有问题。
我们注意到,h(i,k)的取值仅与h(i-1,0)~h(i-1,k)有关,且如果h(i-1,k)=true,必然有h(i,k)=true,h(i,k)的值存在继承性,而程序结束时,我们也只关心h(n,k),因此,我们可以用一维数组h(k)来存储中间信息。
为了避免重复计算,可以让k从大到小变化,为了避免出现负数,k的变化范围为v~volume[i].示例程序:#include<iostream>#include<cstring>using namespace std;int v,n;int volume[31];//存储n件物品的体积int h[20001];//h[i]=1,表示n件物品通过某种组合,所构成的体积和正和等于i;//h[i]=0,表示n件物品无论如何组合,体积和都无法等于iint main(){freopen(\"in.txt\",\"r\",stdin);freopen(\"out.txt\",\"w\",stdout);int v,n,i,j,k;while(cin>>v>>n){for(i=1;i<=n;i++)cin>>volume[i];memset(h,0,sizeof(h));h[0]=1;for(i=1;i<=n;i++)for(k=v;k>=volume[i];k--)h[k]=h[k]||h[k-volume[i]];[Page]j=v;while(j>0&&h[j]==0)j--;cout<<v-j<<endl;}return 0;。
第06讲 装箱问题
渐进性能比
RA inf{r 1| 存在N Z , 对于所有满足OPT ( I ) N的实例,RA ( A) r}
1 RA RA
NF算法的绝对性能比
定理:RNF 2
FF算法
2
解的一个下界。
NF算法
把物品按照给定的顺序装箱:把 w1 放入第一个箱子; 设 wi 是当前要装入的物品, B j 是具有最大下标的使 用过的箱子,若 wi 的长度不大于 B j 的剩余长度,则 把 wi 装入 B j ,否则把 wi 放入一个新的箱子 Bj 1 , 且 B j在以后不再使用。 通俗的说:将物品按顺序装箱,当第一个箱子不能再装 的情况下,将箱子打包运走,下面使用第二个箱子…… 下次适应(Next Fit)算法j 1
j ij
Cyi
i 1, 2...., n j 1, 2...., n
x
i 1
n
ij
1,
yi 0 或者1 i 1, 2...., n xij 0 或者1 i, j 1, 2...., n
背包问题的松弛问题
min
n
z yi
i 1
n
s.t
练习
箱子长为1,设有30个物品,物品长度为
1 i 6 1/ 4 1/ 4 6 i 12 wi 12 i 18 1/ 4 2 1/ 2 18 i 30
分别用NF算法,FF算法,FFD算法,CF算法给出近似 解,并与最优解进行比较。
绝对性能比
对于一个极小(大)化问题π,I为任意实例。设A是π的 近似算法,用A解I得到的解值为A(I),而I得最优解为 OPT( I ),记
装箱问题
cun[j]=cun[j]+a[i];
b[i]=j;
flag[i]=1;
break;
}
}
if(flag[i]==0)
{
cun[k]=a[i];
b[i]=k;
k++;
}
}
printf("已用箱子个数:%d\n",k);
for(j=0;j<k;j++)
{
printf("第%d个箱子所存体积分别为:",j+1);
实验目的:
(1)熟悉掌握贪心算法思想;
(2)熟悉掌握排序算法;
实验要求:
(1)认真阅读实验指导书,设计相应的算法;
(2)根据设计的算法写出程序;
(3)设计好相应的测试用例;
实验内容:
实验分析
贪婪法是一种不追求最优解,只希望得到较为满意解的方法。贪婪法一般可以快速得到满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪婪法常以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪婪法不要回溯。
scanf("%d",&a[i]);
tong(a,n);
}
实验结果与记录:
收获与体会:
本次实验中,在实验指导书及教师的指导下,比较成功的完成了实验,不过还是遇到了一些问题。如在对贪婪算法的应用和对箱子个数的计数方面仍然不够灵活。不过,在老师的帮助下,这一问题还是得到了很好的解决,比较完满的完成了任务。
虽然感觉到代码不怎么长,但是还是感觉能力不足,尤其对算法思想的理解不够透彻,还是觉得自己的实际能力有所欠缺。希望以后在老师和同学的帮助下,有意识的提高动手能力。最后衷心感谢老师的热心帮助!
人教版初一数学上册《苹果装箱问题》
☆ 10个箱子分别装1,2,4,8,16, 32,64,128,256,489个苹果
☆(1) 10个箱子分别装1,2,4,8,16, 32,64,128,255,490个苹果
……
15个苹果:
1, 2, 3 1, 2, 4 1, 2, 4,1
1,2,4,8
结论1:用“加倍法”装箱可以不拆箱 随时拿出任何数目的苹果来,且所用的 箱子最少。
现有31个苹果,分别装到若干个箱子里, 要求不拆箱随时拿出任何数目的苹果来,至 少要几个箱子?怎样分装?
31个苹果: 1,2,4,8,16 32个苹果: 1,2,4,8,16,1
现有1000个苹果,分装到10个 箱子里,要求不拆箱随时拿出任何 数目的苹果来,怎样装箱?
现有3个苹果,分别装到若干个箱子 里,要求不拆箱随时拿出任何数目的苹 果来,至少要几个箱子?怎样分装?
3个苹果: 1,2 4个苹果: 1, 2, 1 5个苹果: 1, 2, 2
6个苹果:
7个苹果: 8个苹果:
950个苹果: 1,2,4,8,16,32 64,128,256,439
600个苹果: 1,2,4,8,16,32, 64,128,256,89
满足上述条件,10个箱子所装苹果总数m的范围
512 ≤m<1024
即29 ≤m<210
若有m(2n-1≤m <2n)个苹果,分别装到若干个箱 子里,要求不拆箱随时拿出任何数目的苹果来,则至 少需要多少个箱子?怎样分装?
现有1000个苹果,分装到10个箱子 里,要求不拆箱随时拿出任何数目的苹 果来,怎样装箱?
装箱问题与背包问题
例:“超市大赢家”提供了50种商品作为奖品供中奖顾客选择,车的容量为1000dm3 , 奖品i占用的空间为widm3 ,价值为vi 元, 具体的数据如下: vi = { 220, 208, 198, 192, 180, 180, 165, 162, 160, 158,155, 130, 125, 122, 120, 118, 115, 110, 105, 101, 100, 100, 98,96, 95, 90, 88, 82, 80, 77, 75, 73, 72, 70, 69, 66, 65, 63, 60, 58,56, 50, 30, 20, 15, 10, 8, 5, 3, 1} wi = {80, 82, 85, 70, 72, 70, 66, 50, 55, 25, 50, 55, 40, 48,50, 32, 22, 60, 30, 32, 40, 38, 35, 32, 25, 28, 30, 22, 50, 30, 45,30, 60, 50, 20, 65, 20, 25, 30, 10, 20, 25, 15, 10, 10, 10, 4, 4, 2,1}。
见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在以后的装箱中不再使用。
算法流程
(1)输入物品个数n, 背包的容量limitW, 每个物品的重量wj 和价值cj。 (2)对物品按单位价值从大到小排序。
背包与装箱问题
背包与装箱问题
一. 背包问题
某人旅游,要带n 件物品,重量分别为i a (i=1….n )但受到航空
行李重量及体力的限制,能带行李总重量为b ,n 件物品的重量和超过了b ,该怎样抉择。
假设有8件物品,重量分别为:1,3,4,3,3,1,5,10(kg ) 价值分别为:2,9,3,8,10,6,4,10(元)
重量总限制:15kg
如何选择物品使总价值最大。
模型为:
8
i=18i=1max z=x (x 0-1s.t x 15 (i=1,2...8)
i i i i i i c c a ≤∑∑为变量;为物品价值)
二. 装箱问题
设有许多长为C 的一维箱子,及长为 () 1,2i i W W C i n <= 的n 件物品,要把这些物品全部装如箱子中,怎样装法使得所用箱子竟可能的少?
已知30个物品,其中6个长0.51m ,6个长0.27m ,6个长0.26m 余下12个长0.23m ,箱子长度1m 。
问最少需要多少箱子可以把30件物品全部装下。
先准备30个箱子,每个箱子就装一件物品,用0-1变量j y 表示第
j 个箱子是否使用,用0-1变量ij x 表示第i 件物品是否放入第j 个箱子。
建模如下:
30j j=130
i=1
30
1min z=y .
, 130; ,
130;i ij
j ij j s t w x Cy j x i =≤
==∑∑∑。
装箱问题
C
个箱子中第一个物品,因此这两个箱子中物品的总长度
大于 C ,所以前 2k 个箱子中物品的总长度大于 Ck . n z (I ) wi Ck 矛盾 . NF 这与 2, 从而 RNF 2. i 1 zopt ( I ) 1 1 1 1 1 1 w1 , w2 ,, w4 N ห้องสมุดไป่ตู้ , , , ,, , 考虑实例 I : C = 1, 2 2N 2 2N 2 2N
min
n
z yi
i 1
n
( BP)
s.t.
w x
x
i 1
j 1 n
j ij
Cyi
i 1 n
(1)
(2)
ij
1
j 1 n
yi 0 or 1, xij 0 or 1
i, j 1 n.
上述装箱问题是这类问题最早被研究的,也是提
法上最简单的问题,称为一维装箱问题 . 但 BP NP C. 装箱问题的其他一些提法: 1、在装箱时,不仅考虑长度,同时考虑重量或面积、
但用户所需玻璃的长宽可能有许多差异,如何根据用 务分配到各工作站上 . 称为带附加优先约束的 BP . 户提出的要求,用最少的平板玻璃截出所需的定货;
3、计算机的存贮问题 如要把大小不同的共 10 MB 的 BP 是容量限制的工厂选址问题的特例之一. 文件拷贝到磁盘中去,而每张磁盘的容量为 1. 44 MB ,
§3
装箱问题的近似算法 I : C如何修正 NF 算 = 10
物品
二、FF ( First Fit ) 算法
参见 EX .1 用 NF 算法装
法 J1
6
J2
J3
J4
装箱问题
某厂生产一种弹子锁具,每个锁具的钥匙有5个槽,每个槽的高度从{1,2,3,4,5,6}6个数(单位略)中任取一个,由于工艺及其他原因,制造锁具时对5个槽的高度有两个限定:至少有3个不同的数;相邻两槽的高度之差不能为5。
满足以上条件制造出来的所有互不相同的锁具称为一批。
从顾客的利益出发,自然希望在每批锁具中“一把钥匙开一把锁”。
但是在当前工艺条件下,对于同一批中两个锁是否能够互开,有一下实验结果:若二者相对应的5个槽的高度中有4个相同,另一个槽的高度差为1,则可能互开;在其他情形下,不可能互开。
原来,销售部门在一批锁具中随意地取60个装成一箱出售。
团体顾客往往购买几箱到几十箱,他们抱怨购买的锁具会出现互开的情形。
现聘你为顾问,回答并解决以下问题:①每一批锁具有多少个?装多少箱?②为销售部门提出一种方案,包括如何装箱(仍是60个锁具一箱),如何给箱子以标志,出售时如何利用这些标志,使团体顾客不再或减少抱怨。
③采取你提出的方案,团体顾客的购买量不超过多少箱,就可以保证一定不会出现互开的情形。
④按照原来的装箱方法,如何定量地衡量团体顾客抱怨互开的程度(试对购买一、二箱着给出具体结果)。
解:一、每批锁的把数第一问完全是一个数学问题,首先可以求出有5个槽、每个槽有6个高度的所有可能的个数为n1=65=7776,为了满足题目中提出的至少有三个不同的高度,且相邻高度差不应为5的要求,我们应该减去不满足要求的锁具。
在具体求每批锁的个数以及可以装多少箱时,既可以用排列组合法也可以编程用计算机求解。
这里我们用Matlab编程求解。
我们对5个钥匙槽的高度进行五重循环,并将判断条件设置为5个槽的高度中至少有3个不同的数且相邻两槽的高度之差不能为5,进行判断。
将满足判断条件的累加起来,最后输出即可得到一批锁具总数的大小。
可以装的箱数用锁具总数除于60即可得到。
程序如下:count=0;for h1=1:6a(1)= h1;for h2=1:6a(2)= h2;for h3=1:6a(3)= h3;for h4=1:6a(4)= h4;for h5=1:6a(5)= h5;s=0;flag=1;b=sort(a); c=diff(a);d=diff(b);for i=1:4if d(i)~=0s=s+1;endif abs(c(i))==5flag=0;endendif s>=2&flagcount=count+1;endendendendendendcountnbox=count/60程序运行结果为:count =5880nbox =98计算结果说明,每一批锁具有5880个,可以装98箱。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CF算法:
step3:设在第i 步循环时,打开第i 个箱子,此时把物件 ai
3 。 2
FFD算法的渐进性能比
11 定理:对于任意实例I,FFD( I ) OPT ( I ) 1 ,且存在 9
OPT (I) ,任意大的实例I,使得 FFD ( I )
RFFD
11 OPT ( I ) ,因而 9
11 9
。
CF算法:
step1:把物件 L {a1 , a2 ,...., an } 按其大小进行非增序排列,
练习
箱子长为1,设有30个物品,物品长度为
1 i 6 1/ 4 1/ 4 6 i 12 wi 12 i 18 1/ 4 2 1/ 2 18 i 30
分别用NF算法,FF算法,FFD算法,CF算法给出近似 解,并与最优解进行比较。
min
n
z yi
i 1
n
s.t
w x
j 1
j ij
Cyi
i 1, 2...., n j 1, 2...., n i 1, 2...., n i, j 1, 2...., n
x
i 1
n
ij
1,
0 yi 1 0 xij 1
背包问题的下界
松弛问题的一个最优解
WF算法
WorstFit策略与BestFit策略刚好相反, BestFit策略是在 候选箱中选取最满的箱子, 装入后, 箱子的已装容量看起来 比较悬殊, 而WorstFit策略是在候选箱中选取最空闲的箱 子———这也是“最差”的含义而非指性能最差, 这样箱 子的 已装容量看起来比较平均。
其它装箱问题
有色装箱问题 二维装箱问题 三维装箱问题
作业
P : 2, 4 115
任意大的实例I
,使得 FF ( I )
17 (OPT ( I ) 1) 10
17 . 10
FFD算法
将物品按照长度从大到小排列,然后按FF算法对物品进行 装箱。
First Fit Decreasing ,其算法时间复杂性为 O(n log n) 。
FFD算法的绝对性能比
R 定理: FFD
按照物品的给定顺序装箱,并且把每一个物品放入第一 个适合它的箱子中;把 w1 放入第一个箱子当中,设 wi 是当前要装入的物品,B1, B2 ,...., B j 是当前已经使用过的 箱子,在这些箱子中找一个剩余长度不小于 wi 且下标 最小的箱子,将 wi 放入该箱子,如果不存在这样的箱 子,则另开一个新箱子 Bj 1 ,并将 wi 放入中 Bj 1 。
是背包问
题最优解的一个下界。
背包问题的下界
推论:记 L2 max{L(a) | 0 a C , a为整数} ,则是装箱问题最优
2
解的一个下界。
NF算法
把物品按照给定的顺序装箱:把 w1 放入第一个箱子; 设 wi 是当前要装入的物品, B j 是具有最大下标的使 用过的箱子,若 wi 的长度不大于 B j 的剩余长度,则 把 wi 装入 B j ,否则把 wi 放入一个新的箱子 Bj 1 , 且 B j在以后不再使用。 通俗的说:将物品按顺序装箱,当第一个箱子不能再装 的情况下,将箱子打包运走,下面使用第二个箱子…… 下次适应(Next Fit)算法,其时间复杂性为 O(n) .
首次适应(First Fit)算法,其时间复杂性为O(n log n)
。
FF算法绝对性能比的上界
FF ( I ) 7 定理: 。 OPT ( I ) 4
FF算法的渐进性能比
FF 定理:对于任意实例I, ( I ) 17 OPT ( I ) 1 ,而且存在OPT(I) 10
,因而有 RFF
时,把 ak 1 , ak 2 ,..., al 放入中 Bi ,开启新的箱子 Bi 1
.
CF算法:
step4:直到把所有物件都放入箱子中,循环终止,并输 出箱子数目m.
CF算法的绝对性能比为3/2,时间复杂度为 O(n log n) ,该算 法又称为交叉适应算法。
在线装箱问题:在物品未到达前不必预知其 长度。 离线装箱问题:事先知道物品的所有信息。
装箱问题数学描述
min
n
z yi
i 1
n
s.t
w x
j 1
j ij
Cyi
i 1, 2...., n j 1, 2...., n
x
i 1
n
ij
1,
yi 0 或者1 i 1, 2...., n xij 0 或者1 i, j 1, 2...., n
背包问题的松弛问题
当i j时,xij 1; 当i j时,xij 0; wi yi C
。
z i 1 最优解值 C
w
n
i
背包问题的下界
定理:装箱问题的最优解的一个下界为
n wi L1 i 1 C
背包问题的下界
定理:设a是任意满足 问题的一个任意实例,记
RA inf{r 1, 对于所有实例I,RA I) r} (
渐进性能比
RA inf{r 1| 存在N Z , 对于所有满足OPT ( I ) N的实例,RA ( A) r}
1 RA RA
NF算法的绝对性能比
定理:RNF 2
FF算法
0a C 2
的一个整数,对于装箱
J1 {物品j | w j C a} J 2 {物品j | C a w j a} J 3 {物品j | CJ 2 | C wi ) jJ iJ 2 L(a ) | J1 | | J 2 | max 0, 3 C
放入 Bi 中. 假设第i-1 个箱子 Bi 1 中最后一个放入的物件 为 ak ,则在i 步循环时最右端的物件为ak 1 ,那么当
s(ai ) s(ak 1 ) ... s(al ) C 且 s(ai ) s(ak 1 ) ... s(al ) s(al 1 ) C
BF算法
依次处理物品, 如果当前物品不能装入到当前所有打开的 箱子中, 仍然保持箱子开放, 同时, 打开一个新的箱子并将 该物品装入。如果当前有几个打开的箱子均可装入该物品, 则选择一个剩余空间最小(最接近装满) 的箱子装入。之所 以保持箱子开放, 是希望后边更小的物品能够装入已打开 的箱子中, 充分利用箱子的剩余空间。
装箱问题
Bin Packing
装箱问题描述
w i 设有许多长为C的一维箱子及长分别为, i , 1,..., n
的n件物品,且 0 wi C ,欲把这些物品全部装入箱 中,为了给出它的整数线性规划描述,我们引入一些变量: 如果第i个箱子被使用,则 yi 1 ,否则 yi 0 ,第j个物品 放入第j个箱子中 xij 1 ,否则 xij 0
绝对性能比
对于一个极小(大)化问题π,I为任意实例。设A是π的 近似算法,用A解I得到的解值为A(I),而I得最优解为 OPT( I ),记
A( I ) OPT ( I ) RA ( I ) , ( RA ( I ) ) OPT ( I ) A( I )
则近似算法A的绝对性能比 RA 定义为