排队论

排队论

应用

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

背景

排队论发源于上世纪初。当时美国贝尔电话公司发明了自动电话,以适应日益繁忙的工商业电话通讯需要。这个新发明带来了一个新问题,即通话线路与电话用户呼叫的数量关系应如何妥善解决,这个问题久久未能解决。1909 年,丹麦的哥本哈根电话公司 A.K. 埃尔浪( ( Erlang) ) 在热力学统计平衡概念的启发下解决了这个问题。

排队系统

  • 顾客进入的过程
  • 排队规则
  • 服务规则

顾客的输入过程

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

排队规则

  1. 顾客排队方式:等待制 | 即时制(损失制)
  2. 排队系统容量:有限制 | 无限制
  3. 排队队列数目:单列 | 多列
  4. 是否中途退出:允许 | 禁止
  5. 是否列间转移:允许 | 禁止(仅研究禁止退出和转移的情形)

服务规则

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

原理

不想打了,参考这篇文章

python代码

看到网上有关数学建模的代码都是matlab的,然鹅并不会,凭借自己垃圾的python水平尝试改成python的,也希望大神指点指点

# 排队论

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['figure.dpi'] = 100

total_time = 10  # 总时间
N = 10000000000  # 最大队列长度
# 到达率与服务率
lambd = 10
mu = 6

arr_mean = 1/lambd
ser_mean = 1/mu
arr_num = round(total_time*lambd*2)

# 按负指数分布产生各顾客达到时间间隔
customer_time = np.random.exponential(arr_mean, arr_num)
# 各顾客的到达时刻等于时间间隔的累积和
customer_time = np.array(np.cumsum(customer_time))
# 按负指数分布产生各顾客服务时间 
serve_time = np.random.exponential(ser_mean, arr_num)
customer_num = np.sum(customer_time <= total_time)

# 计算第 1个顾客的信息
wait_time = np.zeros(customer_num)
wait_time[0] = 0
# 其离开时刻等于其到达时刻与服务时间之和 
all_time = np.zeros(customer_num)
all_time[0]= customer_time[0] + wait_time[0]
# 此时系统内共有
system_customer = np.zeros(customer_num)
system_customer[0] = 1
member = [0]

for i in range(1, arr_num):
    # 如果第 i个顾客的到达时间超过了仿真时间,则跳出循环
    if customer_time[i] > total_time:
        break
    else:
        for j in member:
            if all_time[j] > customer_time[i]:
                number = number + 1
        # 系统已满
        if number >= N+1:
            system_customer[i] = 0
        # 系统未满
        else:
            if number == 0:
                wait_time[i] = 0
                all_time[i] = customer_time[i] + serve_time[i]
                system_customer[i] = 1
                member.append(i)
            else:
                len_men = len(member)
                wait_time[i] = all_time[member[len_men-1]] - customer_time[i]
                all_time[i] = all_time[member[len_men-1]] + serve_time[i]
                system_customer[i] = number + 1
                member.append(i)

len_men = len(member)

# 绘图
y = np.arange(0, len_men, 1)
plt.plot(customer_time[0:len_men], y, 'b', label='arrive time')
plt.plot(all_time, y, 'r4--', label='leave time')
plt.legend()
plt.grid()
plt.show()
plt.plot(wait_time,'y', label='wait time')
plt.plot(serve_time[0:len_men] + wait_time, 'g4--', label='stop time')
plt.legend()
plt.grid()
plt.show()

结果如下
在这里插入图片描述
在这里插入图片描述