?? diantifangzhen.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 + -