⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diantifangzhen.m

📁 面向事件的计算机模拟技术
💻 M
字号:
% 理发店系统的模拟(案例分析之一)
% 关键词:面向事件的计算机模拟技术
clear all;
clc;
clear;


curclock=0;     % 当前时刻,动态变化
totalcustomer=0;% 总共服务的顾客数
numsrv=3;       % 服务台的个数
srvstatus=zeros(numsrv,5); % 服务员有关数据
                           % srvstatus 第1列:服务状态(0空闲,1正在服务);第2列:当前服务顾客编号;
                           % 第3列:当前服务结束时刻;第4列:服务员空闲时间;第5列:服务的顾客总数

endtime =0; % 服务结束时间
waiting=[]; % 等待队列数据
            % 第1列:顾客编号;第2列:顾客到达时刻;第3列:顾客开始接受服务时刻;
            % 第4列:接受服务时间;第5列:顾客结束服务时刻;第6列:间隔时间

cur=zeros(1,6); % 当前产生顾客的数据,对应关系同waiting
avgwaitlen=[];  % 平均等待队长
avgwaittime =[];% 平均等待时间
aa=[];
bb=[];

    
arr_jiange=5; %平均到达间隔时间--------------------------------
ser_jiange=7; %平均服务间隔时间--------------------------------

finished=0;
numsimucustumer=input('输入等待模拟的顾客数:') ; 
disp(' ')
disp('模拟的顾客的总人数为:')
disp(numsimucustumer)

while finished==0,
   
if totalcustomer < numsimucustumer

totalcustomer = totalcustomer+1; % 产生一个顾客的到达及其有关性质的数据
jiange= -log(rand)*arr_jiange;   % 与上一个顾客的到达的间隔时间
curclock = curclock + jiange;
cur(1)= totalcustomer ;    % 第1列:顾客编号
cur(2) = curclock;         % 第2列:顾客到达时刻
cur(6) = jiange;           % 第6列:间隔时间


%下面产生接受服务时间(可改进模型)
cur(4)= -log(rand)*ser_jiange ;  %产生顾客有关性质:这里是产生接受服务时间

%放入等待队列
if isempty(waiting),
waiting= cur;
else
[m,n]=size(waiting);
waiting(m+1,:)= cur;
end
else
curclock = curclock + (-log(rand)*arr_jiange);
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);

aa(end+1)=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));
bb(end+1)=endtime;% 统计每个人的服务完成时间

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
 plot(avgwaitlen)
 title('平均队长')
 xlabel('达到的人数')
 
 figure
 plot(avgwaittime)
 title('平均等待时间');
 xlabel('达到的人数')
 
 figure
 t=1:numsimucustumer;
 plot(aa,t,'r-',bb,t,'g --')
 title('到达时间(红线)与离开时间(绿线)的比较')
 xlabel('时间')
 ylabel('第几个人');
 
 maxqueue=max(avgwaitlen);% 最大队长



 
 



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -