数学建模-理发店系统研究

clc
curclock=0;%当前时刻,动态变化

totalcustomer=0;

numsvr=2;
svrstatus=zeros(numsvr,5);

%svrstatus:  
%第一列:服务状态(0空闲,1正在服务);  
%第二列:当前顾客的编号;
%第三列:当前服务结束时刻;
%第四列:服务员空闲时刻;
%第五列:服务乘客的总数;

endtime=0;
waiting=[];

%waiting:  
%第一列:顾客编号;  
%第二列:顾客到达时间;
%第三列:顾客开始接受服务时刻;
%第四列:接受服务时间;
%第五列:顾客结束服务时刻;
%第六列:间隔时间;


cur=zeros(1,6);%产生相应顾客的数据

avgwaitinglen=[];
avgwaitingtime=[];
ujiange=5;

finished=0;

numsimucustomer=input('输入等待模拟的顾客数');

while finished==0
    if totalcustomer<numsimucustomer
        %产生一个顾客的到达及其相关性质的数据
       totalcustomer=totalcustomer+1;
       jiange=-log(rand)*ujiange;%和上个顾客的到达时间的间隔时间
       
       curclock=curclock+jiange;
       cur(1)=totalcustomer;
       cur(2)=curclock;
       cur(6)=jiange;
       
       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
    
    %分配等待队列(看是否有服务空闲的,如果有则分配,否则继续执行)
    i=1;
    %处理服务员的服务状态
    for i = 1:numsvr
       if svrstatus(i,1)==1&svrstatus(i,3)<=curclock
          svrstatus(i,1)=0;%设置为空闲状态
          svrstatus(i,4)=curclock-svrstatus(i,3);%目前已经有空闲状态
       elseif svrstatus(i,1)==1&svrstatus(i,3)>curclock
           svrclock(i,4)=0;%没有休息
       else
            svrstatus(i,4)=curclock-svrstatus(i,3);%目前已经空闲的时刻
       end
    end
    
    %处理服务员的服务先后顺序(依旧空闲时间)(精细处理)
    tmp=svrstatus(:,4);
    for i=1:numsvr
        [value,id]=max(tmp);
        b(i)=id;
        tmp(id)=0;
    end
    
    
    %此时等待队列必然不为空
    for j=1:numsvr
       i=b(j);%确定服务员的序号 
       if(svrstatus(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);
            
            svrstatus(i,1)=1;
            svrstatus(i,2)=waiting(1,1);
            svrstatus(i,3)=waiting(1,5);
            svrstatus(i,5)=svrstatus(i,5)+1;
            
            avgwaitingtime(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
        
    end
    
    [m,n]=size(waiting);
    
    if totalcustomer<numsimucustomer
        avgwaitinglen(end+1)=m;
    end
    if sum(svrstatus(:,5))>numsimucustomer
        finished=1;
    end
    
    
end

disp('服务顾客数')
disp(svrstatus(:,5));
disp('平均对长');
disp(mean(avgwaitinglen));
disp('运行时间(分钟,小时');
disp(sprintf('%8.f%8.f'),curclock,curclock/60);

disp('平均等待时间(分钟)')
disp(mean(avgwaitingtime));
disp('结束时间(分钟)')
disp(endtime)

figure
title('平均等待队列')
bar(avgwaitinglen)

figure
title('平均等待时间')
bar(avgwaitingtime)


posted @ 2022-02-07 17:53  A1han  阅读(62)  评论(0)    收藏  举报