赞
踩
注:当顾客平均到达率为常数
λ
\lambda
λ的到达间隔服从指数分布时,单位时间内到达的顾客数
k
k
k服从泊松分布,即单位时间内到达
k
k
k位顾客的概率为
P
k
=
λ
k
e
−
λ
k
!
P_k = \frac{\lambda^k e^{-\lambda }}{k!}
Pk=k!λke−λ
指数分布函数
F
(
x
;
λ
)
=
{
1
−
e
−
λ
x
,
x
≥
0
0
,
x
<
0
F(x;\lambda) =
期望值:
E ( x ) = 1 λ E(x) = \frac{1}{\lambda} E(x)=λ1
排队系统构成
系统设计过程中,将排队过程分为到达过程,排队过程,服务过程三部分。
到达过程
1)顾客到达间隔时间服从负指数分布。
2)顾客单个到来,且相互独立。
排队过程
1)顾客到达时 若所有服务台均被占用,则顾客均选择排队等候。
2)顾客发服务次序采取先到先服务的原则。
3)队列数为单列且有队长限制,顾客不会在排队过程中中途退出,但是顾客到达时若队列满则顾客会离开系统。
服务过程
1)服务机构为多服务台并联型(包括单服务台),各服务台独立为不同顾客提供服务。
2)服务采用先到先服务的原则,未设置服务优先级。
符号 | 含义 |
---|---|
S S S | 服务台个数上限(例:S=3,则分别输出服务台个数为1,2,3的系统性能) |
k k k | 等待队列上限 |
u u u | 顾客到达时间间隔均值 |
v v v | 顾客服务时间均值 |
T T T | 仿真终止时间 |
def initialize(): global num_in_q,num_record,sim_time,arrival_time_q,depart_time,begin_service_time,arrival_count,sim_time global lose_count,avg_wait_q,avg_wait_time,avg_stay_time,next_event_type,num_events,time_next_event,depart_time_q num_in_q = 0 #加油站车辆数 num_record = [] #记录仿真钟每一刻的加油站车辆数 sim_time = 0 #初始化仿真钟 #顾客属性 arrival_time_q = [] #所有顾客到达时间序列 depart_time_q = [] #所有顾客离开时间序列 depart_time = [float('inf')] #记录正在接受服务的车辆离开序列 begin_service_time = [] #服务开始时间序列 arrival_count = 0 #到达顾客数 lose_count = 0 #损失顾客数 avg_wait_q = 0 #平均等待队长 avg_wait_time = 0 #平均等待时间 avg_stay_time = 0 #平均逗留时间 next_event_type = 2 #下一事件类型 num_events = [0,1] #事件类型,0表示到达,1表示离去 time_next_event = [0]*2 time_next_event[0] = sim_time #初始化第位顾客0时刻到达 time_next_event[1] = float('inf')#离开时间置为无穷大,后期随机生成
def timing():
'''
推进仿真钟,判断下一事件类型
'''
global sim_time,next_event_type,time_next_event,depart_time
time_next_event[1] = min(depart_time)
sim_time = min(time_next_event) #推进仿真钟
next_event_type = time_next_event.index(sim_time) #判断下一事件类型
if next_event_type == 1: #如果下一事件为离开事件则从临时离开事件表中删除该事件的时间
depart_time.remove(time_next_event[1])
def arrive(s,k,u,v): ''' 推进事件的到达 ''' global arrival_time_q,arrival_count,time_next_event,begin_service_time global num_in_q,lose_count,depart_time,num_record arrival_time_q.append(sim_time) #记录到达事件 arrival_count += 1 #累加到达顾客数 #生成下一顾客到达事件 time_next_event[0] = sim_time + np.random.exponential(u)#到达时间间隔为均值为u的指数分布随机数 #分析到达事件对系统状态的影响 if num_in_q < s: #有服务台空闲 num_in_q += 1 #更新队列人数 num_record.append(num_in_q) #记录系统内的人数 begin_service_time.append(sim_time) #记录服务开始的时间 #产生新的顾客离开事件 service_time = np.random.exponential(v) #生成该事件的服务时间为均值为v的指数分布随机数 depart_time.append(sim_time + service_time) #添加到离开事件列表 elif num_in_q < s + k :#所有服务台忙,但排队的人还未满 num_in_q += 1 #更新顾客数 num_record.append(num_in_q) #记录系统内的人数 else: lose_count += 1 #如果队列满了则该客户会选择其他的加油站,此时要删除该事件的到达时间 arrival_time_q.pop()
def depart(s,v):
'''
推进事件的离开
'''
global depart_time_q,num_in_q,begin_service_time,depart_time,num_record
#安排下一离开事件
if num_in_q > s :
begin_service_time.append(sim_time) #记录服务开始时间
service_time = np.random.exponential(v) #生成服务时间
depart_time.append(sim_time + service_time) #记录该事件的离开时间
#记录当前离开事件
num_in_q -= 1 #更新并记录系统中的顾客数
num_record.append(num_in_q)
depart_time_q.append(sim_time) #记录顾客的离开时间
def update(s):
'''
更新系统指标
'''
global avg_wait_time,lose_count,record,avg_num_in_q
end_service_num = len(depart_time_q) #已结束服务顾客数
#平均等待时间
avg_wait_time = np.mean(np.array(begin_service_time[0:end_service_num]) - np.array(arrival_time_q[0:end_service_num]))
#平均等待队列人数(这里用的仿真时间为在设置的仿真结束时间前最后一位顾客的离开时间)
avg_num_in_q = avg_wait_time * end_service_num / depart_time_q[-1]
#工作台利用率
use_ratio = sum(np.array(depart_time_q) - np.array(begin_service_time[0:end_service_num]))/(s * depart_time_q[-1])
record = [avg_num_in_q,avg_wait_time,lose_count,use_ratio]
return record
def main(S,k,u,v,T) :
'''
S:输入服务台个数,k:队列上限,u:到达时间间隔均值,v:服务时间均值,T:仿真结束时间
输出各项指标:平均队列人数,平均等待时间,损失顾客数,工作台利用率
'''
global record_s
for s in range(1,S + 1):
initialize()
while sim_time <= T :
timing() #判断事件类型
if next_event_type == 0 :
arrive(s,k,u,v)
else:
depart(s,v)
record_s.append(update(s)) #仿真结束计算统计计数
分析:
分析:
分析:
分析:
是否需要更多的工作台则需要根据服务中心所处地理位置的顾客流量来决定。若顾客流量很大(意味着在仿真系统中的顾客到达间隔时间 u u u就越小),就很有必要再新增新的工作台。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。