📄 mymm1.m
字号:
% M/M/1系统仿真
% 输入: 平均到达间隔、平均服务时间、仿真的顾客数目
% 输出: 平均等待时间、平均队列长度
function [avgWaitTime,avgQueueLen] =myMM1(avgArvInterval,avgServTime,cNumber)
% 建立顾客信息向量
% 行: 顾客
% 列: 到达时间 到达间隔/开始服务时间 服务时间 离开时间
customer = zeros(cNumber,4);
% 第二列是顾客到达间隔,用exprnd(avgArvInterval,cNumber,1)来模拟
customer(:,2) = exprnd(avgArvInterval,cNumber,1);
% 第三列是顾客服务时间,用exprnd(avgServTime,cNumber,1)来模拟
customer(:,3) = exprnd(avgServTime,cNumber,1);
% 建立顾客到达的时间线,即绝对时间
customer(:,1) = cumsum(customer(:,2));
% 第一个顾客的离开时间 = 当前顾客的到达时间 + 当前顾客的服务时间
customer(1,4) = customer(1,1) + customer(1,3);
% 由于是FIFO队列,所以从第二个顾客开始,顾客的离开时间=Max(前一个顾客的离开时间,当前顾客的到达时间) + 当前顾客的服务时间
for i = 2:cNumber
customer(i,4) = max(customer(i-1,4),customer(i,1)) + customer(i,3);
end
% 由于 列3 - 到达间隔 现在已经没有意义,将其替换为开始服务时间
for i = 1:cNumber
customer(i,2) = customer(i,4) - customer(i,3);
end
% 计算平均等待时间
% 每个顾客的等待时间 = 开始服务时间 - 到达时间
avgWaitTime = sum(customer(:,2) - customer(:,1))/cNumber;
% 绘图
figure
plot(customer(:,4) - customer(:,3) - customer(:,1))
axis([0 cNumber 0 Inf])
title('顾客等待时间')
xlabel('顾客')
ylabel('等待时间(分钟)')
% 计算队列长度随时间变化,不知道这算不算事件驱动
% 第一步,提取关键时间点,关键时间点为顾客到来时刻与开始服务时刻
% 首先,创建一个足够大的数组,存放所有顾客的到来时刻与开始服务时刻
x = zeros(1,cNumber*2);
x(1:cNumber) = customer(:,1);
x(cNumber+1:cNumber*2) = customer(:,2);
% 对数组排序
x = sort(x);
% 去除重复时间点,并调整数组大小
j = 1;
for i = 1:cNumber*2
if x(i) > x(j)
j = j + 1;
x(j) = x(i);
end
end
t = x(1:j);
% 第二步,对于每个时间点,计算事件发生时队列长度,结果存放在向量y中
y = zeros(1,j);
for i = 1:j % i 为时间点索引
for k = 1:cNumber % k 为顾客索引
% 如果当前顾客的到达时间 <= 给定时间点,并且开始服务时间 > 给定时间点,则当前顾客在队列里
if customer(k,1) <= t(i)
if customer(k,2) > t(i)
y(i) = y(i) + 1;
end
end
end
end
% 计算平均队列长度
qSumTime = 0;
for i = 2:j
qSumTime = qSumTime + (t(i)-t(i-1)) * y(i-1);
end
avgQueueLen = qSumTime/t(j);
% 画图输出
figure
plot(t,y)
title('平均队长随时间变化图')
xlabel('时间(分钟)')
ylabel('队列长度(人)')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -