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)