多服务台排队系统的仿真由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“单服务排队系统仿真”。
实验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)
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.5fn', r/u, mean_avg_wait_time);% 打印平均等待时间
% 绘制每次仿真的平均等待时间散点图 x = 1:100;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);% 按指数分布产生顾客服务时间间隔
temp = min(server_time);% 寻找排队时间最短的服务员窗口
[x, y] = find(temp == min(min(server_time)));
server_id = y;% 按队伍最短排入服务员窗口
if server_time(1, 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.5fn', r/u, mean_avg_wait_time);% 打印平均等待时间
% 绘制每次仿真的平均等待时间散点图 x = 1:100;scatter(x, avg_wait_time, '.');
四、实验结果与分析 方案一:
图1 方案一仿真的平均等待时间散点图
图2 方案一平均等待时间
M|M|N1.输入参数: 服务员人数N,顾客到达流强度r,服务员服务强度u,仿真运行时间T;
2.各变量初始值置0: 绝对时钟time,服务员下一空闲时刻数组server_time[](其 中按顺序保存每一个服务员的下一空闲时刻),顾客总数client_num,顾客到达时间间隔CRTime,顾客服务时间ServeTime,当前进入排队窗口的服务员编号server_id,系统中顾客总等待时间total_wait_time;
3.按照指数分布产生下一顾客到达的时间间隔CRTime,time+=CRTime。若time>T,输出total_wait_time/client_num; 4.Client_num ++;
5.按照指数分布产生顾客到达时间间隔ServeTime; 6.按服务员的顺序生成当前服务员的server_id;
7.如果当前server_id号服务员空闲,则更新服务员下一空闲时间为当前绝对时钟加上当前服务时间并存入server_time[]对应数组。否则所有服务员都在忙碌,顾客要排队等候,总的排队时间加上顾客排队等候时间,等候时间为当前服务员下一空闲时间减去绝对时钟。再更新当前服务员下一空闲时间加上服务时间ServeTime。8.转到3;
方案二:
图3 方案二仿真的平均等待时间散点图
图4 方案二平均等待时间
N个单通道系统并列,按1/N概率分裂到达流
1.输入参数: 服务员人数N,顾客到达流强度r,服务员服务强度u,仿真运行时间T;
2.各变量初始值置0: 绝对时钟time,服务员下一空闲时刻数组server_time[](其中按顺序保存每一个服务员的下一空闲时刻),顾客总数client_num,顾客到达时间间隔CRTime,顾客服务时间ServeTime,当前进入排队窗口的服务员编号server_id,系统中顾客总等待时间total_wait_time;
3.按照指数分布产生下一顾客到达的时间间隔CRTime,time+=CRTime。若time>T,输出total_wait_time/client_num; 4.Client_num ++;
5.按照指数分布产生顾客到达时间间隔ServeTime; 6.按1/N概率生成当前服务员的server_id;
7.如果当前server_id号服务员空闲,则更新服务员下一空闲时间为当前绝对时钟加上当前服务时间并存入server_time[]对应数组。否则所有服务员都在忙碌,顾客要排队等候,总的排队时间加上顾客排队等候时间,等候时间为当前服务员下一空闲时间减去绝对时钟。再更新当前服务员下一空闲时间加上服务时间ServeTime。8.转到3; 方案三:
图4 方案三仿真的平均等待时间散点图
图5 方案三仿真的平均等待时间散点图
N个单通道并列,挑选最短的队 1.输入参数: 服务员人数N,顾客到达流强度r,服务员服务强度u,仿真运行时间T; 2.各变量初始值置0: 绝对时钟time,服务员下一空闲时刻数组server_time[](其中按顺序保存每一个服务员的下一空闲时刻),顾客总数client_num,顾客到达时间间隔CRTime,顾客服务时间ServeTime,当前进入排队窗口的服务员编号server_id,系统中顾客总等待时间total_wait_time;
3.按照指数分布产生下一顾客到达的时间间隔CRTime,time+=CRTime。若time>T,输出total_wait_time/client_num; 4.Client_num ++;
5.按照指数分布产生顾客到达时间间隔ServeTime;
6.按服务员下一空闲时刻数组server_time[]中最小的时刻生成当前服务员的server_id; 7.如果当前server_id号服务员空闲,则更新服务员下一空闲时间为当前绝对时钟加上当前服务时间并存入server_time[]对应数组。否则所有服务员都在忙碌,顾客要排队等候,总的排队时间加上顾客排队等候时间,等候时间为当前服务员下一空闲时间减去绝对时钟。再更新当前服务员下一空闲时间加上服务时间ServeTime。8.转到3;