多服务台排队系统的仿真设计

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验3---多服务台排队系统的仿真

:学号:

一、目标任务

已知一个系统有N个服务员,能力相等,服务时间服从指数分布。顾客的到达时间间隔服从指数分布。用Monte-Carlo仿真,分别求按下列方案的总体平均排队时间:

① M|M|N。

② N个单通道系统并列,按1/N概率分裂到达流。

③ N个单通道并列,挑选最短的队。

要求:

①给出程序设计的过程。

②如果采用固定的N,则要求N>2。

③至少取ρ=0.3和ρ=0.7两种强度运行程序。

④对结果进行分析。

二、编程语言

Matlab

三、关键代码

方案一:

N = 3; % 服务员人数

r = 6; % 顾客到达流强度

u = 20; % 服务员服务强度

T = 1000000; % 仿真运行时间

avg_wait_time = []; % 平均等待时间

for i=1:100

% 模拟排队函数

server_time = [0.0, 0.0, 0.0]; % 用来保存服务员下一空闲时间

time = 0; % 绝对时钟,初始为0

client_num = 0; % 顾客总数,初始为0

CRTime = 0; % 顾客到达时间间隔

ServeTime = 0; % 顾客服务时间

server_id = 0; % 当前进入排队窗口的服务员编号

total_wait_time = 0;% 系统中到达顾客的总等待时间

while 1

CRTime = exprnd(1/r); % 按指数分布产生顾客到达时间间隔

time = time + CRTime; % 更新系统的绝对时钟

if time > T

break;

end

client_num = client_num + 1; % 顾客数加1

ServeTime = exprnd(1/u); % 按指数分布产生顾客服务间隔

server_id = mod(client_num, N); % 按1..N的顺序循环排入服务员窗口 if server_id ==0

server_id = N;

end

if server_time(1, server_id) <= time % 如果当前server_id号服务员空闲,则直接接收服务

server_time(1, server_id) = time + ServeTime; % 服务员下一空闲时间为当前绝对时钟加上当前服务时间

else % 否则所有服务员都在忙碌,顾客要排队等候

total_wait_time = total_wait_time + server_time(1, server_id) - time; % 顾客排队等候时间为当前服务员下一空闲时间减去绝对时钟

server_time(1, server_id) = server_time(1, server_id) + ServeTime;

end

end

avg_wait_time = [avg_wait_time, total_wait_time/client_num];

end

% 计算平均等待时间

mean_avg_wait_time = mean(avg_wait_time);

fprintf('ρ=%2.1f平均等待时间 %6.5f\n', r/u, mean_avg_wait_time); % 打印平均等待时间

% 绘制每次仿真的平均等待时间和总体平均等待时间线状图

x = 1:100;

%plot(x, avg_wait_time, x, mean_avg_wait_time);

scatter(x, avg_wait_time, '.');

方案二:

N = 3; % 服务员人数

r = 6; % 顾客到达流强度

u = 20; % 服务员服务强度

T = 1000; % 仿真运行时间

avg_wait_time = []; % 平均等待时间

for i=1:100

% 模拟排队函数

server_time = [0.0, 0.0, 0.0]; % 用来保存服务员下一空闲时间

time = 0; % 绝对时钟,初始为0

client_num = 0; % 顾客总数,初始为0

CRTime = 0; % 顾客到达时间间隔

ServeTime = 0; % 顾客服务时间

server_id = 0; % 当前进入排队窗口的服务员编号

total_wait_time = 0;% 系统中到达顾客的总等待时间

while 1

CRTime = exprnd(1/r); % 按指数分布产生顾客到达时间间隔

time = time + CRTime; % 更新系统的绝对时钟

if time > T

break;

end

client_num = client_num + 1; % 顾客数加1

ServeTime = exprnd(1/u); % 按指数分布产生顾客服务时间间隔

server_id = randi([1 N]); % 按1/N的概率排入服务员窗口

if server_time(1, server_id) <= time % 如果当前server_id号服务员空闲,则直接接收服务

server_time(1, server_id) = time + ServeTime; % 服务员下一空闲时间为当前绝对时钟加上当前服务时间

else % 否则所有服务员都在忙碌,顾客要排队等候

total_wait_time = total_wait_time + server_time(1, server_id) - time; % 顾客排队等候时间为当前服务员下一空闲时间减去绝对时钟

server_time(1, server_id) = server_time(1, server_id) + ServeTime;

end

end

avg_wait_time = [avg_wait_time, total_wait_time/client_num];

end

% 计算平均等待时间

mean_avg_wait_time = mean(avg_wait_time);

fprintf('ρ=%2.1f平均等待时间 %6.5f\n', r/u, mean_avg_wait_time); % 打印平均等待时间

% 绘制每次仿真的平均等待时间散点图

x = 1:100;

相关文档
最新文档