建立数学建模案例分析

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

§15.4锁具装箱问题

[学习目标]

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

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

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

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

一、问题

某厂生产一种弹子锁具,每个锁具的钥匙有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:对于任意一种槽高排列h1,h2,h3,h4,h5,至少有3种不同的槽高。

条件3:对于任意一种槽高排列h1,h2,h3,h4,h5,有|h i,h i-1|≠5,i = 2,3,4,5。

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

1.一批锁具个数的计算

记一批锁具的集合为:

K={(h 1,h 2,h 3,h 4,h 5)| h i ∈{1,2,3,4,5,6},i = 1,2,3,4,5,且(h 1,h 2,h 3,h 4,h 5)为一锁具},其个数小于65,可采用逐个检验条件1,2,3的方法,求一批中的所有锁具,当然也可计算出其个数。

2.抱怨程度的刻划

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

我们引入下面的记号:

P={(h 1,h 2,h 3,h 4,h 5)|(h 1,h 2,h 3,h 4,h 5)∈K ,且∑=5

1

i i h 为偶数}

Q ={(h 1,h 2,h 3,h 4,h 5)|(h 1,h 2,h 3,h 4,h 5)∈K ,且∑=51

i i h 为奇数}

则可得到P 中的锁具不能互开,Q 中的锁具不能互开,P 中的锁具与Q 中的才能互开。 在计算中,判断互开时,我们将P 和Q 中的锁具分别标号为0,1,这样就减少了判断时的计算,大大提高了计算速度。

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

三、 计算过程

计算流程如下:

1. 对(h 1,h 2,h 3,h 4,h 5)的所有排列逐个检验条件2、条件3,判断其是否为锁具,将锁具放在数组key 中,若∑=51i i h 为奇数,标号为1,若∑=5

1i i h 为偶数,标号为0,并计数count 。

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

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

4.输出一箱平均互开总对数average 。

注意:以上流程略去了某些细节,具体的细节可参看下面的程序。对上流程稍加修改,可用于研究2,3,4箱等的平均互开总对数。程序对(h 1,h 2,h 3,h 4,h 5)的所有排列逐个检验条件2、条件3时要进行两次判断,一次是判断(h 1,h 2,h 3,h 4,h 5)是否有3个不同的数,另一次是相邻槽高之差是否为5。在前一次判断时,采用了比较简捷的方法,请仔细考察。

找(h1,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。

习题15.4

1.请为销售部门提出一种方案,包括如何装箱(仍旧是60个锁具装一箱),如何给箱子以标志,出售时如何利用这些标志,使团体顾客不再抱怨或减少抱怨?

2.有4位教师给5个班级授课,按教学要求教师X i给班级Y i上课的课时数如下表所示。

相关文档
最新文档