排队论入门学习 (for 数学建模)

排队论入门学习 (for 数学建模)

文字部分引用了很多浙大数学建模排队论ppt中的内容,本人做个总结和代码实现

为什么研究排队论?

研究排队问题,就是要把排队的时间控制到一定的程度内,在服务质量的提高和成本的降低之间取得平衡,找到最适当的解。

image

排队系统的组成:

1.输入过程: 输入过程是说明顾客按照怎样的规律到达系统,分为三个方面:

  • 顾客总数:有限与无限

  • 顾客到达的方式:单个或者成批

  • 顾客相继到达的时间间隔:确定型或者随机型

2.排队规则与服务规则:

  • 排队规则:损失制、等待制、混合制
  • 服务规则:先到先服务、后到先服务、随机服务、有优先权的服务

3.服务机构:

  • 服务台数量及结构形式:数量上服务台有单台和多台之分,结构形式上服务台有单队-单服务台式、多队-多服务并列式、单队-多服务台并列式、单队-多服务台串列式、多服务混合式
  • 服务方式:单个服务和成批服务
  • 服务时间:确定型和随机型

排队模型的分类

记X:顾客到达的时间间隔分布;Y:服务时间的分布;Z:服务台数。
则排队模型为:X/Y/Z。

常用的记号:M—负指数分布;D—确定型;Ek—k阶Erlang分布;GI—一般相互独立的随机分布;G—一般随机分布。这里主要讨论M/M/1,/M/M/C。

泊松流与指数分布

设x(t)为时间[0,t]内流事件发生的次数。例如[0,t]时间内到来的顾客数,[0,t]时间内服务台收到呼叫的此时。那么我们一般假定x(t)满足泊松过程,也称为poisson流或最简单流,表示[0,t]时间内事件发生次数为k次的概率服从泊松分布:

\(P( x(t)=k ) = \frac{(\lambda k)^k}{k!}e^{-\lambda t} \)

其中参数\(\lambda\)表示单位时间内事件发生次数的平均数。

当流过程为泊松过程时,设流发生的时刻依次为t1,t2,…tn,发生时间的间隔记为dn=tn - tn-1 (n=1,2,…),其中t0=0。

定理: 事件流x(t)为泊松流的充要条件是x(t)流发生的时间间隔dn相互独立,且服从相同的负指数分布,即

image

(负)指数分布满足以下性质:

\(P(T<=t0+x | T>=t0)=P(T<=x) \)

如果把T解释为寿命,上式表名:如果已知年龄大于t0岁,则再活x年的概率与以前的t0无关。所以有时又风趣地称指数分布是“永远年轻”。

请看下面例题(来自另一份ppt):

image

image

排队系统的运行指标:

  1. 绝对通过能力A:单位时间内被服务被服务顾客的数学期望

  2. 相对通过能力Q:被服务顾客的顾客数与请求服务顾客的顾客数的比值

  3. 系统损失概率\(P_损\):服务系统满员的概率

  4. 队长\(L_系\):系统内顾客数量的数学期望值

  5. 排队长\(L_队\):系统内排队顾客数的数学期望值

  6. 逗留时间\(W_系\):顾客在系统内逗留时间的数学期望值

  7. 排队时间\(W_队\):系统内顾客排队等待服务时间的数学期望

损失制排队模型

  • 多通道损失制系统
  • 单通道损失制系统

下面以多通道损失制系统为例

设系统内有n个服务员,顾客来到服务系统时如果服务员正在忙,顾客不能立即得到服务,则顾客离去。

案例1:

某电话总机有3条中继线,平均每分钟有0.8次呼唤。如果每次通话时间平均为1.5分钟,试求:系统状态的极限概率;绝对通过能力和相对通过能力;损失概率和占用通道的平均数。

原理分析:

image
解释一下,这里\(\mu\)是1.5的倒数。

#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 1007;
double jc(int k) { //阶乘
    double ans = 1;
    for (int i = 2; i <= k; i++) {
        ans *= i;
    }
    return ans;
}
int main() {
    double n = 3, lamda = 0.8, u = 0.667;
    double miu = lamda / u;
    double p0 = 1, cur = 0;
    for (int i = 0; i <= n; i++) {
        cur += pow(miu, i) / jc(i);
    }
    p0 /= cur;
    double p_sun = pow(miu, n) * p0 / jc(n);
    double Q = 1 - p_sun;
    double A = lamda * Q;
    double K = miu * (1 - p_sun);
    double zyl = K / n;
    cout<<"-----输入各项参数:-----\n";
    cout<<"服务员个数:"<<n<<endl;
    cout<<"顾客流强度:"<<lamda<<endl;
    cout<<"服务台能力:"<<u<<endl;
    cout<<"-----系统效率指标:-----\n";
    cout<<"损失概率= "<<p_sun<<endl;
    cout<<"系统的相对通过能力= "<<Q<<endl;
    cout<<"系统的绝对通过能力= "<<A<<endl;
    cout<<"占用服务员的平均数= "<<K<<endl;
    cout<<"通道占用率= "<<zyl<<endl;
    return 0;
}

运行结果

-----输入各项参数:-----
服务员个数:3
顾客流强度:0.8
服务台能力:0.667
-----系统效率指标:-----
损失概率= 0.08969
系统的相对通过能力= 0.91031
系统的绝对通过能力= 0.728248
占用服务员的平均数= 1.09183
通道占用率= 0.363942

对於单通道损失制系统,只需将上面程序的n改成1即可。

等待制排队模型

  • 多通道等待制模型
  • 单通道等待制模型

下面以多通道等待制模型为例

设本系统顾客到达流为泊松流,其强度为\(\lambda\)。系统内有n个服务员,服务员具有相同服务时间且服从指数分布,其强度为\(\mu\)。当顾客到达时,如果服务员忙着,顾客排队等待服务,一直等到有服务员为他服务为止。

对于多通道等待制系统有:

\(p_0=1-\lambda\) (此处ppt上没说清楚,这个p0是猜测,待验证)
image

对於单通道等待制系统有:

image

案例2:

某临时假设的公路简便桥,桥上不容许同时又两辆汽车通过。若汽车到达流为泊松流,其强度为\(\lambda\)=2.1辆/分钟。通过时间为指数分布,平均每辆的通过时间为0.4分钟,试求系统的效率指标。

#include <cmath>
#include <iostream>
using namespace std;
const int maxn = 1007;
double jc(int k) { //阶乘
    double ans = 1;
    for (int i = 2; i <= k; i++) {
        ans *= i;
    }
    return ans;
}
int main() {
    double n = 1, lamda = 2.1, u = 2.5;
    double miu = lamda / u;
    double p0 = 1-miu;
    double p_sun = 0;
    double Q = 1 - p_sun;
    double A = lamda * Q;
    double L_dui = pow(miu, n + 1) *p0 / (n * jc(n)) ;
    L_dui /= (1 - miu / n) * (1 - miu / n);
    double W_dui = L_dui / lamda;
    double K = miu * (1 - p_sun);
    double L_xi = L_dui + miu;
    double W_xi = L_xi/lamda;
    cout << "-----输入各项参数:-----\n";
    cout << "服务员个数:" << n << endl;
    cout << "顾客流强度:" << lamda << endl;
    cout << "服务台能力:" << u << endl;
    cout << "-----系统效率指标:-----\n";
    cout << "损失概率= " << p_sun << endl;
    cout << "系统的相对通过能力= " << Q << endl;
    cout << "系统的绝对通过能力= " << A << endl;
    cout << "系统内排队顾客的平均数= " << L_dui << endl;
    cout << "顾客的平均排队时间= " << W_dui << endl;
    cout << "占用服务员的平均数= " << K << endl;
    cout << "系统内顾客的平均数= " << L_xi << endl;
    cout << "顾客在系统中平均逗留时间= " << W_xi << endl;
    return 0;
}

运行结果如下:

-----输入各项参数:-----
服务员个数:1
顾客流强度:2.1
服务台能力:2.5
-----系统效率指标:-----
损失概率= 0
系统的相对通过能力= 1
系统的绝对通过能力= 2.1
系统内排队顾客的平均数= 4.41
顾客的平均排队时间= 2.1
占用服务员的平均数= 0.84
系统内顾客的平均数= 5.25
顾客在系统中平均逗留时间= 2.5
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章