数学建模——理发店问题的蒙特卡洛仿真
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学建模课程设计
题目:理发店问题
学生:
一、课程设计题目
一个理发店有两位服务员A 和B,顾客们随机到达店内,其中60% 的顾客仅剪发,每位花5 分钟时
间;40% 的顾客既剪发又洗发,每位花8 分钟时间。设计算法,利用计算机对理发店的服务情况进行模拟。并统计以下量:
1. 最大队列长度
2. 顾客平均等待
3. 顾客总等待时间
4. 平均队列长度
二、设计思路
利用蒙特卡洛模拟原理,利用计算机对以上排队问题进行模拟。蒙特卡洛(Monte Carlo)模拟是一种通过设定随机过程,反复生成时间序列,计算参数估计量和统计量,进而研究其分布特征的方法。具体的,当系统中各个单元的可靠性特征量已知,但系统的可靠性过于复杂,难以建立可靠性预计的精确数学模型或模型太复杂而不便应用时,可用随机模拟法近似计算出系统可靠性的预计值;随着模拟次数的增多,其预计精度也逐渐增高。
蒙特卡洛模拟方法的原理是当问题或对象本身具有概率特征时,可以用计算机模拟的方法产生抽样结果,根据抽样计算统计量或者参数的值;随着模拟次数的增多,可以通过对各次统计量或参数的估计值求平均的方法得到稳定结论。
对于本题,我们假定顾客到达时间间隔服从均值为3min的指数分布,模拟一定数量顾客情况下理发店的排队状况。
三、设计代码
arrive_t=exprnd(3,10,1); %顾客到达时间
q=zeros(10,1);
t=zeros(10,1);
t0=zeros(10,1);
rannum=unifrnd(0,1,10,1);%产生均匀分布随机数
customer=zeros(10,1);%设定顾客
wait_time1=0;
wait_time2=0;
flag=0;%确定是否有人等待
for i=1:10%分出第一种和第二种状况
if(rannum(i,1)<=0.6)
customer(i,1)=5;%只剪
else
customer(i,1)=8;%剪和洗
end
end
tf=0;
t(1,1)=tf+arrive_t(1,1);%到达时间
wait_time=0;%等待时间
t0(1,1)=t(1,1)+customer(1,1);%服务时间
q(1,1)=0;%队列长度
t(2,1)=t(1,1)+arrive_t(2,1);
t0(2,1)=t(2,1)+customer(2,1);
t(3,1)=t(2,1)+arrive_t(3,1);
if (t(3,1)>t0(2,1)||t(3,1)>t0(2,1))
t0(3,1)=t(3,1)+customer(3,1);
else
wait_time1=t0(1,1)-t(3,1);
wait_time2=t0(2,1)-t(3,1);
if (wait_time1>wait_time2)
t0(3,1)=t(3,1)+wait_time2+customer(3,1);
wait_time=wait_time2;
else
t0(3,1)=t(3,1)+wait_time1+customer(3,1);
wait_time=wait_time1;
end
end
i=4;
while(i<=10)
t(i,1)=t(i-1,1)+arrive_t(i,1);
q(i,1)=q(i-1,1)+1;
wait_time1=t0(i-1,1)-t(i,1);
wait_time2=t0(i-2,1)-t(i,1);
if (flag==0)
if (wait_time1>0)&&(wait_time2>0)
if wait_time1>wait_time2
flag=1;
t0(i,1)=t(i,1)+wait_time2+customer(i,1); wait_time=wait_time+wait_time2;
else
flag=1;
t0(i,1)=t(i,1)+wait_time1+customer(i,1); wait_time=wait_time+wait_time1;
end
i=i+1;
elseif (wait_time1<=0)&&(wait_time2>0)
t0(i,1)=t(i,1)+customer(i,1);
q(i)=q(i)-1;
flag=0;
i=i+1;
elseif (wait_time1>0)&&(wait_time2<=0)
t0(i,1)=t(i,1)+customer(i,1);
q(i)=q(i)-1;
flag=0;
i=i+1;
elseif (wait_time1<=0)&&(wait_time2<=0)
t0(i,1)=t(i,1)+customer(i,1);
q(i)=q(i)-1;
flag=0;
i=i+1;
end
else
wait_time1=t0(i-2,1)-t(i-1,1)-arrive_t(i,1);
wait_time2=t0(i-3,1)-t(i-1,1)-arrive_t(i,1);
if wait_time1>wait_time2
t0(i,1)=t(i,1)+wait_time2+customer(i,1);
wait_time=wait_time+wait_time2;
else
t0(i,1)=t(i,1)+wait_time1+customer(i,1);
wait_time=wait_time+wait_time1;
end
flag=0;
end
end
ave_t=t(10,1)./1;
ave_q=wait_time./t(10,1);
maxq=max(q);
fprintf('最大队列长度%f\n',maxq);
fprintf('总等待时间%f\n',wait_time);
fprintf('平均等待时间%f\n',ave_t);
fprintf('平均队列长度%f\n',ave_q);
四、运行结果
运行一次程序,可以得到以下结果(依据蒙特卡洛仿真原理,每次结果会在一定范围内波动)
最大队列长度7.000000
总等待时间 93.656144
平均等待时间 19.465428
平均队列长度 4.811410