实验3--- 多服务台排队系统的仿真姓名:学号:一、目标任务已知一个系统有N 个服务员,能力相等,服务时间服从指数分布。
顾客的到达时间间隔服从指数分布。
用Monte-Carlo 仿真,分别求按下列方案的总体平均排队时间:①M|M|N 。
②N 个单通道系统并列,按1/N 概率分裂到达流。
③N 个单通道并列,挑选最短的队。
要求:①给出程序设计的过程。
②如果采用固定的N,则要求N>2。
③至少取p二和p二两种强度运行程序。
④对结果进行分析。
二、编程语言Matlab三、关键代码N = 3; % 服务员人数 r = 6; % 顾客到达流强度 u = 20; % 服务员服务强度 T = 1000000; % 仿真运行时间avg_wait_time = []; %平均等待时间for i=1:100% 模拟排队函数server_time =[, , ]; % 用来保存服务员下一空闲时间time = 0; % 绝对时钟,初始为 0 client_num = 0; % 顾客总数,初始为 0 CRTime = 0;%顾客到达时间间隔 ServeTime = 0; % 顾客服务时间server_id = 0 ; % 当前进入排队窗口的服务员编号total_wait_time = 0;%系统中到达顾客的总等待时间while 1按 1..N 的顺序循环排入服务员窗口if server_id ==0 server_id = N; endif 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 endavg_wait_time = [avg_wait_time, total_wait_time/client_num]; end% 计算平均等待时间 mean_avg_wait_time = mean(avg_wait_time);CRTime = exprnd(1/r); % 按指数分布产生顾客到达时间间隔 time = time + CRTime; % 更新系统的绝对时钟if time > Tbreak;endclient_num = client_num + 1; % 顾客数加 1ServeTime = exprnd(1/u); %按指数分布产生顾客服务间隔server_id = mod(client_num, N); %fprintf(' p 二%平均等待时间%\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; % 服务员服务强度 avg_wait_time = []; %平均等待时间for i=1:100% 模拟排队函数server_time =[, , ]; % 用来保存服务员下一空闲时间time = 0; % 绝对时钟,初始为 0 client_num = 0; % 顾客总数,初始为 0 CRTime = 0;%顾客到达时间间隔 ServeTime = 0; % 顾客服务时间server_id = 0 ; % 当前进入排队窗口的服务员编号total_wait_time = 0;%系统中到达顾客的总等待时间while 1按指数分布产生顾客到达时间间隔 time = time + CRTime;更新系统的绝对时钟T = 1000; % 仿真运行时间 CRTime = exprnd(1/r); %服务员空闲,则直接接收服务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 endavg_wait_time = [avg_wait_time, total_wait_time/client_num]; end % 计算平均等待时间 mean_avg_wait_time = mean(avg_wait_time); fprintf(' p 二%平均等待时间 %\n', r/u, mean_avg_wait_time); %等待时间endclient_num = client_num + 1; % ServeTime = exprnd(1/u); % server_id = randi([1 N]); % if server_time(1, server_id) <= time %顾客数加 1 按指数分布产生顾客服务时间间隔 按 1/N 的概率排入服务员窗口如果当前 server_id 号服务员下打印平均% 绘制每次仿真的平均等待时间散点图 x = 1:100;scatter(x, avg_wait_time, '.');〉' 丿 2 £ 方案三:N = 3; % 服务员人数 r = 6; %顾客到达流强度u = 20; % 服务员服务强度 avg_wait_time = []; %平均等待时间for i=1:100% 模拟排队函数server_time =[, , ]; % 用来保存服务员下一空闲时间time = 0; % 绝对时钟,初始为 0 client_num = 0; % 顾客总数,初始为 0 CRTime = 0;%顾客到达时间间隔 ServeTime = 0; % 顾客服务时间server_id = 0 ; % 当前进入排队窗口的服务员编号total_wait_time = 0;%系统中到达顾客的总等待时间while 1按指数分布产生顾客到达时间间隔 time = time + CRTime;更新系统的绝对时钟T = 1000; % 仿真运行时间 CRTime = exprnd(1/r); %[x, y] = find(temp == min(min(server_time))); server_id = y; %按队伍最短排入服务员窗口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 endavg_wait_time = [avg_wait_time, total_wait_time/client_num]; end % 计算平均等待时间 mean_avg_wait_time = mean(avg_wait_time);endclient_num = client_num + 1; % ServeTime = exprnd(1/u); % temp = min(server_time); %顾客数加 1按指数分布产生顾客服务时间间隔 寻找排队时间最短的服务员窗口fprintf(' p 二%平均等待时间%\n', 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 。