数学建模——理发店问题的蒙特卡洛仿真

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档