数学建模之超市收费系统问题.docx
《数学建模之超市收费系统问题.docx》由会员分享,可在线阅读,更多相关《数学建模之超市收费系统问题.docx(12页珍藏版)》请在冰豆网上搜索。
数学建模之超市收费系统问题
兰州交通大学
2012年大学生数学建摸大作业
题目:
超市收费系统
队员1:
姓名孙珊
学院机电工程学院
班级车辆093
队员2:
姓名巨子琪
学院机电工程学院
班级车辆093
队员3:
姓名董雄武
学院机电工程学院
班级车辆093
论文编号:
承诺书
我们仔细阅读了2012年兰州交通大学数学建模的竞赛规则。
我们完全明白,在竞赛开始后队员不得以任何方式(包括电话、电子邮件、网上咨询等)与本队以外的任何人(包括指导老师)研究,讨论与本赛有关的话题。
我们知道,抄袭别人的成果是违反竞赛规则的,如果引用别人的成果或其他公开的资料(包括网上查到的资料),必须按照规定的参考文献的表达方式在正文引用处和参考文献中明确列出。
我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正,公平。
如有违反竞赛规则的行为,我们愿意承担由此引起的一切后果。
我们的组号:
01
队员:
队员1:
孙珊
队员2:
巨子琪
队员3:
董雄武
超市收费系统
一、课程设计的目的与意义
1.练习模拟模型的建立过程;
2.进一步熟悉模拟算法的设计、编程问题。
二、要求
1.熟练应用Matlab的随机变量的模拟函数;
2.加强离散系统模拟算法的分析和设计训练;
3.提高Matlab的编程应用技能。
三、题目
一小超级市场有4个付款柜,每个柜台为一位顾客计算货款数的时间与顾客所购商品件数成正比(大约每件费时1s),20%的顾客用支票或信用卡支付,这需要1.5min,付款则仅需0.5min。
有人倡议设一个快速服务台专为购买8个或8个以下商品的顾客服务,指定另外两个为“现金支付柜”。
请你建立一个模拟模型,用于比较现有系统和倡议的系统的运转。
假设顾客到达平均间隔时间是0.5min,顾客购买商品件数按如下频率表分布。
件数
9~19
20~29
30~39
40~49
相对频率
0.12
0.10
0.18
0.28
0.20
0.12
【设计任务】
根据题目要求建立模型并求解。
附录
计算机模拟方法介绍
1.步骤
(1)分析问题,收集资料。
需要搞清楚问题要达到的目标,根据问题的性质收集有关随机性因素的资料。
这里用得较多的知识为概率统计方面。
在这个阶段,还应当估计一下待建立的模拟系统的规模和条件,说明哪些是可以控制的变量,哪些是不可控制的变量。
(2)建立模拟模型,编制模拟程序。
按照一般的建模方法,对问题进行适当的假设。
也就是说,模拟模型未必要将被模拟系统的每个细节全部考虑。
模拟模型的优劣将通过与实际系统有关资料的比较来评价。
如果一个“粗糙”的模拟模型已经比较符合实际系统的情况,也就没有必要建立费时、复杂的模型。
当然,如果开始建立的模型比较简单,与实际系统相差较大,那么可以在建立了简单模型后,逐步加入一些原先没有考虑的因素,直到模型达到预定的要求为止。
编写模拟程序之前,要现画出程序框图或写出算法步骤。
然后选择合适的计算机语言,编写模拟程序。
(3)运行模拟程序,计算结果。
为了减小模拟结果的随机性偏差,一般要多次运行模拟程序,还有就是增加模拟模型的时段次数。
(4)分析模拟结果,并检验。
模拟结果一般说来反映的是统计特性,结果的合理性、有效性,都需要结合实际的系统来分析,检验。
以便提出合理的对策、方案。
以上步骤是一个反复的过程,在时间和步骤上是彼此交错的。
比如模型的修改和改进,都需要重新编写和改动模拟程序。
模拟结果的不合理,则要求检查模型,并修改模拟程序。
2.控制模拟时间的方法:
(1)固定时间增量法,是选用一段合适的时间作单位,然后每隔一个单位时间就计算一次有关参数的值,到达预定的模拟时间后,模拟程序结束。
在编写这种程序时,一般可以建立一个“模拟时钟”变量。
程序的主体框架一般是个大的循环,循环变量,则为模拟时间;在每个循环体内,就是对每个时段作处理。
例如,有些排队论模型,可能就是以每隔一段时间(一天或者一个月)进行处理。
(2)可变时间增量法,模拟也有一个“模拟时钟”变量,但它是在一个事件发生时,“模拟时钟”才向前推进。
需要注意的是,该模拟方法每一步经过的时间是可变的,而且会自动寻找下一个最早使系统状态发生变化的事件。
整个模拟直到“模拟时钟”到达指定的时间长度为止。
可以参考有关离散系统仿真的内容。
参考案例:
渡口模型
一个渡口的渡船营运者拥有一只甲板长32米,可以并排停放两列车辆的渡船。
他在考虑怎样在甲板上安排过河车辆的位置,才能安全地运过最多数量的车辆。
分析:
怎样安排过河车辆,关心一次可以运多少辆各类车。
准备工作:
观察数日,发现每次情况不尽相同,得到下列数据和情况:
(1)车辆随机到达,形成一个等待上船的车列;
(2)来到车辆,轿车约占40%,卡车约占55%,摩托车约占5%;
(3)轿车车身长为3.5~5.5米,卡车车身长为8~10米。
问题分析
这是一个机理较复杂的随机问题,是遵循“先到先服务”的随机排队问题。
解决方法:
采用模拟模型方法。
因此需考虑以下问题:
(1)应该怎样安排摩托车?
(2)下一辆到达的车是什么类型?
(3)怎样描述一辆车的车身长度?
(4)如何安排到达车辆加入甲板上两列车队中的哪一列中去?
本实验主要模拟装载车辆的情况,暂时不考虑渡船的安全。
模型建立
设到达的卡车、轿车长度分别为随机变量
。
结合实际,这里不妨假设卡车、轿车的车身长度
均服从正态分布。
由于卡车车身长为8~10m,所以卡车车长
的均值为
m,由概率知识中的“
”原则,其标准差为
,所以得到
。
同理可得
。
模拟程序设计
由以上的分析,程序设计时的应划分的主要模块(函数)如下:
(1)确定下一辆到达车辆的类型;
(2)根据车的类型确定到达车辆的长度;
(3)根据一定的停放规则,确定放在哪一列。
模拟程序
functionsim_dukou %渡口模型的模拟
n=input('输入模拟次数:
');
ifisempty(n)|(n<500)
n=500;
end
N=zeros(1,3);%依次为摩托车数量、卡车数量、轿车数量
fori=1:
n
isfull=0;
L=[0,0]; %第一列长度,第二列长度
while~isfull
t=rand;%模拟下一辆到达车的类型
ift<=0.55,
id=1;%到达卡车
elseift<0.95,
id=2;%到达轿车
else
id=3;%到达摩托车
end
N(id)=N(id)+1;
newlen=getlength(id);
[isfull,pos]=getiffull(L,newlen);
if~isfull
L(pos)=L(pos)+newlen;
end%if
end%while
end%for
disp('平均每次渡船上的车数')
mean_n=N/n
functionlen=getlength(id) %根据车的类型,产生车长随机数
switchid
case1
len=min([4.5+randn*(1/3),5.5]);
case2
len=min([9+randn*(1/3),10]);
case3
len=0;%根据放置方法,可以不予考虑
end
function[full,pos]=getiffull(L,newlen) %增加车长为len后是否可行(是否满),pos表示加到那一列去
full=0;
pos=0;
ifL
(1)>L
(2)
ifL
(1)+newlen<32
pos=1;
elseifL
(2)+newlen<32
pos=2;
else
full=1;
end
else
ifL
(2)+newlen<32
pos=2;
elseifL
(1)+newlen<32
pos=1;
else
full=1;
end
end
模型求解结果及分析
(一)运行结果
程序名为sim_dukou,运行程序,输出结果如下:
sim_dukou
输入模拟次数:
1000
平均每次渡船上的车数
mean_n=
5.48403.91800.5160
(二)结果分析
上面为运行一次模拟程序,模拟次数为1000次的模拟结果。
从模拟结果,你能得出什么结论?
发现摩托车的平均数量不到1辆,因此从另外一方面看,忽略摩托车的长度是合理的。
统计结果显示平均每次渡口时船上卡车、轿车、摩托车数量分别为5.484、3.918、0.516辆。
参考代码:
clear
gds
(1)=ceil(exprnd(30));
fw
(1)=time;
fwjs=zeros(4,3000);
fwjs(1,1)=gds
(1)+fw
(1);
dh
(1)=fw
(1);
fori=2:
4
gds(i)=gds(i-1)+ceil(exprnd(30));
fw(i)=time;
fwjs(i,1)=gds(i)+fw(i);
dh(i)=fw(i);
end
i=5;
gds(i)=gds(i-1)+ceil(exprnd(30));
whilegds(i)<=8*60*60
fw(i)=time;
[dh(i),fwjs2]=paidui(fwjs,gds(i),fw(i));
fwjs=fwjs2;
i=i+1;
gds(i)=gds(i-1)+ceil(exprnd(30));
end
js1.m文件:
t=rand;
ift<0.12
a=randperm(8);
js=a
(1);
elseift<0.22
a=randperm(11);
js=a
(1)+8;
elseift<0.4
a=randperm(10);
js=a
(1)+19;
elseift<0.68
a=randperm(10);
js=a
(1)+29;
elseift<0.88
a=randperm(10);
js=a
(1)+39;
else
t1=rand;
ift1<0.5
js=50;
elseift1<0.5+0.5^2;
js=51;
elseift1<0.5+0.5^2+0.5^3;
js=52;
elseift1<0.5+0.5^2+0.5^3+0.5^4;
js=53;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5;
js=54;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5+0.5^6;
js=55;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5+0.5^6+0.5^7;
js=56;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5+0.5^6+0.5^7+0.5^8;
js=57;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5+0.5^6+0.5^7+0.5^8+0.5^9;
js=58;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5+0.5^6+0.5^7+0.5^8+0.5^9+0.5^10;
js=59;
else
js=60;
end
end
js
paidui.m文件:
function[dh,fwjs]=paidui(fwjs,gds,fw)
forl=1:
4
fwjs1=fwjs(l,find(fwjs(l,:
)>0));
j=1;
whilejifgds>=fwjs1(j)&gdsdc(l)=length(fwjs1)-j;
break
end
j=j+1;
end
ifgds>fwjs1(length(fwjs1))
dc(l)=0;
end
iflength(fwjs1)==1
ifgds>fwjs1
(1)
dc(l)=0;
else
dc(l)=1;
end
end
end
[k,s]=min(dc);
fwjs2=fwjs(s,find(fwjs(s,:
)>0));
fwjs(s,length(fwjs2)+1)=max(fwjs(s,length(fwjs2))-gds,0)+gds+fw;
dh=fwjs(s,length(fwjs2)+1)-gds;
time.m文件:
functiont0=time
t=rand;
ift<0.12
a=randperm(8);
js=a
(1);
elseift<0.22
a=randperm(11);
js=a
(1)+8;
elseift<0.4
a=randperm(10);
js=a
(1)+19;
elseift<0.68
a=randperm(10);
js=a
(1)+29;
elseift<0.88
a=randperm(10);
js=a
(1)+39;
else
t1=rand;
ift1<0.5
js=50;
elseift1<0.5+0.5^2;
js=51;
elseift1<0.5+0.5^2+0.5^3;
js=52;
elseift1<0.5+0.5^2+0.5^3+0.5^4;
js=53;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5;
js=54;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5+0.5^6;
js=55;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5+0.5^6+0.5^7;
js=56;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5+0.5^6+0.5^7+0.5^8;
js=57;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5+0.5^6+0.5^7+0.5^8+0.5^9;
js=58;
elseift1<0.5+0.5^2+0.5^3+0.5^4+0.5^5+0.5^6+0.5^7+0.5^8+0.5^9+0.5^10;
js=59;
else
js=60;
end
end
t=rand;
ift<=0.2
t2=90;
else
t2=30;
end
t0=js+t2;