第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)

装箱问题和排序问题(课堂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

装箱问题——精选推荐

装箱问题——精选推荐

装箱问题问题描述 有⼀个箱⼦容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有⼀个体积(正整数)。

要求n个物品中,任取若⼲个装⼊箱内,使箱⼦的剩余空间为最⼩。

输⼊格式 第⼀⾏为⼀个整数,表⽰箱⼦容量; 第⼆⾏为⼀个整数,表⽰有n个物品; 接下来n⾏,每⾏⼀个整数表⽰这n个物品的各⾃体积。

输出格式 ⼀个整数,表⽰箱⼦剩余空间。

样例输⼊2468312797样例输出这题读完之后多思考思考,其实就能发现就是0-1背包问题每个物品的体积就是花费同时也是价值,也就是说这题可以转化为在总体积为v下,可以得到最⼤的价值最后⽤总体积减去最⼤的价值就是剩下最少的空间状态转移⽅程dp[j] = max(dp[j], dp[j - a[i]] + a[i]);java:import java.util.Scanner;public class Box {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int v = sc.nextInt();//箱⼦的最⼤体积int n = sc.nextInt();//物品的最⼤数量int a[] = new int[n];//存放物品的体积int dp[] = new int[v+1];//存放体积为i时的最⼤容量for (int i = 0; i < a.length; i++) {a[i] = sc.nextInt();}for (int i = 0; i < n; i++) {for (int j = v; j >= a[i]; j--) {dp[j] = Math.max(dp[j], dp[j-a[i]]+a[i]);}}System.out.println(v-dp[v]);//箱⼦容量减去⽤掉的体积}}c:#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int n;int d[20005];int a[35];int main(){int w;scanf("%d%d", &w, &n);int i, j;for (i = 0; i < n; i++){scanf("%d", &a[i]);}memset(d, 0, sizeof(d));for (i = 0; i < n; i++){for (j = w; j >= a[i]; j--)d[j] = max(d[j], d[j - a[i]] + a[i]); }printf("%d\n", w - d[w]);return 0;}。

装箱问题——精选推荐

装箱问题——精选推荐

装箱问题
装箱问题是NP问题,即在多项式时间内⽆法精确求解,⼀般采⽤近似,即启发式算法,这样可以迅速得到满意解,⽽不⼀定是最优解。

常见的算法:NF(Next Fit)近似算法,FF(First Fit)近似算法,FFD(First Fit Decreasing)近似算法,BF(best Fit),BFD(Best Fit Deceasing)等。

下次适应算法(NF):NF算法是最简单也是最早研究的⼀个算法,它的处理⽅法是始终维持⼀个当前打开的箱⼦,对于每⼀个要装⼊的物品,检查该物品是否可以放⼊当前打开的箱⼦,如果⽆法装⼊,则打开⼀个空箱⼦,装⼊该物品,以该箱⼦作为当前的箱⼦,由于每个物品在装⼊时,只有当前打开的箱⼦和空箱可以选择,这必然造成装箱的效率低下。

⾸次适应算法(FF):针对下次适应算法的缺陷,⾸次适应算法处理当前物品的时候,检查所有⾮空箱⼦,找到第⼀个能够放下当前物品的箱⼦并将该物品放⼊,否则则开启新的箱⼦。

最佳适应算法(BF):与⾸次适应算法类似,唯⼀的区别时当物品装箱时,不是直接装在第⼀个可装⼊的箱⼦中,⽽是装⼊在最适合该物体的箱⼦中,如果没有该箱⼦,则开启空箱。

⾸次适应算法和最佳适应算法有⼀个缺陷,即由于物品没有实现排序,则可能由于先装⼊⼩的物品,使⼤的物品在后来放⼊时⽆法装⼊,只得开启新的箱⼦,造成了空间的浪费,因此才有了这两种算法的改进算法。

降序⾸次适应算法(FFD):先对物品按降序排序,再按照⾸次适应算法进⾏装箱。

降序最佳适应算法(BFD):先对物品按降序排序,再按照最佳适应算法进⾏装箱。

锁具装箱问题

锁具装箱问题
1/9
问题重述
我们首先来回顾问题的背景,如下: 某厂生产一种弹子锁具,每个锁具的钥匙有 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米。

装箱问题算法实现讲解

装箱问题算法实现讲解

装箱问题算法实现讲解有一个箱子容量为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讲 装箱问题

第06讲 装箱问题
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算法
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 ),记

物流装箱问题数学建模

物流装箱问题数学建模

物流装箱问题数学建模
物流装箱问题是指将一批物品放置到有限的几个箱子中,使得每个箱子的利用率最高且所使用的箱子数量最少。

这是一个经典的数学优化问题,可以通过以下步骤进行建模:
1. 定义变量:假设有 n 个物品需要装箱,第 i 个物品的体积为 vi,第 j 个箱子的容积为 cj,定义决策变量 xi,j 表示将第 i 个物品放入第 j 个箱子中(取值为0或1)。

2. 约束条件:每个物品只能被放入一个箱子中,即∑j xi,j = 1,同时每个箱子的容积不能超过其限制,即∑i vi xi,j ≤ cj。

3. 目标函数:目标是最小化使用的箱子数量,因此可以定义目标函数为∑j ∑i xi,j。

4. 模型求解:该问题可以转化为混合整数线性规划问题,可以使用商业软件(如Gurobi、CPLEX等)求解,也可以使用启发式算法(如遗传算法、模拟退火等)进行求解。

需要注意的是,该问题存在多项式时间内可解的算法,但是在实际应用中,由于数据规模较大,通常需要使用近似算法或者启发式算法进行求解。

装箱问题

装箱问题
{
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);
}
实验结果与记录:
收获与体会:
本次实验中,在实验指导书及教师的指导下,比较成功的完成了实验,不过还是遇到了一些问题。如在对贪婪算法的应用和对箱子个数的计数方面仍然不够灵活。不过,在老师的帮助下,这一问题还是得到了很好的解决,比较完满的完成了任务。
虽然感觉到代码不怎么长,但是还是感觉能力不足,尤其对算法思想的理解不够透彻,还是觉得自己的实际能力有所欠缺。希望以后在老师和同学的帮助下,有意识的提高动手能力。最后衷心感谢老师的热心帮助!

人教版初一数学上册《苹果装箱问题》

人教版初一数学上册《苹果装箱问题》
结论3:现有m个苹果,当2n-1≤m <2n时,至少需 要n个箱子?装箱的方法是:n个箱子分别装1,2, 4,……2n-2,(m+1- 2n-1)个苹果。
☆ 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)对物品按单位价值从大到小排序。

装箱问题

装箱问题

某厂生产一种弹子锁具,每个锁具的钥匙有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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
首次适应(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
Hale Waihona Puke .CF算法:step4:直到把所有物件都放入箱子中,循环终止,并输 出箱子数目m.
CF算法的绝对性能比为3/2,时间复杂度为 O(n log n) ,该算 法又称为交叉适应算法。
在线装箱问题:在物品未到达前不必预知其 长度。 离线装箱问题:事先知道物品的所有信息。
0a C 2
的一个整数,对于装箱
J1 {物品j | w j C a} J 2 {物品j | C a w j a} J 3 {物品j | C w j a} 2

w j (| J 2 | C wi ) jJ iJ 2 L(a) | J1 | | J 2 | max 0, 3 C
装箱问题数学描述
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为任意实例。设A是π的 近似算法,用A解I得到的解值为A(I),而I得最优解为 OPT( I ),记
A( I ) OPT ( I ) RA ( I ) , ( RA ( I ) ) OPT ( I ) A( I )
则近似算法A的绝对性能比 RA 定义为
任意大的实例I
17 ,使得 FF ( I ) 10 (OPT ( I ) 1)
17 . 10
FFD算法
将物品按照长度从大到小排列,然后按FF算法对物品进行 装箱。
First Fit Decreasing ,其算法时间复杂性为 O(n log n) 。
FFD算法的绝对性能比
R 定理: FFD
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
背包问题的下界
松弛问题的一个最优解
RA inf{r 1, 对于所有实例I,R(I) r} A
渐进性能比
RA inf{r 1| 存在N Z , 对于所有满足OPT ( I ) N的实例,RA ( A) r}
1 RA RA
NF算法的绝对性能比
定理:RNF
2
FF算法
按照物品的给定顺序装箱,并且把每一个物品放入第一 个适合它的箱子中;把 w1 放入第一个箱子当中,设 wi 是当前要装入的物品,B1 , B2 ,...., B j 是当前已经使用过的 箱子,在这些箱子中找一个剩余长度不小于 wi 且下标 最小的箱子,将 wi 放入该箱子,如果不存在这样的箱 子,则另开一个新箱子 B j 1 ,并将 wi 放入中 B j 1 。
放入 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
不妨设 s(a1 ) s(a2 ) ..... s(an ) . step2:首先把 a1 放入箱子中 B1 ,然后从最右端开始,依 次把物件an , an1.... 放入 B1 ,直到下一个物件不能再放入 箱子为止,开启新的箱子 B2 .
CF算法:
step3:设在第i 步循环时,打开第i 个箱子,此时把物件 ai
装箱问题
Bin Packing
装箱问题描述
w i 设有许多长为C的一维箱子及长分别为, i , 1,..., n
的n件物品,且 0 wi C ,欲把这些物品全部装入箱 中,为了给出它的整数线性规划描述,我们引入一些变量: 如果第i个箱子被使用,则 yi 1 ,否则 yi 0 ,第j个物品 放入第j个箱子中 xij 1 ,否则 xij 0
3 。 2
FFD算法的渐进性能比
定理:对于任意实例I,FFD( I )
11 OPT ( I ) 1 ,且存在 9
11 OPT ( I ) ,因而 9
OPT (I) ,任意大的实例I,使得 FFD( I )
RFFD
11 9

CF算法:
step1:把物件 L {a1 , a2 ,...., an } 按其大小进行非增序排列,
BF算法
依次处理物品, 如果当前物品不能装入到当前所有打开的 箱子中, 仍然保持箱子开放, 同时, 打开一个新的箱子并将 该物品装入。如果当前有几个打开的箱子均可装入该物品, 则选择一个剩余空间最小(最接近装满) 的箱子装入。之所 以保持箱子开放, 是希望后边更小的物品能够装入已打开 的箱子中, 充分利用箱子的剩余空间。
WF算法
WorstFit策略与BestFit策略刚好相反, BestFit策略是在 候选箱中选取最满的箱子, 装入后, 箱子的已装容量看起来 比较悬殊, 而WorstFit策略是在候选箱中选取最空闲的箱 子———这也是“最差”的含义而非指性能最差, 这样箱 子的 已装容量看起来比较平均。
其它装箱问题
是背包问
题最优解的一个下界。
背包问题的下界
推论:记 L2 max{L(a) | 0 a C , a为整数} ,则是装箱问题最优
2
解的一个下界。
NF算法
把物品按照给定的顺序装箱:把 w1 放入第一个箱子; 设 wi 是当前要装入的物品, B j 是具有最大下标的使 用过的箱子,若 wi 的长度不大于 B j 的剩余长度,则 把 wi 装入 B j ,否则把 wi 放入一个新的箱子 B j 1 , 且 B j在以后不再使用。 通俗的说:将物品按顺序装箱,当第一个箱子不能再装 的情况下,将箱子打包运走,下面使用第二个箱子…… 下次适应(Next Fit)算法,其时间复杂性为 O(n) .
当i j时,xij 1; 当i j时,xij 0; yi wi C

最优解值 z
w
i 1
n
i
C
背包问题的下界
定理:装箱问题的最优解的一个下界为
n wi L1 i 1 C
背包问题的下界
定理:设a是任意满足 问题的一个任意实例,记
练习
箱子长为1,设有30个物品,物品长度为
1/ 4 1/ 4 wi 1/ 4 2 1/ 2
1 i 6 6 i 12 12 i 18 18 i 30
分别用NF算法,FF算法,FFD算法,CF算法给出近似 解,并与最优解进行比较。
有色装箱问题 二维装箱问题 三维装箱问题
作业
P : 2, 4 115
相关文档
最新文档