各种经典排队论模型代码

本文最后更新于 2025年1月16日 下午

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import math

def mm1_model(lamb_da, miu, n=0):
rou = lamb_da / miu
W_s = 1 / (miu - lamb_da)
W_q = rou / (miu - lamb_da)
L_s = lamb_da * W_s
L_q = lamb_da * W_q
P_n = (1-rou)*(rou**n)
return {
'服务强度': rou,
'平均队长': L_s,
'平均队列长': L_q,
'平均逗留时间': W_s,
'平均等待时间': W_q,
f'系统稳定有{n}个顾客的概率':P_n
}
def mm1N_model(lamb_da, miu, N, n=0):
'''
损失制:当顾客到达时,队列达到N,顾客随即离去。
'''
rou = lamb_da / miu
P_N = (1-rou)*(rou**N)/(1-rou**(N+1))
lamb_da_e = lamb_da*(1-P_N)
rou_e = lamb_da_e / miu
L_s = 1/(1-rou) - ((N+1)*rou**(N+1))/(1-rou**(N+1))
L_q = L_s - rou_e
W_s = L_s/lamb_da_e
W_q = L_q/lamb_da_e
P_n = (1-rou)*(rou**n)/(1-rou**(N+1))
return {
'有效服务强度': rou_e,
'平均队长': L_s,
'平均队列长': L_q,
'平均逗留时间': W_s,
'平均等待时间': W_q,
f'系统稳定有{n}个顾客的概率':P_n
}
def mm1_m_model(lamb_da, miu, m, n=0):
'''
这里的lamb_da定义为每个顾客的到达率
'''
rou = lamb_da / miu
P_0 = 1/sum(math.factorial(m)/math.factorial(m-i)*rou**i
for i in range(0,m+1))
W_s = m/(miu*(1-P_0)) - 1/lamb_da
W_q = W_s - 1/miu
L_s = m - (miu/lamb_da)*(1-P_0)
L_q = L_s - (1-P_0)
if n == 0:
P_n = P_0
else:
P_n = math.factorial(m)/math.factorial(m-n)*rou**n * P_0
return {
'服务强度': rou,
'平均队长': L_s,
'平均队列长': L_q,
'平均逗留时间': W_s,
'平均等待时间': W_q,
f'系统稳定有{n}个顾客的概率':P_n
}
def mmc_model(lamb_da, miu, c, n=0):
rou = lamb_da / (miu*c)
P_0 = 1/(sum(1/math.factorial(i)*(rou*c)**i
for i in range(0,c-1))
+1/(math.factorial(c)*(1-rou))*(rou*c)**c)
L_q = P_0*(rou*c)**c*rou/(math.factorial(c)*(1+rou)**2)
L_s = L_q + rou*c
W_s = L_s / lamb_da
W_q = L_q / lamb_da
if n == 0:
P_n = P_0
elif n<=c:
P_n = P_0*(rou*c)**n / math.factorial(n)
else:
P_n = P_0*(rou*c)**n / (math.factorial(c)*c**(n-c))
return {
'服务强度': rou,
'平均队长': L_s,
'平均队列长': L_q,
'平均逗留时间': W_s,
'平均等待时间': W_q,
f'系统稳定有{n}个顾客的概率':P_n
}
def mmcN_model(lamb_da, miu, c, N, n=0):
rou = lamb_da / (miu*c)
if rou == 1:
P_0 = sum(c**i/math.factorial(i) for i in range(0,c))\
+(N-c+1)*c**c/math.factorial(c)
else:
P_0 =1/(sum(c*rou**i/math.factorial(i) for i in range(0,c))\
+(rou*(rou**c-rou**N)/(1-rou))*c**c/math.factorial(c))
if n<=c:
P_n = P_0*(rou*c)**n / math.factorial(n)
elif n>c and n<=N:
P_n = P_0 * c**c * rou**n / math.factorial(c)
L_q = 0
P_N = P_0 * c**c * rou**N / math.factorial(c)
for i in range(1,N-c+1):
L_q += i*P_N
L_s = L_q + rou*c*(1-P_N)
W_q = L_q / (lamb_da*(1-P_N))
W_s = W_q + 1/miu
return {
'服务强度': rou,
'平均队长': L_s,
'平均队列长': L_q,
'平均逗留时间': W_s,
'平均等待时间': W_q,
f'系统稳定有{n}个顾客的概率': P_n
}
def mmc_m_model(lamb_da, miu, c, m, n=0):
'''
n应该要大于c,不然概率可能大于1.
因为有时每个服务台都会有人。
'''
rou = m*lamb_da / (miu*c)
P_0 =1/((sum((c*rou/m)**i/(math.factorial(i)*math.factorial(m-i)) for i in range(0,c+1))\
+sum(c**c*(rou/m)**i/(math.factorial(m-i)*math.factorial(c)) for i in range(0,c+1)))\
*math.factorial(m))
def P(P_0, lamb_da, miu, c, m, n=0):
if n<=c:
P_n = (P_0*((lamb_da/miu)**n)*math.factorial(m) /
(math.factorial(n)*math.factorial(m-n)))
elif n>c and n<=m:
P_n = (P_0*(lamb_da/miu)**n*math.factorial(m) /
(math.factorial(c)*math.factorial(m-n)*c**(n-c)))
return P_n
P_n = P(P_0, lamb_da, miu, c, m, n)
L_q = sum(i*P(P_0, lamb_da, miu, c, m, i) for i in range(1,m-c+1))
L_s = sum(i*P(P_0, lamb_da, miu, c, m, i) for i in range(1,m+1))
lamb_da_e = lamb_da * (m-L_s)
W_s = L_s/lamb_da_e
W_q = L_q/lamb_da_e
return {
'服务强度': rou,
'平均队长': L_s,
'平均队列长': L_q,
'平均逗留时间': W_s,
'平均等待时间': W_q,
f'系统稳定有{n}个顾客的概率': P_n
}
# 输入模拟参数
lamb_da = 0.8 # 平均到达速率
miu = 0.6 # 平均服务速率
c = 10 # 服务台数量 ,需要小于m
N = 5 # 队列(排队)容量
m = 10 # 顾客源总数

results = mmc_m_model(lamb_da, miu, c, m, 5)
for key, value in results.items():
print(f"{key}: {value:.6f}")


各种经典排队论模型代码
https://jimes.cn/2024/09/11/排队论模型代码/
作者
Jimes
发布于
2024年9月11日
许可协议