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

📄 mymm1.m

📁 刚写的Matlab下的M/M/1排队的仿真代码
💻 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 + -