排队论
应用
排队论的研究,就是要把排队的时间控制到一定的程度内,在服务质量的提高和成本的降低之间取得平衡,找到最适当的解。
背景
排队论发源于上世纪初。当时美国贝尔电话公司发明了自动电话,以适应日益繁忙的工商业电话通讯需要。这个新发明带来了一个新问题,即通话线路与电话用户呼叫的数量关系应如何妥善解决,这个问题久久未能解决。1909 年,丹麦的哥本哈根电话公司 A.K. 埃尔浪( ( Erlang) ) 在热力学统计平衡概念的启发下解决了这个问题。
排队系统
- 顾客进入的过程
- 排队规则
- 服务规则
顾客的输入过程
- 顾客源( ( 总体) ) :有限 | 无限
- 顾客到达方式:逐个 | 逐批(仅研究逐个情形)
- 顾客到达间隔:随机型 | 确定型
- 顾客前后到达是否独立:相互独立 | 相互关联
- 输入过程是否平稳:平稳 | 非平稳(仅研究平稳性)
排队规则
- 顾客排队方式:等待制 | 即时制(损失制)
- 排队系统容量:有限制 | 无限制
- 排队队列数目:单列 | 多列
- 是否中途退出:允许 | 禁止
- 是否列间转移:允许 | 禁止(仅研究禁止退出和转移的情形)
服务规则
- 服务台/员数目:单个 | 多个
- 服务台台/员排列形式:并列 | 串列 | 混合
- 服务台台/员服务方式:逐个 | 逐批(研究逐个情形)
- 服务时间分布:随机型 | 确定型;
- 服务时间分布是否平稳:平稳 | 非平稳(研究平稳情形)
原理
不想打了,参考这篇文章
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()
结果如下