案例:理发店模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
案例:理发店模拟
问题描述
一个理发店有两位服务员A 和B ,顾客们随机到达店内,其中60%的顾客仅需剪发,每位花5分钟时间,另外40%顾客既要剪发又要洗发,每位用时8分钟。
理发店是个含有多种随机因素的系统,请对该系统进行模拟,并对其进行评判。
问题分析
理发店系统包含诸多随机因素,为了对其进行评判就是要研究其运行效率,从理发店自身利益来说,要看服务员工作负荷是否合理,是否需要增加员工等考虑。
从顾客角度讲,还要看顾客的等待时间,顾客的等待队长,如等待时间过长或者等待的人过多,则顾客会离开。
理发店系统是一个典型的排队系统,可以用排队论有关知识来研究。
模型假设
1.
60%的顾客只需剪发,40%的顾客既要剪发,又要洗发; 2.
每个服务员剪发需要的时间均为5分钟,既剪发又洗发则花8分钟; 3.
顾客的到达间隔时间服从指数分布; 4. 服务中服务员不休息。
变量说明
u :剪发时间(单位:分钟),u=5m ;
v: 既剪发又理发花的时间(单位:分钟),v=8m ;
T : 顾客到达的间隔时间,是随机变量,服从参数为λ的指数分布,(单位:分钟)
T 0:顾客到达的平均间隔时间(单位:秒),T 0=λ
1;
模型建立
由于该系统包含诸多随机因素,很难给出解析的结果,因此可以借助计算机模拟对该系统进行模拟。
考虑一般理发店的工作模式,一般是上午9:00开始营业,晚上10:00左右结束,且一般是连续工作的,因此一般营业时间为13小时左右。
这里以每天运行12小时为例,进行模拟。
这里假定顾客到达的平均间隔时间T 0服从均值3分钟的指数分布,
则有
3小时到达人数约为603
603=⨯人, 6小时到达人数约为1203
606=⨯人, 10小时到达人数约为2003
6010=⨯人, 这里模拟顾客到达数为60人的情况。
(如何选择模拟的总人数或模拟总时间)
系统模拟
根据系统模拟的一般方法,需要考虑系统的如下数据、参数。
1.状态(变量)
(1)等待服务的顾客数;
(2)A是否正在服务;
(3)B是否正在服务;
2.实体:两名服务员、顾客们
3.事件:
(1)一名新顾客的到达;
(2)A开始服务;
(3)A结束服务;
(4)B开始服务;
(5)B结束服务;
4.活动:
(1)顾客排队时间
(2)顾客们到达的间隔时间
(3)A的服务时间
(4)B的服务时间;
在系统模拟时,为了研究系统的整体情况,这里考虑顾客到达后不离开,且等待队长不限。
要考虑如果服务员均空闲时,顾客先选择谁服务?
要考虑模拟的时间设置还有顾客数目。
模拟终止条件是根据顾客数目还是根据营业时间终止?
计算机模拟算法设计
finished=0;
初始化运行时钟
while finished==0
if 产生的顾客数不到规定数目时then,
产生该顾客的有关数据;
将顾客加入等待队列;
else
运行时钟继续;
endif
处理服务员的状态(包括工作状态,空闲时间);
获得服务员的服务优先顺序;
根据服务员优先顺序从等待队列中安排服务;
endwhile
计算机模拟程序
顾客到达的间隔时间T的计算机产生方法,利用
T=rand T rand ln ln 10-=-
λ,
%理发店系统的模拟(案例分析之一)
%关键词:面向事件的计算机模拟技术
clear all
curclock=0;%当前时刻,动态变化
totalcustomer=0;%总共服务的顾客数
numsrv=2;
srvstatus=zeros(numsrv,5);%服务员有关数据
%srvstatus 第1列:服务状态(0空闲,1正在服务);第2列:当前服务顾客
编号;
% 第3列:当前服务结束时刻;第4列:服务员空闲时间;第5列:服务的顾客
总数
endtime =0;%结束时间
waiting=[];%等待队列数据
%waiting 第1列:顾客编号;第2列:顾客到达时刻;第3列:顾客开始接受服
务时刻;
% 第4列:接受服务时间;第5列:顾客结束服务时刻;第6列:间隔时间 cur=zeros(1,6);%当前产生顾客的数据,对应关系同waiting
avgwaitlen=[];%平均等待队长
avgwaittime =[];% 平均等待时间
ujiange=5;%平均间隔时间
finished=0;
numsimucustumer=yesinput('输入等待模拟的顾客数:',10,[10
1000]);
while finished==0,
if totalcustomer < numsimucustumer
%产生一个顾客的到达及其有关性质的数据
totalcustomer = totalcustomer+1;
jiange= -log(rand)*ujiange;%与上一个顾客的到达的间隔时间
curclock = curclock + jiange;
cur(1)= totalcustomer ;% 第1列:顾客编号
cur(2) = curclock;%第2列:顾客到达时刻
cur(6) = jiange; 第6列:间隔时间
%下面产生接受服务时间(可改进模型)
if rand<0.6, %产生顾客有关性质:这里是产生接受服务时间
cur(4) = 5;
else
cur(4) = 8;
end
%放入等待队列
if isempty(waiting),
waiting= cur;
else
[m,n]=size(waiting);
waiting(m+1,:)= cur;
end
else
curclock = curclock + (-log(rand)*ujiange);
end %if totalcustomer<
%分配等待队列(看是否有服务员空闲,如果有则分配;否则继续执行)
%处理服务员的服务状态
for i=1:numsrv,
if srvstatus(i,1)==1 & srvstatus(i,3) <= curclock,
srvstatus(i,1)=0;%设置为空闲状态
srvstatus(i,4)= curclock-srvstatus(i,3);%目前已经空
闲的时间
elseif srvstatus(i,1)==1 & srvstatus(i,3) > curclock, srvstatus(i,4)= 0;%没有休息(正在忙)
else
srvstatus(i,4)= curclock-srvstatus(i,3);%目前已经空
闲的时间
end
end
%处理服务员服务的先后顺序(依据空闲时间)(精细处理)
tmp=srvstatus(:,4);
for i=1:numsrv,
[value,id]=max(tmp);
b(i)=id;
tmp(id)=0;%已经排序了
end
%此时等待队列必然不为空
for j=1:numsrv,
i=b(j);%确定服务员的序号
if(srvstatus(i,1)==0)
%找一个顾客开始服务,同时计算该顾客什么时候接受服务,结束服务; [m,n]=size(waiting);
if m==0,
break;
end
if waiting(1,5)==0,%还没有开始接受服务
waiting(1,3)= curclock;
waiting(1,5)= waiting(1,3)+waiting(1,4);%结束时刻 srvstatus(i,1)=1;%设置为忙状态
srvstatus(i,2)=waiting(1,1);%顾客编号
srvstatus(i,3)= waiting(1,5);%结束时刻
srvstatus(i,5)=srvstatus(i,5)+1;%又服务了一个顾客
%计算等待时间
avgwaittime(end+1) = waiting(1,3)-waiting(1,2); disp(sprintf('间隔时间(%8.2f) 顾客编号:%5d 接受服务
员(%4d)服务(到达时
刻%10.2f)',waiting(1,6),waiting(1,1),i,waiting(1,2)))
endtime=max(endtime,waiting(1,5))
waiting(1,:)=[];%从等待队列中离开
end
end%if
end%for
[m,n]=size(waiting);
%计算队长(这里的计算式子可以参考排队论有关术语进行确定)
if totalcustomer < numsimucustumer
avgwaitlen(end+1)=m;
end
if sum(srvstatus(:,5))>=numsimucustumer,%队列为空,结束
finished=1;
end
end %while
disp('服务顾客数:')
disp(srvstatus(:,5)')
disp('平均队长');
disp(mean(avgwaitlen));
disp('运行时间(分钟,小时)');
disp(sprintf('%8.f%8.f',curclock,curclock/60));
disp('平均等待时间(分钟)');
disp(mean(avgwaittime ));
disp('结束时间(分钟)');
disp(endtime );
figure
hist(avgwaitlen)
title('平均队长')
figure
hist(avgwaittime)
title('平均等待时间');
思考题
请运行模拟程序,并分析运行结果。