数学建模——排队论模型

781 阅读8分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

排队论模型

排队现象:

到达顾客服务内容服务机构
病人诊断/手术医生/手术台
进港的货船装货/卸货码头泊位
到港的飞机降落机场跑道
电话拨号通话交换台
故障机器修理修理技工
修理技工领取修配零件仓库管理员
上游河水入库水闸管理员
  1. 由于顾客到达和服务时间的随机性,现实中的排队现象几乎不可避免;
  2. 排队过程,通常是一个随机过程,排队论又称“随机服务系统理论”;

排队服务过程:

image.png

排队系统的要素

  1. 顾客输入过程;
  2. 排队结构与排队规则;
  3. 服务机构与服务规则;

顾客输入过程

  • 顾客源(总体):有限/无限;
  • 顾客到达方式:逐个/逐批;(仅研究逐个情形)
  • 顾客到达间隔:随机型/确定型;
  • 顾客前后到达是否独立:相互独立/相互关联;
  • 输入过程是否平稳:平稳/非平稳;(仅研究平稳性)

排队结构与排队规则(仅研究禁止退出和转移的情形)

  • 顾客排队方式:等待制/即时制(损失制);
  • 排队系统容量:有限制/无限制;
  • 排队队列数目:单列/多列;
  • 是否中途退出:允许/禁止;
  • 是否列间转移:允许/禁止;

服务机构与服务规则

  • 服务台(员)数目:多个/单个;
  • 服务台(员)排队形式:并列/串列/混合;
  • 服务台(员)服务方式:逐个/逐批;(研究逐个情形)
  • 服务时间分布:随机型/确定型;
  • 服务时间分布是否平稳:平稳/非平稳;(研究平稳情形)

服务台(员)为顾客服务的顺序:

  • 先到先服务(FCFS);
  • 后到先服务(LCFS);
  • 随机服务;
  • 优先服务;

到达间隔和服务时间典型分布:

  • 泊松分布——M;
  • 负指数分布——M;
  • k阶爱尔朗分布——Ek;
  • 确定型分布——D;
  • 一般服务时间分布——G;

排队模型示例:

  • ——M/M/1, M/D/1, M/Ek/1;
  • ——M/M/c, M/M/c/∞/m;
  • ——M/M/c/N/∞,……

系统运行状态参数:

  • 系统状态N(t):指排队系统在时刻t时的全部顾客数N(t),包括“排队顾客数”和“正被服务顾客数”;

  • 系统状态概率:

    1. Pn(t):表示时刻t系统状态N(t)=n的概率;

    2. 稳态概率Pn:

image.png

 

系统运行指标参数:评价排队系统的优劣。↓

一、队长与排队长

  1. 队长:系统中的顾客数(n)期望值记为Ls;
  2. 排队长:系统中排队等待服务的顾客数;期望值记为Lq;

 

二、逗留时间与等待时间

  1. 逗留时间:指一个顾客在系统中的全部停留时间。期望值记为Ws;
  2. 等待时间:指一个顾客在系统中的排队等待时间。期望值记为Wq;

 

Ws = Wq + E(服务时间)

三、其他相关指标

  1. 忙期:指从顾客到达空闲服务机构起,到服务机构再次空闲的时间长度;
  2. 忙期服务量:指一个忙期内系统平均完成服务的顾客数;
  3. 损失率:指顾客到达排队系统,未接受服务而离去的概率;
  4. 服务强度:ρ = λ/sμ;(λ→单位时间到达服务台人数;μ→单个服务台单位时间能够处理的顾客数)

顾客到达时间间隔分布 泊松流与泊松分布↓

如果顾客到达满足如下条件,则称为泊松流:

  • 在不相互重叠的时间区间内,到达顾客数相互独立(无后效性);
  • 对于充分小的时间间隔内[t,t+▲t]内,到达1个顾客的概率与t无关,仅与时间间隔成正比(平稳性):P1(t,t+▲t) = λ▲t + o(▲t)
  • 对于充分小的时间间隔[t,t+▲t],2个及以上顾客到达的概率可忽略不计(普通性);

泊松流到达间隔服从负指数分布:

image.png

顾客服务时间分布 负指数分布

image.png

单服务台负指数分布M/M/1排队系统

模型的条件是:

  1. 输入过程——顾客源是无限的,顾客到达完全是随机的,单个到来,到达过程服从泊松分布,且是平稳的;
  2. 排队规则——单队,且队长没有限制,先到先服务;
  3. 服务机构——单服务台,服务时间的长短是随机的,服从相同的指数分布;

对于M/M/1模型有如下公式:

image.png

例题一:

某医院急诊室同时只能诊治一个病人,诊治时间服从指数分布,每个病人平均需要15分钟。病人按泊松分布到达,平均每小时到达3人。试对此排队系统进行分析。

解:对此排队系统分析如下:

(1)先确定参数值:这是单服务台系统,有:

λ = 3人/h,μ = 60/15人/h=4人/h

故服务强度为:

ρ=λ/μ = 3/4 = 0.75

计算稳态概率:

P0 = 1-ρ=1-0.75=0.25

这就是急诊室空闲的概率,也是病人不必等待立即就能就诊的概率。而病人需要等待的概率则为:

ρ = 1-P0=0.75

这也是急诊室繁忙的概率

(2)计算系统主要工作指标

计算急诊室内外的病人平均数:

Ls = λ/(μ-λ)=3人

急诊室外排队等待的病人平均数:

Lq = Lsρ=3*0.75=2.25人

病人在急诊室内外平均逗留时间:

Ws = 1/(μ-λ)=1h

病人平均等候时间:

Wq=Wsρ=1*0.75h=0.75h

MM1程序代码

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
        
        2009.1516
        
        %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;
        

 

M/M/S模型

此模型与M/M/1模型不同之处在于有S个服务台,各服务台的工作相互独立,服务率相等,如果顾客到达时,S个服务台都忙着,则排成一队等待,先到先服务的单队模型。

整个系统的平均服务率sμ,ρ*=λ/sμ(ρ*<1)为该系统的服务强度。

例题二

承接例1,假设医院增强急诊室的服务能力使其同时能诊治两个病人,且平均服务率相同,试分析该系统工作情况。

解 这相当于增加了一个服务台,故有:

S = 2,λ = 3人/h,μ = 4人/h

ρ=λ/μ = 0.75

ρ* = λ/Sμ = 3/2*4 = 0.375

P0=[1+0.75+0.75^2/2!(1-0.375)]^(-1) = 5/11 ≈ 0.45

image.png

MMS程序代码

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)
        

image.png

image.png