视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
案例:理发店模拟
2025-09-28 02:06:18 责编:小OO
文档
案例:理发店模拟

问题描述

一个理发店有两位服务员A和B,顾客们随机到达店内,其中60%的顾客仅需剪发,每位花5分钟时间,另外40%顾客既要剪发又要洗发,每位用时8分钟。

理发店是个含有多种随机因素的系统,请对该系统进行模拟,并对其进行评判。

问题分析

理发店系统包含诸多随机因素,为了对其进行评判就是要研究其运行效率,从理发店自身利益来说,要看服务员工作负荷是否合理,是否需要增加员工等考虑。从顾客角度讲,还要看顾客的等待时间,顾客的等待队长,如等待时间过长或者等待的人过多,则顾客会离开。理发店系统是一个典型的排队系统,可以用排队论有关知识来研究。

模型假设

1.60%的顾客只需剪发,40%的顾客既要剪发,又要洗发;

2.每个服务员剪发需要的时间均为5分钟,既剪发又洗发则花8分钟;

3.顾客的到达间隔时间服从指数分布;

4.服务中服务员不休息。

变量说明

u:剪发时间(单位:分钟),u=5m;

v:  既剪发又理发花的时间(单位:分钟),v=8m;

T: 顾客到达的间隔时间,是随机变量,服从参数为的指数分布,(单位:分钟)

T0:顾客到达的平均间隔时间(单位:秒),T0=;

模型建立

由于该系统包含诸多随机因素,很难给出解析的结果,因此可以借助计算机模拟对该系统进行模拟。

考虑一般理发店的工作模式,一般是上午9:00开始营业,晚上10:00左右结束,且一般是连续工作的,因此一般营业时间为13小时左右。

这里以每天运行12小时为例,进行模拟。

这里假定顾客到达的平均间隔时间T0服从均值3分钟的指数分布,

则有

3小时到达人数约为人,

6小时到达人数约为人,

10小时到达人数约为人,

这里模拟顾客到达数为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=,

%理发店系统的模拟(案例分析之一)

%关键词:面向事件的计算机模拟技术

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('平均等待时间');

思考题

请运行模拟程序,并分析运行结果。下载本文

显示全文
专题