单服务排队系统MAAB仿真程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单服务台系统MATLAB仿真
一、引言
排队是日常生活中经常遇到的现象。通常,当人、物体或是信息的到达速率大于完成服务的速率时,即出现排队现象。排队越长,意味着浪费的时间越多,系统的效率也越低。在日常生活中,经常遇到排队现象,如开车上班、在超市等待结账、工厂中等待加工的工件以及待修的机器等。总之,排队现象是随处可见的。排队理论是运作管理中最重要的领域之一,它是计划、工作设计、存货控制及其他一些问题的基础。Matlab是MathWorks公司开发的科学计算软件,它以其强大的计算和绘图功能、大量稳定可靠的算法库、简洁高效的编程语言以及庞大的用户群成为数学计算工具方面的标准,几乎所有的工程计算领域,Matlab都有相应的软件工具箱。选用Matlab软件正是基于Matlab的诸多优点。
二、排队模型
三.仿真算法原理
(1)顾客信息初始化
根据到达率λ和服务率μ来确定每个顾客的到达时间间隔和服务时间间隔。服务间隔时间可以用负指数分布函数exprnd()来生成。由于泊松过程的时间间隔也服从负指数分布, 故亦可由此函数生成顾客到达时间间隔。需要注意的是exprnd()的输入参数不是到达率λ和服务率μ而是平均到达时间间隔1/λ和平均服务时间1/μ。
根据到达时间间隔 ,确定每个顾客的到达时刻. 学习过 C 语言的人习惯于使用 FOR循环来实现数值的累加, 但FOR循环会引起运算复杂度的增加而在MATLAB 仿真环境中, 提供了一个方便的函数cumsum() 来实现累加功能读者可以直接引用
对当前顾客进行初始化。第1 个到达系统的顾客不需要等待就可以直接接受服务其离开时刻等于到达时刻与服务时间之和。
(2)进队出队仿真
在当前顾客到达时刻,根据系统内已有的顾客数来确定是否接纳该顾客。若接纳则根据前一顾客的离开时刻来确定当前顾客的等待时间、离开时间和标志位;若拒绝,则标志位置为0.
流程图如下:
四、程序实现
单服务台服务,服务参数M/M/1,λ=μ=0.1,排队规则为FIFO,以分为单位,仿真时间240分钟。
仿真程序代码如下
%总仿真时间
Total_time = 240;
%到达率与服务率
lambda = 0.1;
mu =0.1;
%平均到达时间与平均服务时间
arr_mean = 1/lambda;
ser_mean = 1/mu;
%可能到达的最大顾客数(round:四舍五入求整数)
arr_num = round(Total_time*lambda*2);
%顾客事件表初始化
events = [];
%按负指数分布产生各顾客达到时间间隔
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);
%*****************************************
% 计算第1 个顾客的信息
%*****************************************
%第1 个顾客进入系统后直接接受服务,无需等待
events(3,1) = 0;
%其离开时刻等于其到达时刻与服务时间之和
events(4,1) = events(1,1)+events(2,1);
%其肯定被系统接纳,此时系统内共有1 个顾客,故标志位%置1
events(5,1) = 1;
%其进入系统后,系统内已有成员序号为1
member = [1];
%*****************************************
% 计算第i 个顾客的信息
%*****************************************
for i = 2:arr_num
%如果第i 个顾客的到达时间超过了仿真时间,则跳出循环if events(1,i)>Total_time
break;
%如果第i 个顾客的到达时间未超过仿真时间,则计算在其%到达时刻系统中已有的顾客个数
else number = sum(events(4,member) > events(1,i));
%如果系统已满,则系统拒绝第i 个顾客,其标志位置0
if number >= N+1
events(5,i) = 0;
%如果系统为空,则第i 个顾客直接接受服务
else if number == 0
%其等待时间为0
events(3,i) = 0;
%其离开时刻等于到达时刻与服务时间之和
events(4,i) = events(1,i)+events(2,i);
%其标志位置1
events(5,i) = 1;
member = [member,i];
%如果系统有顾客正在接受服务,且系统等待队列未满,则
%第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
五、仿真结果
events =
[]
number =
1
number =
events =
Columns 1through7
5.6418 13.2050 57.5155 68.3886 8
6.5789 88.8820 100.5548 9.1178 25.7746 14.2747 20.9298 16.9332 14.2731 8.7403 0 0 0 0 0 0 0
14.7597 0 0 0 0 0 0
1.0000 0 0 0 0 0 0
Columns 8through14
106.9312 124.9101 129.9854 143.3425 147.5878 151.3098 154.2113 30.0267 1.0235 0.5680 7.1159 7.1488 10.8554 1.0530
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
Columns 15through21
162.1843 186.9750 201.7163 202.6228 221.4368 223.3506 229.5432 9.9629 21.9640 2.4814 9.4228 14.2009 9.0656 23.3868 0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
Columns 22through28