第八章 装箱问题 (第10讲)
锁具装箱问题的数学模型
锁具装箱问题的数学模型詹国武 1 黄景文 1 周辉莉 2(1.05级化工系; 2.05级经济系)摘要:本文针对锁具如何装箱问题,建立了一个新模型,并对其进行了分析和评价。
就如何装箱问题,本文建立了一个如何对每一批锁具进行装箱和标记才能是消费者的满意度最高的模型,再具体分析实际销售情况,建立了在消费量不同情况下,如何组合已装箱好的锁具才能使满意度最大的模型以及,再对此模型进一步探讨和分析,得到一个当销售箱数超过49箱仅仅用同奇或者同偶类的锁具来组合的模型,并且对其进行了论证,最终得到最优的结果利用软件通过筛法,分别求得一批锁具钥匙的槽高由3个,4个,5个不同数组成的个数为2544,2808,528,一批锁具的个数和箱数5880和98。
再根据能够互开的锁具的条件,且根据槽高为连续的整数特性,得到结论:当一个钥匙的槽高之和为奇(偶)时,他的互开钥匙的槽高和必为偶(奇),即槽高和同为奇(偶)的必不能互开,得到把奇偶分开装箱和标记的一个初步方案,为了定量的分析不同的方案,利用概率论的方法,引入了平均互开对的概念。
对于随后的销售方案,我们利用图论知识,从最小匹配数入手,通过对平均互开对数的大小比较来衡量各个方案和组合的最优情况,得到如下结论,当销售不超过49箱时,只销售槽高和为奇(偶)的,当超过49箱时则按下问所论述的搭配方案,再进一步打破陈规,当按下文的装箱和标记,仅仅销售奇(偶),能够使抱怨的程度更小。
关键词:筛法奇偶分箱同奇或同偶销售平均对开数顾客抱怨度最小匹配一.问题的重述某厂生产一种弹子锁具,每个锁具的钥匙有5个槽,每个槽的高度从{1,2,3,4,5,6}6个数中任意的取一数,但对于每个钥匙的5个槽高的取值需要满足以下两个条件1.至少有3个不同的数2.相邻的两槽的高度差不能为5满足以上两个条件的所有不同的锁具称为一批,销售部门随意的取60个装一箱出售同一批锁可以互开的条件:1.二者相对应的5个槽的高度中有4个相同2.另一个槽的高度相差为1由于销售部门随意的取60个装一箱,所以同一消费者可能买到互开的锁具,导致了消费者的不满。
货物分配问题
货物装配的目的是在车辆载重量为额定值的情况下, 合理进行货物的安排,使车辆装载货物的价值最大 (如:重量最大、运费最低等)。
1
1. 运用动态规划解装货问题
设货车的载重量上限为G,用于运送n种不同的货物,货物 的重量分别为W1,W2,...,Wn,每一种货物对应于一个 价值系数,分别用P1,P2,...,Pn表示,它表示价值、运 费或重量等。设Xk表示第k种货物的装入数量,货物装配 问题的数学模型可以表示为:
前面的最优方案是在第四阶段取X4=1时得出的方案。
如果在第 4 阶段计算表中取 X4 = 0 ,则其余种类的货物装载量 W W4X4=8; 在第3阶段计算表中,查W=8一栏,f3(w)=8对应X3=2,再仿照前面的 方法,可以得到第3组最优解: 第三组:X1=0,X2=0,X3=2,X4=0; 装载量为:X3 * 2 = 2*4 = 8 以上三组装载方案,都最大限度地发挥了车辆的载重能力,都是最优 方案。 最终的最优装载方案为: 第一组:X1=1,X2=0,X3=0,X4=1; 第二组:X1=0,X2=1,X3=0,X4=1; 第三组:X1=0,X2=0,X3=2,X4=0;
货物装配例题
例题 9 载重量为 8t 的载重汽车,运输 4 种机电产品,产品重量分别 为3 吨、3 吨、4 吨、5 吨,试问如何配装才能充分利用货车的运载 能力?
解: 第一步,按照前面的公式,分成四个阶段计算每一阶段的价值。 计算结果以表格表示如下:
载重量 件数 价值(重量)
载重量
第2种货 物的件数
maxG Grs X rs
r 1 s 1
m
Nr
s.t. r 1,2,...,m X rs 1 s 1 m Nr Grs X rs G0 r 1 s 1
贪心算法之装箱问题
贪⼼算法之装箱问题问题描述装箱问题可简述如下:设有编号为 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。
装箱问题——精选推荐
装箱问题问题描述 有⼀个箱⼦容量为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):先对物品按降序排序,再按照最佳适应算法进⾏装箱。
锁具装箱问题
问题重述
我们首先来回顾问题的背景,如下: 某厂生产一种弹子锁具,每个锁具的钥匙有 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
装箱问题算法实现讲解
装箱问题算法实现讲解有一个箱子容量为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;。
物流装箱问题数学建模
物流装箱问题数学建模
物流装箱问题是指将一批物品放置到有限的几个箱子中,使得每个箱子的利用率最高且所使用的箱子数量最少。
这是一个经典的数学优化问题,可以通过以下步骤进行建模:
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);
}
实验结果与记录:
收获与体会:
本次实验中,在实验指导书及教师的指导下,比较成功的完成了实验,不过还是遇到了一些问题。如在对贪婪算法的应用和对箱子个数的计数方面仍然不够灵活。不过,在老师的帮助下,这一问题还是得到了很好的解决,比较完满的完成了任务。
虽然感觉到代码不怎么长,但是还是感觉能力不足,尤其对算法思想的理解不够透彻,还是觉得自己的实际能力有所欠缺。希望以后在老师和同学的帮助下,有意识的提高动手能力。最后衷心感谢老师的热心帮助!
装箱问题与背包问题
例:“超市大赢家”提供了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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Go back
问 L(a) L1 ? 未必! 如 (wj a, j 1 n)
Corollary 3.1 Proof :
记 L2 max L(a) 0 a C 2 , a 为整数
则 L2 是装箱问题的最优解的一个下界,且 L2 L1 . L2 为最优解的下界是显然的 . (若证明 L(0) L1 ,则可得 L2 L1 )
wi . 定界法;二是启发式(近似)算法 是它的一个最优解 . i 1
min z yi
i 1 n opt
分支
z
C
(1)
(2)
((BP C BP))
s.t.
w x
x
i 1
n
j 1 n
j ij
Cyi
i 1 n
ij
1
j 1 n
1, xij 1 1 i, ji, j1 yi 0 0 yior 1, 0 xij 0 or 1n . n.
而且存在 zopt ( I ) 任意大的实例 I ,使
17 z FF ( I ) ( zopt ( I ) 1) 10
因而
R
FF
17 . 10
第八章 装箱问题
物品
Example 2 Solution :
I : C = 10
J1
J2
J3
J4
J5
J6
wj
6
7
4
2
8
3
首先,将 J1 放入 B1; 由于 J2 在 B1 中放不下, 所 以将 J2 放入 B2 ,
C
个箱子中第一个物品,因此这两个箱子中物品的总长度
大于 C ,所以前 2k 个箱子中物品的总长度大于 Ck . n zNF ( I ) w Ck 这与 i 矛盾 . 2, 从而 RNF 2. i 1 zopt ( I ) 1 1 1 1 1 1 w , w , , w , , , , , , 4N 考虑实例 I : C = 1, 1 2 2 2 N 2 2 N 2 2 N
§1
装箱问题的描述
Go back
BP 的应用举例:
1.44 7 10.08 10
1、下料问题 轧钢厂生产的线材一般为同一长度, 而用
户所需的线材则可能具有各种不同的尺寸, 如何根据用
户提出的要求,用最少的线材截出所需的定货; 4、生产流水线的平衡问题 给定流水节拍 C , 如何设置 2 、 二维 BP 玻璃厂生产出长宽一定的大的平板玻璃, 最少的工作站,(按一定的紧前约束)沿着流水线将任
箱子 B1,B2,…的长均为 C ,按物品给定的顺序装箱 .
先将 J1 放入 B1,若 w1 w2 C , 则 J2 放入 B1 , 否
则,J2 放入 B2 ; 若 J2 已放入 B2,对于 J3 则依次检查
B1、B2 , 若 B1 能放得下, 则 J3 放入 B1 , 否则查看 B2 , 若 B2 能放得下,则 J3 放入 B2 , 否则启用 B3, J3 放入 B3.
但用户所需玻璃的长宽可能有许多差异,如何根据用 务分配到各工作站上 . 称为带附加优先约束的 BP . 户提出的要求,用最少的平板玻璃截出所需的定货;
3、计算机的存贮问题 BP 是容量限制的工厂选址问题的特例之一 如要把大小不同的共 10.MB 的 文件拷贝到磁盘中去,而每张磁盘的容量为 1. 44 MB ,
最优目标可如何提?
体积 etc . 即二维、三维、…装箱问题;
2、对每个箱子的负荷限制不是常数 C ; 而是 Ci , i 1 n. 3、物品J1,J2,…,Jn 的负荷事先并不知道,来货是 随到随装;即 在线(On-Line)装箱问题; 4、由于场地的限制,在同一时间只能允许一定数量的
箱子停留现场可供使用, etc .
j
则 B1 已放入 J1,J2,…,Jj,将其关闭,将 Jj+1 放入 B2 .
同法进行,直到所有物品装完为止 . 计算复杂性为 O(n).
特点: 1、按物品给定的顺序装箱; 2、关闭原则 .
§3
装箱问题的近似算法 I : C = 10
物品 J1
6
Example 1 Solution :
J2
7
J3
解为:
B1
B2
B4
x11 x22 x33 x34 x45 x56 1 其余为零,zNF ( I ) 5.
第八章 装箱问题
Theorem 3.3
RNF 2
n i
先证 RNF 2 再说明不可改进
Proof : 设 I 为任一实例,zopt ( I ) k. (要证 zNF ( I ) 2k )
是最优解的一个下界 .
第八章 装箱问题
Proof : 仅考虑对 I1,I2,I3中物品的装箱 . I1 I 2 中物品的长度大于C/2 ,
C C-a Note: w 可能小于零 C/2 a
( w j ( I 2 C w j )) 每个物品需单独放入一个箱子, jI jI
当 a = 0 时,I1 , I 2 I3 是所有物品 .
L2 L(0) L1
第八章 装箱问题
§3 装箱问题的近似算法
一、NF ( Next Fit ) 算法 设物品 J1,J2,…,JJ w1,w2,…,wn 对当前要装的物品 只关心具有最大下标的已使 n i的长度分别为 箱子 B1,B2, 的长均为 C ,按物品给定的顺序装箱 . 用过的箱子 B… 能否装得下? 先将 J1 放入 B1, 如果 w1 w2 C 则将 J2 放入 B1 … 能. 则 Ji 放入 Bj ;否 . 关闭 Bj ,Ji 放入新箱子 Bj+1 . 如果 w1 w2 wj C 而 w1 w2 wj wj 1 C
最优化方法
Optimizing Methods
第八章 装箱问题
第八章
装箱问题
§1 装箱问题的描述 §2 装箱问题的最优解值下界 §3 装箱问题的近似算法
第八章 装箱问题
装箱问题(Bin Packing)是一个经典的组合优化
问题,有着广泛的应用,在日常生活中也屡见不鲜 .
§1 装箱问题的描述
设有许多具有同样结构和负荷的箱子 B1,B2,…
有最小标号的箱子 .
计算复杂性为 O(nlogn).
但精度比NF
算法更高
§3
装箱问题的近似算法
Theorem 3.4 Theorem 3.5 对任意实例 I ,
zFF ( I ) 7 . zopt ( I ) 4
7 17 1 4 10 20
17 z FF ( I ) zopt ( I ) 1 10
物品共用箱子,由于放 I2 中物品的 I 2 个箱子的剩余 总长度为
C I2 C wj
jI 2
在最好的情形下,C 被 I3 中的物品全部充满,故剩 下总长度 w
wj C
jI 3
与 中的物品如何? I 2 w 将另外至少 个附加的箱子 C
.
§2
装箱问题的最优解值下界
I3 物品 j C w j a , 2
I 2 物品 j C a w j C
, 2
则
( w j ( I 2 C w j )) jI 2 L(a) I1 I 2 max 0, jI3 C
3 L(a ) I1 I 2 max 0, . 这就需要 I1 I2 个箱子 2
又 I 3 中每个物品长度至少为 a , 是最优解的一个下界 . 它不能与 I1 中的物品共用箱子, 但可能与 I2 中的
C I1 I2 I3
n ( w j I 2 C ) L(0) 0 I 2 max 0, j 1 C ( w j ( I 2 C w j )) j I 3 max jI 2 L I2 , L LI 1 1 I 2 (2 a ) max I1 I 20, L max 0, 1 C
4
J4
2
J5
8
J6
3
wj
首先,将 J1 放入 B1; 由于 J2 在 B1 中放不下, 所
J1 J2 J3 J4 J5 J6
以关闭 B1 , 将 J2 放入 B2 ,
J3 在 B2 中放不下(不考虑
B1 是否能装), 所以关闭 B2
将 J3 放入 B3,…
J1 J2
J4 J3 B3 J5 J6 B5
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、在装箱时,不仅考虑长度,同时考虑重量或面积、
§2
n w i i 1 Theorem 3.1 BP 最优值的一个下界为 L1 C . a 表示不小于 a 的最小整数 .
装箱问题的最优解值下界
Theorem 3.2 设 a 是任意满足 0 a C 2 的整数,对 BP 的任一实例 I , 记 I1 物品 j w j C a ,