摘要(第06组)
本文针对锁具如何装箱问题,建立了模型,并对其进行了分析和评价。首先根据排列组合知识,用Matlab编程列举出所有符合条件的锁具,得到一批锁具的个数为5880,可装58箱。就如何装箱及销售问题,本文根据如何对每一批锁具进行装箱和标记才能是消费者的满意度最高的模型,再具体分析实际销售情况,建立了按槽高进行序贯销售的模型。即先把槽高和为偶数的锁具按字典序列排序装箱,之后装槽高和为奇数的锁具,并对每一个锁具进行编号,计算锁具“安全”距离的极小值为2562,即42.7箱,得到序贯销售时团体顾客最大购买量为42箱时不会出现互开现象。顾客抱怨互开程度可用所购的一箱或二箱锁具中平均有多少对可能互开来衡量。本文运用计算机模拟,得到平均一箱中可以互开的个数为2.33,平均两箱中可以互开的个数为9.41。 关键词:排列组合,数学模型,互开,奇偶,概率 一、 问题重述 某厂生产一种弹子锁具,该锁具的锁匙共有5个槽,每个槽可取6种不同的高度,分别以1-6的整数表示。在生产中要求每把锁匙的5个槽至少具有3种不同的高度且相邻两槽的高差不能是5。满足上述条件的互不相同的锁具称为一批。由于工艺条件的限制,当两把锁匙对应的5个槽的高度有4个相同,另一个槽的高差为1时,两锁具可能互开,否则不能互开。 在锁具出厂时,工厂对锁具按批进行随意装箱,每60付装1箱。当遇到购买量较大时团体顾客时(买几箱到几十箱),由于装箱的随意性,容易引起他们对锁具互开现象的抱怨,现要求解决以下几个问题: (1)每批锁具有多少个,可装多少箱; (2)为售销部门提供一种方案,包括如何装箱,如何给箱子以标记,出售时如何利用这些标记,从而使团体顾客不再或减少抱怨; (3)当团体顾客的购买量不超过多少箱时,可以保证一定不会出现互开的情形;(4)按原来的随意装箱方法,如何定量地衡量团体顾客抱怨互开的程度,并对购买一、二箱者给出具体结果。 二、问题假设 (1)随机装箱对锁具来说是等可能概率。 (2)两把锁具的5槽中,如果有4个槽高度对应相同,另一个槽的高度差为1时,两锁必能互开(按最坏情况考虑)。 (3)任两把锁都不是同时生产,且该锁具的锁锚配制为所有配制中的任意一个。 (4)假定顾客的不满意程度主要针对锁具的互开情况,而不考虑人为的其它因素。 三、符号说明 符号 h(i) f(i) n m K K1 含义 表示第i个卡槽的高度 表示卡槽和为i的锁的集合 为锁具的数量 为锁具能装的箱子数量 表示两个锁具之间的安全距离 表示购买箱数再整个抱怨程度中所占的比率 K2 Ki g(i,j) 表示检验结果在整个抱怨程度中所占的比率 表示卡槽和为i的所有锁具个数 表示与第i把锁互开的锁具的总和 四、问题分析 首先把锁具及装箱问题抽象成数学概念,用1-6这6个数字代表锁槽的高度,用5个数字的组合代表一个相应的锁具。 对于第一问求每批锁的个数和装箱数,可以根据排列组合的数学知识,采用枚举法,列举出所有符合条件的锁具,用计算机编程实现。 对于第二、三问,因为互开的两个锁具有四个槽高度相同,仅有一个槽高度差1那么互开的两个锁各槽高度之和必为相邻的两个自然数,而两个相同的自然数中必有一个为奇数,一个为偶数。因此在生产过程中,可把各槽高度之和为奇数、偶数的锁具分开为两类,做上标记,按槽高和及字典序从小到大装箱,先把各槽高度和为偶数的按字典序列排序装箱,之后装各槽高为奇数,并对每一个锁具进行编号。然后计算每一个锁具的“安全”距离,即第一个和它互开的锁具排在队伍的哪里。每一把锁具在序列中的位置唯一确定。计算任一把锁具的“安全”距离,再对所有“安全”距离求极小值,得到的极小值除以60即为销售时团体顾客不会出现互开时的最大购买量。 对于第四问,原装箱办法可理解为从一批5880个锁具中随机地取60个装一箱,120个装2箱,抱怨互开程度可用所购的一箱或二箱锁具中平均有多少对可能互开来衡量。这一指标可以用计算机模拟得到。 五、建模与求解 5.1每批锁具有多少个,可装多少箱 因为弹子锁具的钥匙有5个槽,每个槽的高度从{1,2,3,4,5,6}这6个数中任取一数,且5个槽的高度必须满足两个条件:至少有3个不同的数;相邻两槽的高度之差不能为5。所以我们在求一批锁具的总数时,应把问题化为三种情况,即5个槽的高度由5个不同数字组成、由4个不同数字组成、由3个不同数字组成。通过编程采取bool判断的方法判断当只有一个数字和只有两个数字组成的数字组合有哪些,并令其为false,取true为计数的条件,false不计数,定义一个变量初始值为0,即true则在此变量值上加一,反之不加,最后得出的变量值为符合条件的锁具总量n,将所得的锁具的总量n除以60即为装箱数。 下面用一个5元数组来表示一个锁具: Key=(h1,h2,h3,h4,h5) 其中hi表示第i个槽的高度,i=1,2,3,4,5。此5元数组表示一把锁,应满足下述条件: 条件1: hi∈{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,且有| hi,hi-1|≠5,i = 2,3,4,5。 而两个锁可以互开的条件为:两个锁的钥匙有四个槽高相同,其中一个槽高相差为1。 计算流程如下: 1.对(h1,h2,h3,h4,h5)的所有排列逐个检验判断是否只有一个数字和只有两个数字组成的数字组合,是true在则n上加1, 2.输出一批锁具的总个数n。 注意:以上流程略去了某些细节,具体的细节可参看下面的程序。
根据条件要求和计算机的运算n值为5880,按每箱60个锁具的装箱要求,可以装98箱。
5.2 销售方案—序贯销售
为了避免或减少顾客买到互开的锁具,必须对装箱及出售方案进行规划,其实质就是找到尽可能多的符合要求的组合,使它们之间互不关联或关联最少。
这里我们采取序贯销售的方式对锁具进行奇偶两类,按照槽高的和及字典序从小到大装箱。
如: H=8 :(11123) (11132) (11213) (11231) (11321)…… H=9 :(11124) (11142) (11214) (11223) …… ……………
上述工作完成后,每把锁具在序列中的位置唯一确定。计算任一锁具的“安全”距离,再对所有“安全”距离求极小值。这里的“安全”距离即为两把能互开的锁具中间所隔得锁具数量。通过计算机编程计算(编程代码见附件),求出每一把锁的安全距离,且得到的最小的安全距离的计算结果为:2562。
将2562把锁具按60把每箱进行装箱,即:2562/60=42.7
故序贯销售时团体顾客最大购买量为42箱时不会出现互开现象。最后对98箱进行按序号标记1—98销售。 5.3 抱怨程度度量
我们对顾客的抱怨程度进行描述:顾客的抱怨程度一方面取决于购买的总数量。另一方面取决于检验的结果,并且从心理学的角度考虑,顾客更偏重于检验结果 。因此我们找到一个检验方法,对顾客的抱怨程度进行定量的描述。
检验方法:从购买的T箱中取出t箱,再从这t箱中每箱各取m把,对取出的tm把锁具做完全互开实验。 定义抱怨函数为:
C(T,δn)=δn=
式中:
K1:表示购买箱数再整个抱怨程度中所占的比率; K2:表示检验结果在整个抱怨程度中所占的比率; δn:顾客检验到n此互开的比率。
通过上述公式计算的δn所得值越大,抱怨程度越大
六、模型的检验或合理性分析
利用上述公式我们对购买一箱,m=10的情形进行具体分析
δn=
,则:
)
为了确定参数K1、K2,我们认为:如果T1=2T2, 2C(T1,
)=C(T2,所以:K1=1
当互开率达到=时,抱怨达到极值,设为100,所以: K2=
0
于是:
C(T2,δn)=
购买一、二箱的平均互开率为(每箱抽样10把)
α1==00.4 α2==00.1
故购买一、二箱的平均抱怨程度分别为:
通过上述结果可以看出:购买的箱数越大抱怨程度越小。
七、评价和改进方向
1.我们从商场销售的角度出发,的出了一个序贯销售的策略,该策略对于这个有较优的适用性,具有一定的实际意义和参考性。?
2.在我们的模型假设中我们认为顾客的抱怨度和抽取的检验样本的互开对百分比相等,但是当模型的基数极大的时候,无疑这个假设是有一定误差的。这个是值得进一步改进并加以推广的。?
3.模型在不忽略整体的情况下,从个体出发进行分析,避免了陷入整体情况的讨论。同时又能反映整体情况。
参考文献
[1] 谢中华.MATLAB从零到进阶[M].北京航空航天大学出版社,2012.
[2] 薛定宇,陈阳泉.高等应用数学问题的MATLAB求解[M].清华大学出版社,
2008.
[3] 余兴,韩仁忠,张宇宁.锁具装箱的组合算法[J].兰州交通大学学报,
1995(2):9-13.
[4] 卫三民,王冬,徐卫军.锁具装箱问题[J].哈尔滨工程大学学报,
1996(3):101-104.
[5] 杨国武.锁具装箱问题中的计数算法[J].武汉理工大学学报(交通科学与工程
版), 1999(1):67-68.
附录
附一
n=0; j=0;
k8=0; k9=0; k10=0; k11=0; k12=0; k13=0; k14=0; k15=0; k16=0; k17=0; k18=0; k19=0; k20=0; k21=0; k22=0; k23=0; k24=0; k25=0; k26=0; k27=0; %h(1)代表第一个卡槽,h(2)代表第二个 %n为锁的总量,m为可装多少箱 for h1=1:6 for h2=1:6 for h3=1:6 for h4=1:6 for h5=1:6 a(1)=h1;
a(2)=h2; a(3)=h3; a(4)=h4; a(5)=h5; s=0; flag=1; b=sort(a); c=diff(a); d=diff(b); for i=1:4
if d(i)~=0 s=s+1; end
if abs(c(i))==5 flag=0; end end
if s>=2&&flag n=n+1;
if a(1)+a(2)+a(3)+a(4)+a(5)==8 k8=k8+1;
f8(k8,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==9 k9=k9+1;
f9(k9,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==10 k10=k10+1;
f10(k10,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==11 k11=k11+1;
f11(k11,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==12 k12=k12+1;
f12(k12,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==13 k13=k13+1;
f13(k13,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==14
k14=k14+1;
f14(k14,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==15 k15=k15+1;
f15(k15,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==16 k16=k16+1;
f16(k16,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==17 k17=k17+1;
f17(k17,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==18 k18=k18+1;
f18(k18,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==19 k19=k19+1;
f19(k19,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==20 k20=k20+1;
f20(k20,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==21 k21=k21+1;
f21(k21,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==22 k22=k22+1;
f22(k22,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==23 k23=k23+1;
f23(k23,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==24 k24=k24+1;
f24(k24,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==25
k25=k25+1;
f25(k25,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==26 k26=k26+1;
f26(k26,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end
if a(1)+a(2)+a(3)+a(4)+a(5)==27 k27=k27+1;
f27(k27,1)=a(1)*10000+a(2)*1000+a(3)*100+a(4)*10+a(5); end end end end end end end m=n/60; 附二
[row,~]=size(f); g=zeros(row,1); k=0;
for i=1:1:row
for j=1:1;row;
a=fix(f(i,1)/10000);
b=fix((f(i,1)-a*10000)/1000);
c=fix((f(i,1)-a*10000-b*1000)/100);
d=fix((f(i,1)-a*10000-b*1000-c*100)/10); e=f(i,1)-a*10000-b*1000-c*100-d*10; a1=fix(f(j,1)/10000);
b1=fix((f(j,1)-a*10000)/1000);
c1=fix((f(j,1)-a*10000-b*1000)/100);
d1=fix((f(j,1)-a*10000-b*1000-c*100)/10); e1=f(j,1)-a*10000-b*1000-c*100-d*10; flag=1;
if(a==a1)&&(b==b1)&&(c==c1)&&(d==d1)&&(abs(e-e1)==1) flag=0; continue end
if(a==a1)&&(b==b1)&&(c==c1)&&(e==e1)&&(abs(d-d1)==1) flag=0; continue end
if(a==a1)&&(b==b1)&&(d==d1)&&(e==e1)&&(abs(c-c1)==1)
flag=0; continue end
if(a==a1)&&(c==c1)&&(d==d1)&&(e==e1)&&(abs(b-b1)==1) flag=0; continue end
if(c==c1)&&(b==b1)&&(d==d1)&&(e==e1)&&(abs(a-a1)==1) flag=0; continue end if flag
k=k+1; end
g(i,1)=f(k,1); end end
因篇幅问题不能全部显示,请点此查看更多更全内容