生活中需要排队的地方很多,本模型用于分析和仿真现实生活中的排队现象。
排队论发源于上世纪初。当时美国贝尔电话公司发明了自动电话,以适应日益繁忙的工商业电话通讯需要。这个新发明带来了一个新问题,即通话线路与电话用户呼叫的数量关系应如何妥善解决,这个问题久久未能解决。
1909年,丹麦的哥本哈根电话公司A.K.埃尔浪(Erlang)在热力学统计平衡概念的启发下解决了这个问题。1917 年,爱尔朗发表了他的著名的文章—“自动电话交换中的概率理 论的几个问题的解决”。排队论已广泛应用于解决军事、运输、维修、生产、服务、库 存、医疗卫生、教育、水利灌溉之类的排队系统的问题,显示了强大的生命力。
排队是在日常生活中经常遇到的现象,如顾客到商店购买物品、病人到医院看病常 常要排队。此时要求服务的数量超过服务机构(服务台、服务员等)的容量。也就是说, 到达的顾客不能立即得到服务,因而出现了排队现象。这种现象不仅在个人日常生活中 出现,电话局的占线问题,车站、码头等交通枢纽的车船堵塞和疏导,故障机器的停机 待修,水库的存贮调节等都是有形或无形的排队现象。由于顾客到达和服务时间的随机性。可以说排队现象几乎是不可避免的。
到达顾客 | 服务内容 | 服务机构 |
---|---|---|
病人 | 诊断/手术 | 医生/手术台 |
进港的货船 | 装货/卸货 | 码头泊位 |
到港的飞机 | 降落 | 机场跑道 |
电话拨号 | 通话 | 交换台 |
故障机器 | 修理 | 修理技工 |
修理技工 | 领取修配零件 | 仓库管理员 |
上游河水 | 入库 | 水闸管理员 |
(1)由于顾客到达和服务时间的随机性,
现实中的排队现象几乎不可避免;
(2)排队过程,通常是一个随机过程,
排队论又称“随机服务系统理论”;
(1)顾客输入过程;
(2)排队结构与排队规则;
(3)服务机构与服务规则;
顾客源(总体):有限/无限;
顾客到达方式:逐个/逐批;(仅研究逐个情形)
顾客到达间隔:随机型/确定型;
顾客前后到达是否独立:相互独立/相互关联;
输入过程是否平稳:平稳/非平稳;(仅研究平稳性)
顾客排队方式:等待制/即时制(损失制);
排队系统容量:有限制/无限制;
排队队列数目: 单列/多列;
是否中途退出: 允许/禁止;
是否列间转移: 允许/禁止;
(仅研究禁止退出和转移的情形)
服务台(员)数目;单个/多个;
服务台(员)排列形式;并列/串列/混合;
服务台(员)服务方式;逐个/逐批;(研究逐个情形)
服务时间分布;随机型/确定型;
服务时间分布是否平稳:平稳/非平稳;(研究平稳情形)
a)先到先服务(FCFS);
b)后到先服务(LCFS);
c)随机服务;
d)优先服务;
(1)泊松分布M ;
(2)负指数分布M ;
(3)k阶爱尔朗分布Ek;
(4)确定型分布D;
(5)一般服务时间分布G;
——M/M/1,M/D/1,M/ Ek /1;
——M/M/c,M/M/c/∞/m,
——M/M/c/N/∞,…
用于评价排队系统的优劣。
泊松流与泊松分布
负指数分布
这里的M/M/1如未设置N(系统空间,即等候区的最大容纳量)则指M/M/1/∞
单服务台等待制模型 M/M/1/∞ 是指:顾客的相继到达时间服从参数为λ的负指数分布,服务台个数为1,服务时间V服从参数为 μ的负指数分布,系统空间无限, 允许无限排队,这是一类最简单的排队系统。
此模型与M/M/1模型不同之处在于有S个服务台,各服务台的工作相互独立,服务率相等,如果顾客到达时,S个服务台都忙着,则排成一队等待,先到先服务的单队模型。
整个系统的平均服务率为: s μ , ρ ∗ = λ / s μ , ( ρ ∗ < 1 ) s \mu, \ \rho^{*}=\lambda / s \mu ,\ \left(\rho^{*}< 1)\right. sμ, ρ∗=λ/sμ, (ρ∗<1),为该系统的服务强度。
某医院急诊室同时只能诊治一个病人,诊治时间服从指数分布,每个病人平均需要15分钟。病人按泊松分布到达,平均每小时到达3人。试对此排队队系统进行分析。
解 对此排队队系统分析如下:
承接例1,假设医院增强急诊室的服务能力,使其同时能诊治两个病人,且平均服务率相同,试分析该系统工作情况。
解 这相当于增加了一个服务台,故有:S=2,λ=3人/h,μ=4人/h
ρ = λ μ = 0.75 , ρ ∗ = λ S μ = 3 2 × 4 = 0.375 P o = [ 1 + 0.75 + ( 0.75 ) 2 2 ! ( 1 − 0.375 ) ] − 1 = 5 11 = 0.45 L q = ( 0.75 ) 2 × 0.375 2 ! ( 1 − 0.375 ) 2 × 5 11 = 0.27 × 5 11 人 ≈ 0.12 人 L s = L q + ρ = ( 0.12 + 0.75 ) 人 = 0.87 人 W s = L s λ = 0.87 3 = 0.29 h = 17.4 m i n W q = L q λ = 0.12 3 0.04 h = 2.4 m i n \begin{array}{l}{\rho=\frac{\lambda}{\mu}=0.75, \quad \rho^{*}=\frac{\lambda}{\mathrm{S} \mu}=\frac{3}{2 \times 4}=0.375}\\ {P_{o}=\left[1+0.75+\frac{(0.75)^{2}}{2 !(1-0.375)}\right]^{-1}=\frac{5}{11}=0.45} \\ {L_{q}=\frac{(0.75)^{2} \times 0.375}{2 !(1-0.375)^{2}} \times \frac{5}{11}=0.27 \times \frac{5}{11}人 \approx 0.12人} \\ {L_{s}=L_{q}+\rho=(0.12+0.75)人=0.87人} \\ {W_{s}=\frac{L_{s}}{\lambda}=\frac{0.87}{3}=0.29 h=17.4 \mathrm{min}} \\ {W_{q}=\frac{L_{q}}{\lambda}=\frac{0.12}{3} 0.04 h=2.4 \mathrm{min}} \end{array} ρ=μλ=0.75,ρ∗=Sμλ=2×43=0.375Po=[1+0.75+2!(1−0.375)(0.75)2]−1=115=0.45Lq=2!(1−0.375)2(0.75)2×0.375×115=0.27×115人≈0.12人Ls=Lq+ρ=(0.12+0.75)人=0.87人Ws=λLs=30.87=0.29h=17.4minWq=λLq=30.120.04h=2.4min
病人必须等候的概率,即系统状态N≥2的概率:
P ( N ≥ 2 ) = ( 0.75 ) 2 2 ! ( 1 − 0.375 ) × 5 11 ≈ 0.20 P(N \geq 2)=\frac{(0.75)^{2}}{2 !(1-0.375)} \times \frac{5}{11} \approx 0.20 P(N≥2)=2!(1−0.375)(0.75)2×115≈0.20
某医院挂号室有三个窗口,就诊者的到达服从泊松分布,平均到达率为每分钟0.9人,挂号员服务时间服从指数分布,平均服务率每分钟0.4人,现假设就诊者到达后排成一队,依次向空闲的窗口挂号,显然系统的容量和顾客源是不限的,属于M/M/S型的排队服务模型。求:该系统的运行指标 P 0 , L q , L , W q , W , P ( N ≥ 3 ) P_{0}, \ L_{q}, \ L, \ W_{q}, \ W, \ P(N \geq 3) P0, Lq, L, Wq, W, P(N≥3)
解
S = 3 , ρ = λ μ = 0.9 0.4 = 2.25 , ρ ∗ = λ S μ = 2.25 3 = 3 4 < 1 S=3, \quad \rho=\frac{\lambda}{\mu}=\frac{0.9}{0.4}=2.25, \quad \rho^{*}=\frac{\lambda}{S \mu}=\frac{2.25}{3}=\frac{3}{4}<1 S=3,ρ=μλ=0.40.9=2.25,ρ∗=Sμλ=32.25=43<1
s=2; %服务台的个数
mu=4; %单位时间内能服务的顾客数
lambda=3; %单位时间内到达的顾客数
ro=lambda/mu;
ros=ro/s;
sum1=0;
for i=0:(s-1) sum1=sum1+ro.^i/factorial(i); end
sum2=ro.^s/factorial(s)/(1-ros);
p0=1/(sum1+sum2);
p=ro.^s.*p0/factorial(s)/(1-ros);
Lq=p.*ros/(1-ros);
L=Lq+ro;
W=L/lambda;
Wq=Lq/lambda;
fprintf('排队等待的平均人数为%5.2f人\n',Lq)
fprintf('系统内的平均人数为%5.2f人\n',L)
fprintf('平均逗留时间为%5.2f分钟\n',W*60)
fprintf('平均等待时间为%5.2f分种\n',Wq*60)
clear
clc
%*****************************************
%初始化顾客源
%*****************************************
%总仿真时间
Total_time = 10;
%队列最大长度
N=10000000000;
%到达率与服务率
lambda=10, mu=6;
%平均到达时间与平均服务时间
arr_mean = 1/lambda;
ser_mean = 1/mu;
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];
for i = 2:arr_num
%如果第 i个顾客的到达时间超过了仿真时间,则跳出循环
if events(1,i)>Total_time break;
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
%PROGRAMLANGUAGEPROGRAMLANGUAGE
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
%仿真结束时,进入系统的总顾客数
len_mem = length(member);
%*****************************************
%输出结果
%*****************************************
%绘制在仿真时间内,进入系统的所有顾客的到达时刻和离
%开时刻曲线图(stairs:绘制二维阶梯图)
stairs([0 events(1,member)],0:len_mem);
hold on;
stairs([0 events(4,member)],0:len_mem,'.-r');
legend('到达时间 ','离开时间 ');
hold off;
grid on;
%绘制在仿真时间内,进入系统的所有顾客的停留时间和等
%待时间曲线图(plot:绘制二维线性图)
figure;
plot(1:len_mem,events(3,member),'r-*',1: len_mem,events(2,member)+events(3,member),'k-');
legend('等待时间 ','停留时间 ');
grid on;
提高服务率mu=12
clear
clc
%*****************************************
%初始化顾客源
%*****************************************
%总仿真时间
Total_time = 10;
%队列最大长度
N=10000000000;
%到达率与服务率
lambda=10, mu=12;
%平均到达时间与平均服务时间
arr_mean = 1/lambda;
ser_mean = 1/mu;
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];
for i = 2:arr_num
%如果第 i个顾客的到达时间超过了仿真时间,则跳出循环
if events(1,i)>Total_time break;
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
%PROGRAMLANGUAGEPROGRAMLANGUAGE
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
%仿真结束时,进入系统的总顾客数
len_mem = length(member);
%*****************************************
%输出结果
%*****************************************
%绘制在仿真时间内,进入系统的所有顾客的到达时刻和离
%开时刻曲线图(stairs:绘制二维阶梯图)
stairs([0 events(1,member)],0:len_mem);
hold on;
stairs([0 events(4,member)],0:len_mem,'.-r');
legend('到达时间 ','离开时间 ');
hold off;
grid on;
%绘制在仿真时间内,进入系统的所有顾客的停留时间和等
%待时间曲线图(plot:绘制二维线性图)
figure;
plot(1:len_mem,events(3,member),'r-*',1: len_mem,events(2,member)+events(3,member),'k-');
legend('等待时间 ','停留时间 ');
grid on;
增加服务台至两个,这样人数流至原来单服务台的人数减半,lambda=5
clear
clc
%*****************************************
%初始化顾客源
%*****************************************
%总仿真时间
Total_time = 10;
%队列最大长度
N=10000000000;
%到达率与服务率
lambda=5, mu=6;
%平均到达时间与平均服务时间
arr_mean = 1/lambda;
ser_mean = 1/mu;
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];
for i = 2:arr_num
%如果第 i个顾客的到达时间超过了仿真时间,则跳出循环
if events(1,i)>Total_time break;
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
%PROGRAMLANGUAGEPROGRAMLANGUAGE
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
%仿真结束时,进入系统的总顾客数
len_mem = length(member);
%*****************************************
%输出结果
%*****************************************
%绘制在仿真时间内,进入系统的所有顾客的到达时刻和离
%开时刻曲线图(stairs:绘制二维阶梯图)
stairs([0 events(1,member)],0:len_mem);
hold on;
stairs([0 events(4,member)],0:len_mem,'.-r');
legend('到达时间 ','离开时间 ');
hold off;
grid on;
%绘制在仿真时间内,进入系统的所有顾客的停留时间和等
%待时间曲线图(plot:绘制二维线性图)
figure;
plot(1:len_mem,events(3,member),'r-*',1: len_mem,events(2,member)+events(3,member),'k-');
legend('等待时间 ','停留时间 ');
grid on;