银行有n个窗口,总服务时间为ServTime(这两者也是所需输入的参数);
每时刻都有一定概率会到达一名顾客,且顾客的所需服务时间随机生成——本文假设顾客所需服务时间范围为[1,20);
顾客会选择目前等待时间总和最短的队列进行排入。
每过一个时刻,(若该队列不为空)则队头的顾客所需服务时间-1。当其时间为0时,出队。
【给大家po个视频讲解:银行排队问题之代码讲解】
设计思路:该问题的设计思路如下图所示:
(1)遍历整个ServTime,对每个时刻来说,首先判断此刻是否有顾客到来。
(2)若此刻没有顾客来,那么无需安排顾客排队。若此刻有顾客来,那么查看每个窗口是否有空队列。若有空队列,则让顾客加入;若无,则查看哪个窗口的等待总时间最短,并安排顾客在此队列入队。
(3)最后,每个队队头的顾客的服务时间都要-1。若有顾客的时间变为0,则让其出队。
import random
#队列实现
class Queue(object):
"""队列"""
def __init__(self):
self.items = []
def is_empty(self):
return self.items == []
def enqueue(self, item):
"""进队列"""
self.items.append(item)
def dequeue(self):
"""出队列"""
return self.items.pop(0)
def size(self):
"""返回大小"""
return len(self.items)
def get_head(self):
if self.is_empty():
return False
else:
return self.items[0]
def travle(self):
return self.items
class Customer:
def __init__(self, w=-1, t=-1):
self.window = w #顾客应当排在第几窗口
self.time = t #顾客所需要的服务时间
def __str__(self):
return f"leave from window: {self.window}"
# 找出目前等待总时间最短的窗口号码
def bestWindow(windows, nWin):
"""返回最合适的窗口号"""
min_sum = 10000000000
min_win = 10000000000
for i in range(nWin):
if windows[i].is_empty():
return i
else:
list = [j.time for j in windows[i].travle()]
sum = 0
for k in list:
sum = sum + k
if sum < min_sum:
min_sum = sum
min_win = i
return min_win
#模拟函数
def simulate(nWin: int, servTime: int):
windows = [Queue() for _ in range(nWin)] # 生成一个有n个链队列的列表,即每个链队列都是每个窗口的队列
for now in range(servTime): # 遍历每一个时刻
print("现在是第",now,"时刻")
if random.randint(0,1):
print("有顾客来了!")
bsetWin = bestWindow(windows,nWin)
a = random.randint(1, 20) #这里假设顾客的所需服务时间为[1,20)
customer = Customer(bsetWin,a)
windows[bsetWin].enqueue(customer)
print("TA的窗口是%s,TA所需服务时间是%s"%(bsetWin,a))
print("第%s个客人到第%s个窗口排队中..."%(now,bsetWin))
else:
print("此刻没有客人来!")
for i in range(nWin):
if not windows[i].is_empty():
if windows[i].get_head().time == 0:
windows[i].dequeue()
print("第%s个窗口的客人已经离开" % (i))
else:
windows[i].get_head().time = windows[i].get_head().time-1
for i in range(nWin):
list = []
for j in windows[i].travle():
list.append(j.time)
print("第%s个窗口的目前排队状态:%s"%(i,list))
print("————————————————第%s时刻结束————————————————"%(now))
结果展示:



