文档介绍:该【锁具装箱问题 】是由【花双韵芝】上传分享,文档一共【3】页,该文档可以免费在线阅读,需要了解更多关于【锁具装箱问题 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。锁具装箱问题
[学习目标]
;
;
;
。
一、问题
某厂生产一种弹子锁具,每个锁具的钥匙有
5个槽,每个槽的高度从
{1,2,3,4,5,
6}6
个数(单位从略)中任取一数。由于工艺及其余原因,制造锁具时对
5个槽的高度有两
个要求:一是最罕有3个不相同的数;二是相邻两槽的高度之差不能够为5。知足上述两个条件
制造出来的所有互不相同的锁具称为一批。销售部门在一批锁具中任意地抽取,每60个装一箱销售。
从顾客的利益出发,自然希望在每批锁具中不能够互开(“一把钥匙开一把锁”)。可是,在目前工艺条件下,关于同一批中两个锁具可否能够互开,有以下实验结果:若二者相对应
的5个槽的高度中有4个相同,另一个槽的高度差为1,则可能互开;在其余状况下,不能能互开。
集体顾客经常购置几箱到几十箱,他们会抱怨购得的锁具中出现互开的状况。现请回答以下问题:
,能装多少箱?
,怎样定量地权衡集体顾客抱怨互开的程度(试对购置一、二箱者给出详细结果)。
二、问题分析与成立模型
由于弹子锁具的钥匙有5个槽,每个槽的高度从{1,2,3,4,5,6}这6个数中任取一
数,且5个槽的高度必定知足两个条件:最罕有3个不相同的数;相邻两槽的高度之差不能够为
5。因此我们在求一批锁具的总数时,应把问题化为三种状况,即5个槽的高度由5个不相同数字组成、由4个不相同数字组成、由3个不相同数字组成,分别算出各样状况的锁具个数,尔后
相加便获得一批锁具的总个数。在分别求这三种状况锁具个数的时候,先求出知足第1个条
件的锁具个数再减去不知足第2个条件的锁具个数。在求这三种状况锁具个数的时候,主要
依赖排列组合的不尽相异元素的全排列公式。
下面用一个5元数组来表示一个锁具:
Key=(h1,h2,h3,h4,h5)
其中hi表示第i个槽的高度,i=1,2,3,4,5。此5元数组表示一把锁,应知足下述条
件:
条件1:h∈{1,2,3,4,5,6},i=1,2,3,4,5。
i
条件
2:关于任意一种槽高排列
h1,h2,h3,h4
,h5,最罕有3种不相同的槽高。
条件
:关于任意一种槽高排列
h1,h2,h3,h4
,h5,有
|
hi
,hi-1
|
≠,i
=2
,,,。
3
5
345
而两个锁能够互开的条件为:两个锁的钥匙有四个槽高相同,其中一个槽高相差为1。
记一批锁具的会合为:
K={(h1,h2,h3,h4,h5)|hi∈{1,2,3,4,5,6},i=1,2,3,4,5,且(h1,h2,h3,h4,h5)为一锁具},其个数小于65,可采用逐个查验条件1,2,3的方法,求一批中的
所有锁具,自然也可计算出其个数。
在这里我们简单地用平均互开总对数来刻划抱怨程度,因此,重点是计算出顾客购置一
箱或两箱时的平均互开总对数,这能够用计算机模拟去计算。
我们引入下面的记号:
P={(h1
,h2,h3,h4,h5)|(h1,h2,h3,h4,h5)∈K,且
5
hi为偶数}
i1
Q={(h1
,h2,h3,h4,h5)|(h1,h2,h3,h4,h5)∈K,且
5
hi为奇数}
i1
则可获得P中的锁具不能够互开,Q中的锁具不能够互开,P中的锁具与Q中的才能互开。
在计算中,判断互开时,我们将P和Q中的锁具分别标号为0,1,这样就减少了判断时的计算,大大提高了计算速度。
说明:直接用平均互开总对数来刻划抱怨程度有必然的不合理性。由于这样来刻划,购置的箱数越多,抱怨程度就越大,而实质上,购置的越多,自然互开的可能性就越大,这是顾客料想之中的,不应有太多的抱怨,顾客所不能够容忍的是在购置少量的锁具而出现互开现象。因此应把购置箱数作为一个因素考虑到抱怨函数中。理想的抱怨函数应当是,开始随购置量的增加而增加,到必然量后下降,这才合理。在这里,我们的主要任务是模拟求解,而简单地用平均互开总对数来刻划抱怨程度。
三、计算过程
计算流程以下:
(h1,h2,h3,h4,h5)的所有排列逐个查验条件2、条件3,判断其可否为锁具,
5
5
将锁具放在数组key中,若
hi为奇数,标号为1,若
hi为偶数,标号为0,并计数count。
i1
i1
count。
,计算平均互开总对数。
。
注意:以上流程略去了某些细节,详细的细节可参看下面的程序。对上流程略加改正,
可用于研究
2,3,4
箱等的平均互开总对数。程序对(
h1,h2,h3,h4,h5)的所有排列逐个
查验条件
2、条件
3时要进行两次判断,一次是判断(
h1,h2,h3,h4,h5)可否有
3个不相同的
数,另一次是相邻槽高之差可否为5。在前一次判断时,采用了比较简捷的方法,请认真考
察。
找(h1,h2,h3,h4,h5)的所有排列,实质上可用五重循环来实现。详细程序以下:
Model[{h1,h2,h3,h4,h5,flag
mnx,kebe,k,j,n},
,cnt,key,flal
,su,te,keel,i,aid,
(*计算一批锁具的个数
*)
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=1Te=[[h3]]=1
,h5<=6,h5++,te=Table[0,{6}];te[[h1]]=1
;te[[h4]]=1;te[[h5]]=1;su=[1,{6}]
;te[[h2]]=1;
;
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[[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=,即获得一批锁具的个数为:
5880,购置一箱的平均
互开总对数大概为:。对程序略加改正可获得买两箱时的平均互开总对数大概为:,即获得以下结果:count=5880与Average=。