M/M/1/∞排队模型MATLAB仿真
clc;
clear;
close all;
Total_time = 3600; % 仿真总时间
N = 1000000000; % 系统容量 (无限)
lambda = 54; % 平均到达率 (人/小时)
mu1 = 9; % 单个服务台服务率 (人/小时)
m = 1; % 服务台数量
mu = mu1 * m; % 系统服务率
arr_mean = 1 / lambda; % 平均到达间隔时间
ser_mean = 1 / mu; % 平均服务时间
arr_num = lambda * Total_time; % 到达顾客总数
events = zeros(5, arr_num); % 预分配事件数组
% 生成到达时间和服务时间
events(1, :) = exprnd(arr_mean, 1, arr_num); % 到达间隔时间
events(1, :) = cumsum(events(1, :)); % 到达时间
events(2, :) = exprnd(ser_mean, 1, arr_num); % 服务时间
% 初始化
len_sim = sum(events(1, :) <= Total_time); % 在仿真时间内到达的顾客数
events(3, 1) = 0; % 第一个顾客等待时间为0
events(4, 1) = events(1, 1) + events(2, 1); % 第一个顾客离开时间
events(5, 1) = 1; % 第一个顾客进入系统
member = 1; % 系统内顾客索引
% 仿真循环
for i = 2:arr_num
if events(1, i) > Total_time % 超过仿真时间,退出循环
break;
else
number = sum(events(4, member) > events(1, i)); % 此时系统内顾客数
if number >= N + 1 % 系统已满
events(5, i) = 0; % 拒绝进入
else
if number == 0 % 系统空闲
events(3, i) = 0; % 等待时间为0
events(4, i) = events(1, i) + events(2, i); % 离开时间
events(5, i) = 1; % 进入系统
member = [member, i]; % 更新系统内顾客索引
else % 系统忙碌
len_mem = length(member);
events(3, i) = events(4, member(len_mem)) - events(1, i); % 等待时间
events(4, i) = events(4, member(len_mem)) + events(2, i); % 离开时间
events(5, i) = number + 1; % 进入系统
member = [member, i]; % 更新系统内顾客索引
end
end
end
end
% 计算平均等待时间和平均停留时间
len_mem = length(member);
d = sum(events(3, :));
d1 = d / arr_num; % 平均等待时间
d2 = sum(events(2, :));
d3 = d / arr_num; % 平均停留时间
% 绘制到达时间和离开时间
stairs([0, events(1, member)], 0:len_mem);
hold on;
stairs([0, events(4, member)], 0:len_mem, '.-r');
legend('到达时间', '离开时间');
hold off;
grid on;
% 绘制等待时间和停留时间
figure;
plot(1:len_mem, events(3, member), 'r-*', 1:len_mem, events(2, member) + events(3, member), 'k-');
legend('等待时间', '停留时间');
grid on;
原文地址: http://www.cveoy.top/t/topic/cOwK 著作权归作者所有。请勿转载和采集!