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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录