排队论基础
本文是在笔者学习分组交换原理中的排队模型时,发现这里涉及到许多概率论知识,比如泊松过程等等,但是似乎我们学校的概率论教材在这方面讲述并不详细,于是自己学了一下这里的东西。
前置知识有微积分、泰勒级数、二项分布、连续型随机变量、数学期望、条件概率、全概率公式、贝叶斯定理……(基本上是需要基本掌握大学工科概率论、微积分、线性代数的水平,不过写的时候会尽量降低标准,尽量让高中生把除了需要用到高等数学相关知识的证明的其他内容看懂)
1. 泊松过程
1.1 二项分布
在高中,我们就已经接触了二项分布,这里就不赘述其相关结论的证明过程了。
令随机变量 \(X\) 表明在 \(n\) 次彼此独立的伯努利实验(即只有成功和失败两种结果的实验)中成功的次数,其中每次伯努利实验的成功概率均为 \(p\),则可称变量 \(X\) 服从二项分布。记作 \(X \sim B(n, p)\)。
其中 \(X\) 的值为 \(k\,(0 \le k \le n, k \in \mathbf{Z})\) 的概率为(记作 \(b(k; n, p)\)):
\(X\) 的期望与方差:
1.2 泊松分布
在现实中,我们会遇到这样的问题:我们会希望预测某时刻一个路段的车流量来用于规划交通;在一场活动举办期间,我们也希望预测一天中各个时刻的入场和出场人数来规划哪些时刻需要限制人流,同时预测进场队伍会有多长等等。我们需要对以上问题进行数学建模。
我们就以车流量为例,显然我们可以考虑这样一个简单的数学模型:整个世界上的车有 \(n\) 辆,每辆车在一个特定时刻进入此路段的概率彼此独立,我们就简单的假设它们进入的概率也都相等,均为 \(p\)。那么我们可以把“每辆车在特定时刻是否进入这个路段”当作一次伯努利实验。那么我们如果设在特定时刻进入这个路段的车有 \(X\) 辆,那么显然 \(X \sim B(n, p)\)。
但是我们发现 \(n\) 非常大,趋近于无穷,计算起来比较麻烦。这时我们就需要考虑是不是可以采用极限,看看二项分布的极限形式是怎样的。
即我们希望求:
显然,直接取极限会导致极限不存在,我们考虑加条件。我们考虑这个二项分布的期望为 \(E(X) = np\),它在实际问题中的意义是该时刻路段期望有多少辆车(即车流量的一个平均情况)。虽然 \(n\) 趋于无穷大,但是车流量的平均情况至少并不可能是无穷大,所以我们可以让这个期望在 \(n\) 趋于无穷大时逐渐趋于一个定值。
由于上面的 \(p\) 是一个定值,所以从理论上讲,\(np\) 当 \(n\) 趋于正无穷时,应该也趋于无穷大,我们不能直接做出期望趋于定值的假设。但是我们可以考虑构造一个随机变量的无穷序列:\(X_n \sim B(n, p_n)\),然后令 \(n\) 逐渐趋于正无穷。这样随着 \(n\) 的增大,我们的 \(p_n\) 也可以变化,这时候我们就可以假设期望趋于定值了。
我们不妨设 \(\lambda_n = np_n\) 且 \(\lim_{n \rightarrow +\infty} \limits \lambda_n = \lambda\),这时我们就可以重新推导了:
由于 \(k\) 为常数,不难发现上面的极限的各个部分:
故最终结果为:
那么显然我们这时候我们可以将我们得到的这个极限重新定义为一个新的分布,叫做泊松分布。而泊松分布的参数也只有一个,那就是上文中说的 \(\lambda\),而在实际问题中其就代指一个平均的情况。
如果一个离散随机变量 \(X\) 服从泊松分布,则其记作 \(X \sim P(\lambda)\),而其分布列为:
而泊松分布的期望:
可见,泊松分布的期望就是 \(\lambda\), 与我们前面假设的一致,检验了我们对二项分布取极限的可行性。
而其方差:
对比二项分布的方差,发现其少乘了一个 \(1 - p\)。这也可以解释,因为:
所以在 \(n\) 趋于无穷时,\(1 - p_n\) 趋于 1。故最终方差只剩 \(\lambda\)。
1.3 泊松过程
我们把依赖参数 \(t\) 的一族随机变量称为随机过程,记为 \(\{X(t), t \in T\}\),其中 \(X(t)\) 是随机变量,\(T\) 叫做参数集。对于随机过程 \(\{X(t), t \in T\}\) 进行一次实验,可以得到一个函数 \(x(t), t \in T\),我们称这个函数为随机过程的一个样本函数。
接着上面的例子,由于每个时刻的车流量都是随机的,我们可以把一个特定路段从某个时刻开始计时的累计车流量当成一个随机过程 \(\{X(t), t \in [0, +\infty)\}\),即随机变量 \(X(t)\) 表明该路段在 \([0, t]\) 时段的累计车流量。
如果我们设这段时间段中单位时间的车流量为 \(\lambda\) 辆 / 单位时间(在实际问题中这个值是由实验得出的平均值,是平均情况),那么我们就可以根据上面我们对泊松分布的参数分析可知,由于在 \([0, t]\) 这段时间累计车流量的平均情况为 \(\lambda t\) 辆,这个随机过程的随机变量族的分布列为:
如果设随机变量 \(X(t, t + \tau)\) 表明该路段在 \([t, t + \tau]\) 时间段的累计车流量(即在任意一个长度为 \(\tau\) 的时间段内有多少车进入该路段),那么我们可以计算出这段时间累计车流量的平均情况为 \(\lambda \tau\) 辆。那么我们就可以知道这个随机变量的分布列为:
通过这个分析不难发现,对于一个泊松过程来说,对于任意两个在参数集中等长的时间段,它们的概率分布是相同的。
1.4 指数分布
我们现在转换一下视角来看这个车流量的例子。我们已经知道每单位时间平均会有 \(\lambda\) 辆车进入这个路段,我们现在想研究一下平均经过多长时间会有一辆车进入该路段,即从一辆车进入这个路段开始计时,再经过多长时间,会再有一辆车进入该路段?我们将这个时间称之为到达间隔。
显然这是一个随机分布的问题,我们设 \(Y\) 表明这个到达间隔。显然这是一个连续型随机变量,我们希望求出其分布函数 \(F(y)\)。显然到达间隔不可能为负数,所以当 \(y < 0\) 时, \(F(y) = 0\)。当 \(y \ge 0\)时,考虑 \(F(y)\) 的含义,\(F(y)\) 即在长度为 \(y\) 的时间段内至少到达了一辆车的概率。由刚才推导的泊松过程的相关结论,我们可以得知:
这样我们就求出了其分布函数,再由分布函数求出其概率密度函数:
如果再把 \(y < 0\) 的部分合并进来即:
我们将这样的分布叫做服从参数 \(\lambda\) 的指数分布,记作 \(Y \sim E(\lambda)\)。从理论上来讲单位时间平均车流量为 \(\lambda\),那么平均每 \(\frac{1}{\lambda}\) 的时间就会有一辆车进入该路段,我们看看求指数分布的期望会不会也得到同样的结果。
我们得到了同样的结果,这也检验了我们假设和推导的正确性。
我们下面来研究指数分布的一些性质,我们现在来看这样的问题,如果有一辆车进入该路段过了时间 \(t\),仍然没有其他车再进入该路段,求再经过时间 \(h\),还是没有其他车进入该路段的概率:
不难发现,无论之前过了多长时间没有来车,最终没有来车的概率只与 \(h\) 有关,且等于过了时间 \(h\) 仍然没有车进入该路段的概率。所以过去保持没有来车的状态的时间与没有来车这个状态还会保持多长时间是无关的,我们将这种性质称为指数分布的无记忆性。
我们后面可能会遇到过了一个非常小的时间段,系统状态发生改变的概率,也即 \(P\{Y \le t + h | Y > t\}\)。显然由无记忆性,我们可以知道其等于 \(P\{Y \le h\}\),即 \(F(h)\)。而 \(F(h)\) 的表达式中有指数运算,通常不便计算,而当 \(h\) 很小的时候,我们会用其泰勒展开来对其进行近似,即:
其中 \(o(h)\) 为 \(h\) 的高阶无穷小量,由于根据高阶无穷小的定义,\(-o(h)\) 同样也是 \(h\) 的高阶无穷小,所以我们可以任意调整高阶无穷小量前面的符号。
2. 马尔可夫链
2.1 马尔可夫链的定义
马尔可夫链也是一类随机过程,如果一个随机过程 \(\{X(t), t \in \mathbf{N}\}\) 中,所有随机变量的取值均在一个集合 \(S\) 中,且状态之间的转移无后效性,即对于任意的 \(t\) 总有:
那么我们就称该随机过程是一个马尔可夫链。上面我们介绍的是状态集是离散的的情况,如果状态集为连续的,那么我们把这样的随机过程称为马尔可夫过程。
我们将 \(S\) 称为马尔可夫链的状态集。我们可以将马尔可夫链看成是一个在状态图上随机游走的随机过程。在实际生活中有许多这样的例子,比如天气旧可以看作是若干个不同的天气之间随机相互转换。
对于无后效性,简单概括即在任意时刻进入状态 \(x\) 的概率的值,仅与其在上一时刻所在的状态有关,且对于任意两个状态 \(x, y \in S\),由状态 \(x\) 进入状态 \(y\) 的概率是不随时间改变而改变的。所以我们只需要知道对于任意的 \(x, y \in S\),\(P\{X(t) = x | X(t - 1) = y\}\) 的值,即可表示出来这个马尔可夫链。
我们通常会用一个转移矩阵 \(P\) 来表示,其中 \(p_{ij}\) 即为 \(P\{X(t) = j | X(t - 1) = i\}\)。
2.2 马尔可夫链的稳态
我们在研究实际问题的过程中,我们最终总是希望确定一个随机过程,系统停留在各个状态的概率。所以我们可以定义 \(\pi_i\) 为系统稳定在状态 \(i\) 的概率。但是这个定义显然不够严谨,因为状态总是在变化,我们总是在马尔可夫链上游走,怎么描述“稳定”这样的事情呢?
我们可以从中心极限定理中受到启发,即如果我们走足够多步,到达某个状态的概率,应该就可以当成系统最终会“稳定”在这个状态的概率。即定义:
我们将 \(\pi_i\,(1 \le i \le \left\vert S \right\vert)\) 这 \(\left\vert S \right\vert\) 个变量组成的 \(1 \times \left\vert S \right\vert\) 的矩阵称为马尔可夫链的平稳分布,记作 \(\pi\)。
我们考虑如何求解 \(\pi_i\),由全概率公式可知:
即:
我们再加上一个 \(\sum_{i \in S} \pi_i = 1\) 的额外方程,最终得到由这 \(\left\vert S \right\vert + 1\) 个方程组成的方程组(其中未添加额外方程的方程组的矩阵形式为 \(\pi P = \pi\))。我们可以判断出这 \(\left\vert S \right\vert\) 个未知量是否有唯一解。如果有唯一解,那么我们就称马尔可夫链的平稳分布存在,反之亦然。
不难发现我们可以通过全概率公式列出另一个式子:
由条件概率的定义可知:
故刚才的式子可以化为:
即:
所以我们有:
考虑这个式子的意义,左边是转移进入状态 \(i\) 的概率,右边是从状态 \(i\) 转移出的概率。故在马尔可夫链中从一个状态转出的概率等于转入该状态的概率。我们管这个方程叫做全局平衡方程。
3. 排队论
3.1 排队模型
在日常生活中我们总是能遇到排队的问题。在网络中,数据包经路由器逐跳传输,由于一个路由器可能会在很短的时间内收到多个数据包需要其转发,而路由器只能将这些数据包一个个发过去,那么其他数据包就必须在路由器的缓存中进行排队。由于我们希望每个数据包在路由器中的等待时间尽可能少,同时由于路由器的缓存有限,当路由器缓存满的时候会将新收到的数据包直接丢弃,我们也希望减少丢包的概率,所以我们需要研究排队模型。
通常我们的队列都是“先进先出”,上图就是这个模型的图示。我们就以路由器发送数据包为例,中间是路由器的缓存,左侧表明一个单位时间内平均会进入 \(\lambda\) 个数据包(到达速度),右侧表明一个单位时间内平均有 \(\mu\) 个数据包被发送出去(离开速度)。
我们定义 \(\rho = \frac{\lambda}{\mu}\) 为这个队列的链路利用率。我们做出这个定义的意义很显然,就是看路由器平均每单位时间可以发出 \(\mu\) 个数据包的性能可以被占用多少。显然 \(\lambda < \mu\) 即 \(\rho < 1\),否则队列中队尾的数据包将永远无法被发出。
我们定义一个数据包的时延 \(D\) 为这个数据包进入到缓存中后到数据包被全部发出的时间。
3.2 M/M/1 模型
排队模型有多种,我们现在介绍的是 M/M/1 模型,即我们认为数据包到达和发出的过程是参数分别为 \(\lambda\) 和 \(\mu\) 的泊松过程,且到达和发出的概率是彼此独立的。路由器有无限缓存,只有一个出口和一个队列。
我们不难发现在 \(t\) 时刻缓存中的数据包个数 \(N(t)\) 可以作为一个随机过程来看。而缓存中数据包的个数就可以当作状态,而状态之间的转移与当前缓存内数据包的个数,新数据包达到的时间间隔,数据包被发送出去的时间间隔分布有关。而由于泊松过程和指数分布的无记忆性,导致整个过程是无后效性的,故这个随机过程 \(\{N(t), t \ge 0\}\) 应为一个马尔可夫过程。
但是这时候的状态集是连续的,我们不好处理,所以我们考虑将连续的状态集等分成无穷多个长度为任意小的 \(\delta\) 的时间段。为了方便接下来的表达,我们记 \(N_k = N(k \delta)\)。
为了方便讨论,我们分别用 \(X(t, t + \delta), Y(t, t + \delta)\) 表明 \([t, t + \delta]\) 这个时间段队列中到达和出发的人数。
既然确定其为马尔可夫链,那么我们现在就要求出马尔可夫链的转移矩阵,即求 \(p_{ij}\)(\(P\{N_{k + 1} = j | N_k = i\}\))。
在正式讨论开始前,我们先来看一下如果在 \([t, t + \delta]\) 的时间内队列中的数据包到达了 \(n\) 个, 发出了 \(m\) 个,这时的概率:
当 \(n, m\) 为正整数且 \(n + m > 1\) 时,显然这个概率就是 \(\delta\) 的高阶无穷小。
不难发现队列中没有数据包的状态是特殊状态,因为这种状态时,队列中的数据包不能减少。那我们考虑分情况讨论:(下面的 \(m\) 均为正整数)
- 当 \(i = 0, j = 1\) 时
- 当 \(i = 0, j > 1\) 时
- 当 \(i > 0, j = i + 1\) 时
- 当 \(i > 0, j > i + 1\) 时
- 当 \(i > 0, j = i - 1\) 时
- 当 \(i > 0, j < i - 1\) 时
- 当 \(i = j = 0\) 时
- 当 \(i = j, i > 0\) 时
上面的公式推导的时候将高阶无穷小之间进行了合并,如果对推导过程不理解,请去参考微积分相关资料上的定义,并自行证明。注意这里 \(\delta\) 是趋于 0 的,可以认为所有式子中都有 \(\lim_{\delta \rightarrow 0} \limits\) 的前缀。
所以合并一下情况就是:
当 \(\delta\) 足够小的时候,\(o(\delta)\) 可忽略不计,故我们完全可以将转移矩阵重写为:
下面我们考虑求解其平稳概率。我们列出其全局平衡方程:
通过第一个式子,我们可以将下面的式子进行变形,例如:
即可得到 \(\lambda \delta \pi_1 = \mu \delta \pi_2\),同样,由这个式子我们还可以对第 3 个式子进行变形,以此类推,我们可以得到 \(\pi_{n + 1} = \frac{\lambda}{\mu} \pi_n\) 的结论。显然这是一个等比数列,若设 \(\rho = \frac{\lambda}{\mu}\),其通项为 \(\pi_n = \rho^n \pi_0\)。
我们可以根据 \(\sum_{i=0}^{\infty} \pi_i = 1\) 得到 \(\frac{\pi_0}{1 - \rho} = 1\),即 \(\pi_0 = 1 - \rho\)。
考虑 \(\pi_0\) 的意义,即队列为空的概率,数据包到达时不需要等待的概率。而 \(\rho\) 就是我们前面定义的链路利用率。
而 M/M/1 队列的平均队长为:
系统中人数大于 \(n\) 的概率:
3.3 Kendall 记法
所有排队模型通常都用 Kendall 记法表示。上文中 M/M/1 就是使用了这种记法。这个记法的格式为:A/S/c/K/N/D
这几个字母的意义为:
A:进入队列的人的概率分布
S:服务员服务速度的概率分布
c:服务员的数量
K:队列容量(缺省默认为无穷大)
N:顾客数量(缺省默认为无穷大)
D:队列优先顺序(缺省默认为先进先出)
对于可以填写概率分布的选项可以填写一下几种:
M:马尔可夫过程(泊松过程);
D:定长输入;
\(E_k\):\(k\) 阶埃尔朗分布;
G:一般相互独立的随机分布。
所以 M/M/1 就代表着到达速度和服务速度都是泊松过程,有一个服务员,队列和顾客数量均为无穷大,队列优先顺序为先进先出的队列模型。
3.4 Little 定理
我们在章节开头提出了数据包(排队)时延的概念,也即数据包在队列中的等待时间。现在我们希望知道平均时延 \(D\) 和数据包进入队列的平均速度 \(\lambda\) 与队列平均长度 \(N\) 有什么关系。
John Little 提出了一个定理,表明了这三者的关系,即在一个稳定的排队模型中,我们有:
这个式子很符合直觉,毕竟队列中平均每单位时间进入 \(\lambda\) 个人,平均每个人会在队列里等待的时间为 \(D\),那么最终队列平均长度 \(N\) 就应该是 \(\lambda D\)。
我们来证明一下:
设 \(N(t)\) 为队列在 \(t\) 时刻的长度,\(\alpha(t)\) 为队列在 \(t\) 时刻及之前的累计到达人数,\(\beta(t)\) 为队列在 \(t\) 时刻及之前累计离开人数,\(D_i\) 表明进入队列的第 \(i\) 个人在队列中的等待时间。请注意这里 \(\alpha(t), \beta(t), N(t)\) 均为阶梯函数,有有限个第一类间断点。
首先我们考虑 \(\int_{0}^T N(t) dt\) 的意义,不难发现由于 \(N(t) \Delta t\) 的意义是队列中的人在 \([t + \Delta t, \Delta t]\) 这段时间的累计等待时间之和(由于 \(\Delta t\) 趋于 0,而 \(N(t)\) 只有有限个第一类间断点,故函数跳变引起的误差可以忽略),而积分将这些累计等待时间加在一起,就是截至 \(T\) 时刻,\([0, T]\) 这段时间内队列中所有人的累计等待时间之和。
那么我们可以知道,对于 \(t\) 时刻前所有已经出队列的人,他们的累计等待时间之和一定不会超过 \(N(t)\);而对于 \(t\) 时刻前所有进入队列的人,他们的累计等待时间之和一定不比 \(N(t)\) 少。这都是因为在 \(T\) 时刻,可能仍然会有人留在队列当中。
那么我们就得到了:
我们稍微给两头式子变一下型后,再将整个不等式除一个 \(T\) 可得:
当排队模型保持稳态,即 \(T\) 趋于正无穷时,进入多少人就会离开多少人:
也正是因为此,快于队列进入速度的服务速度被较慢的进入速度限制,最终使得进入队列的人的平均速度应与离开队列的人的平均速度相等,即有:
故上方不等式两边当 \(T\) 趋于正无穷时极限均相等,由夹逼定理可知:
即证得 Little 定理。
不难发现 Little 定理并没有对到达过程的概率分布以及队列的优先顺序等给出限定,所以其是一个泛用性极高的定理。
3.5 M/M/1 排队系统的时延
有了 Little 定理,我们就可以计算出 M/M/1 排队系统的时延。
由于我们已经知道在 M/M/1 排队系统中,平均队长为 \(\frac{\lambda}{\mu - \lambda}\)。那么每个数据包在系统中平均停留时间为:
如果我们将排队系统中正在接受服务(正在被发出)的数据包不算在队列中等待的数据包,那我们就需要区分在整个系统中停留的时间和在系统队列中等待的时间,由于发出和进入是互相独立的且都是泊松过程,我们可以直接通过平均停留时间 \(D\) 求得平均等待时间 \(W\)。
而在队列中的平均数据包个数为: