锁具装箱问题

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

锁具装箱问题

[ 学习目标]

1. 能表述锁具装箱问题的分析过程;

2. 能表述模型的建立方法;

3. 会利用排列组合来计算古典概型;

4. 会利用Matlab 求解锁具装箱问题。

一、问题

某厂生产一种弹子锁具,每个锁具的钥匙有 5 个槽,每个槽的高度从{1 ,2,3,4,5,6}6 个数(单位从略)中任取一数。由于工艺及其它原因,制造锁具时对 5 个槽的高度有两个要求:一是至少有 3 个不同的数;二是相邻两槽的高度之差不能为5。满足上述两个条件

制造出来的所有互不相同的锁具称为一批。销售部门在一批锁具中随意地抽取,每60 个装一

箱出售。

从顾客的利益出发,自然希望在每批锁具中不能互开(“一把钥匙开一把锁”)。但是,在当前工艺条件下,对于同一批中两个锁具是否能够互开,有以下实验结果:若二者相对应的 5 个槽的高度中有 4 个相同,另一个槽的高度差为1,则可能互开;在其它情况下,不可能互开。

团体顾客往往购买几箱到几十箱,他们会抱怨购得的锁具中出现互开的情形。现请回答以下问题:

1.每批锁具有多少个,能装多少箱?

2.按照原来的装箱方案,如何定量地衡量团体顾客抱怨互开的程度(试对购买一、二箱

者给出具体结果)。

二、问题分析与建立模型

因为弹子锁具的钥匙有5个槽,每个槽的高度从{1,2,3,4,5,6}这6个数中任取一

数,且 5 个槽的高度必须满足两个条件:至少有3个不同的数;相邻两槽的高度之差不能为

5。所以我们在求一批锁具的总数时,应把问题化为三种情况,即 5 个槽的高度由5 个不同数

字组成、由 4 个不同数字组成、由 3 个不同数字组成,分别算出各种情况的锁具个数,然后相加便得到一批锁具的总个数。在分别求这三种情况锁具个数的时候,先求出满足第 1 个条件的锁具个数再减去不满足第 2 个条件的锁具个数。在求这三种情况锁具个数的时候,主要依靠排列组合的不尽相异元素的全排列公式。

下面用一个 5 元数组来表示一个锁具:

Key= (h1,h2,h3,h4,h5)

其中h i 表示第i 个槽的高度,i =1,2,3,4,5。此 5 元数组表示一把锁,应满足下述条件:

条件1: h i € {1 , 2, 3, 4, 5, 6} , i = 1 , 2, 3, 4, 5。

条件2:对于任意一种槽高排列h i, h2, h a, h4, h5,至少有3种不同的槽高。

条件3:对于任意一种槽高排列h i, h2, h a, h4, h5,有| h , h i-i|工5, i = 2 , 3, 4, 5

而两个锁可以互开的条件为:两个锁的钥匙有四个槽高相同,其中一个槽高相差为1。

1.一批锁具个数的计算记一批锁具的集合为:

K={ (h i, h2, h a, h4, h5)| h i € {1 , 2, 3, 4, 5, 6} , i = 1 , 2, 3, 4, 5,且(h i, hh,

h a, h4, h5)为一锁具},其个数小于65,可采用逐个检验条件1, 2, 3的方法,求一批中的所有锁具,当然也可计算出其个数。

2.抱怨程度的刻划在这里我们简单地用平均互开总对数来刻划抱怨程度,所以,关键是计算出顾客购买一箱或两箱时的平均互开总对数,这可以用计算机模拟去计算。

我们引入下面的记号:

5

P={ (h i, h2 , h3 , h4 , h5)| (h i , h2 , h3 , h4 , h5)€K,且h i为偶数}

i1

5

Q={(h i h2 h3 h4 h5) | (h i h2 h3 h4 h5)€ K 且h i 为奇数}

ii

则可得到P中的锁具不能互开,Q中的锁具不能互开,P中的锁具与Q中的才能互开。

在计算中,判断互开时,我们将P和Q中的锁具分别标号为0 , i ,这样就减少了判断时的计算大大提高了计算速度。

说明:直接用平均互开总对数来刻划抱怨程度有一定的不合理性。因为这样来刻划购买的箱数越多抱怨程度就越大而实际上购买的越多自然互开的可能性就越大这是顾客意料之中的不应有太多的抱怨顾客所不能容忍的是在购买少量的锁具而出现互开现象。因此应把购买箱数作为一个因素考虑到抱怨函数中。理想的抱怨函数应该是开始随购买量的增加而增加到一定量后下降这才合理。在这里我们的主要任务是模拟求解而简单地用平均互开总对数来刻划抱怨程度。

三、计算过程

计算流程如下:

1. 对(h i , h2 , h3 , h4 , h5)的所有排列逐个检验条件2、条件3,判断其是否为锁具,

55

将锁具放在数组key中,若h i为奇数,标号为i,若h i为偶数,标号为0 ,并计数count。i i i i

2. 输出一批锁具的总个数count。

3. 多次用随机数来模拟销售一箱的情况计算平均互开总对数。

4. 输出一箱平均互开总对数average 。注意:以上流程略去了某些细节具体的细节可参看

下面的程序。对上流程稍加修改

可用于研究2 , 3 , 4箱等的平均互开总对数。程序对(h i , h2 , h3 , h4 , h5)的所有排列逐个检验条件2、条件3时要进行两次判断,一次是判断(h i , h2 , h3 , h4 , h s)是否有3个不同的

数,另一次是相邻槽高之差是否为5。在前一次判断时,采用了比较简捷的方法,请仔细考

察。

找(h i, h2, h3, h4, h5)的所有排列,实际上可用五重循环来实现。具体程序如下:

Model[{h1 ,h2,h3,h4,h5,flag ,cnt,key,flal ,su,te,keel,i ,aid,

mnx , kebe, k, j , n} , (*计算一批锁具的个数*)key=Table[Table[0 , {5}] , {5880}] ;

keel=Table[0 , {5}] ;flag=Table[-1 , {5880}] ;cnt=0 ;

For[h1=1 , h1<=6, h1++,

For[h2=1 , h2<=6, h2++,

For[h3=1 , h3<=6, h3++,

For[h4=1 , h4<=6, h4++,

For[h5=1 , h5<=6, h5++, te=Table[0 , {6}] ;te[[h1]]=1 ;te[[h2]]=1 ;

Te=[[h3]]=1 ;te[[h4]]=1 ;te[[h5]]=1 ;su=te.Table[1 , {6}] ;

If[su>=3 , keel[[1]]=h1 ;keel[[2]]=h2 ;keel[[3]]=h3 ;

For[flal=1 ;i=2 , i<=5, i++ ,

If[Abs[keel[[i]]-keel[[i-1]]]>=5 , flal=0 , ]] ;

If[flal= =1 , cnt++ ;key[[cnt]]=keel ;

flag[[cnt]]=If[Mod[keel.Table[1 , {5}] , 2]= =0 , 0 , 1] ;

, ], ]] ] ] ] ] ;

Print[ “count= ” , cnt] ;(*计算顾客购买一箱时的平均互开总对数*)

cnt=0 ;aid=Table[1 , {5}] ;kebe=Table[0 , {5}] ;

For[n=1 , n<=1000, n++, (*模拟1000 次*)Mnx=Table[Rndom[Integer , {1 , 5880}] , {60}] ;

For[i=1 , i<=60 , i++ ,

For[k=i+11 , k<=60 , k++,

If[flag[[mnx[[i]]]! =flag[[mnx[[k]] ]] ,

If[Abs[key[[mnx[[i]]]].aid-key[[mnx[[k]]]].aid]= =1 ,

Keel=key[[mnx[[I]]]] ;kebe=key[[mnx[[k]]]] ;

For[flal=0 ;j=1 , j<=5 , j++ , If[keel[[j]]!=kebe[[j]] , flal++ , ]] ;

If[flal= =1 , cnt++ , ] , ] , ] ;]]] ;

Print[ “Average=” , N[cnt/1000]] ;]

运算结果:count=5880与Average=2.362,即得到一批锁具的个数为:5880,购买一箱的平均互开总对数大约为: 2.362。对程序稍加修改可得到买两箱时的平均互开总对数大约为:8.91,即得到如下结果:count=5880 与Average=8.91。

相关文档
最新文档