假设某银行网点有五个服务窗口,分别为三个对私、一个对公和一个外币窗口。银行服务的原则是先来先服务。通常对私业务人很多,其它窗口人则较少,可临时改为对私服务。假设当对私窗口等待服务的客户(按实际服务窗口)平均排队人数超过(大于或等于)7人时,等待客户将可能有抱怨,影响服务质量,此时银行可临时将其它窗口中一个或两个改为对私服务,当平均排队客户少于7人时,将立即恢复原有业务。设计一个程序用来模拟银行服务。
时间: 2024-03-07 19:46:55 浏览: 28
下面是一个简单的银行服务模拟程序的示例代码,供您参考:
```python
import random
import time
class Bank:
def __init__(self, num_private_win, num_public_win, num_foreign_win):
self.num_private_win = num_private_win # 对私窗口数量
self.num_public_win = num_public_win # 对公窗口数量
self.num_foreign_win = num_foreign_win # 外币窗口数量
self.waiting_private = [] # 对私客户等待队列
self.waiting_public = [] # 对公客户等待队列
self.waiting_foreign = [] # 外币客户等待队列
self.private_win_in_use = [False] * num_private_win # 记录对私窗口是否在使用
self.public_win_in_use = [False] * num_public_win # 记录对公窗口是否在使用
self.foreign_win_in_use = [False] * num_foreign_win # 记录外币窗口是否在使用
self.private_win_service_time = [0] * num_private_win # 记录对私窗口已服务时间
self.public_win_service_time = [0] * num_public_win # 记录对公窗口已服务时间
self.foreign_win_service_time = [0] * num_foreign_win # 记录外币窗口已服务时间
self.private_win_service_customer = [None] * num_private_win # 记录对私窗口当前服务客户
self.public_win_service_customer = [None] * num_public_win # 记录对公窗口当前服务客户
self.foreign_win_service_customer = [None] * num_foreign_win # 记录外币窗口当前服务客户
def add_customer(self, customer):
if customer.service_type == 'private':
self.waiting_private.append(customer)
elif customer.service_type == 'public':
self.waiting_public.append(customer)
else:
self.waiting_foreign.append(customer)
def serve_customer(self):
# 随机选择一个窗口类型,以便进行临时调整
win_type = random.choice(['private', 'public', 'foreign'])
# 如果对私排队人数超过7人,将一个其它窗口改为对私服务
if len(self.waiting_private) >= 7:
if win_type == 'public':
win_index = random.randint(0, self.num_public_win-1)
self.private_win_in_use[win_index] = True
self.public_win_in_use[win_index] = False
self.private_win_service_customer[win_index] = self.waiting_public.pop(0)
elif win_type == 'foreign':
win_index = random.randint(0, self.num_foreign_win-1)
self.private_win_in_use[win_index] = True
self.foreign_win_in_use[win_index] = False
self.private_win_service_customer[win_index] = self.waiting_foreign.pop(0)
else:
for i, in_use in enumerate(self.public_win_in_use):
if not in_use:
self.private_win_in_use[i] = True
self.public_win_in_use[i] = False
self.private_win_service_customer[i] = self.waiting_public.pop(0)
break
else:
for i, in_use in enumerate(self.foreign_win_in_use):
if not in_use:
self.private_win_in_use[i] = True
self.foreign_win_in_use[i] = False
self.private_win_service_customer[i] = self.waiting_foreign.pop(0)
break
# 否则,将所有窗口恢复到原有业务
else:
for i in range(self.num_private_win):
if self.private_win_in_use[i]:
self.private_win_in_use[i] = False
if self.private_win_service_customer[i].service_type == 'private':
self.waiting_private.append(self.private_win_service_customer[i])
elif self.private_win_service_customer[i].service_type == 'public':
self.waiting_public.append(self.private_win_service_customer[i])
else:
self.waiting_foreign.append(self.private_win_service_customer[i])
self.private_win_service_customer[i] = None
for i in range(self.num_public_win):
if self.public_win_in_use[i]:
self.public_win_in_use[i] = False
if self.public_win_service_customer[i].service_type == 'public':
self.waiting_public.append(self.public_win_service_customer[i])
else:
self.waiting_foreign.append(self.public_win_service_customer[i])
self.public_win_service_customer[i] = None
for i in range(self.num_foreign_win):
if self.foreign_win_in_use[i]:
self.foreign_win_in_use[i] = False
self.waiting_foreign.append(self.foreign_win_service_customer[i])
self.foreign_win_service_customer[i] = None
# 对私服务
for i in range(self.num_private_win):
if not self.private_win_in_use[i] and self.waiting_private:
self.private_win_in_use[i] = True
self.private_win_service_customer[i] = self.waiting_private.pop(0)
# 对公服务
for i in range(self.num_public_win):
if not self.public_win_in_use[i] and self.waiting_public:
self.public_win_in_use[i] = True
self.public_win_service_customer[i] = self.waiting_public.pop(0)
# 外币服务
for i in range(self.num_foreign_win):
if not self.foreign_win_in_use[i] and self.waiting_foreign:
self.foreign_win_in_use[i] = True
self.foreign_win_service_customer[i] = self.waiting_foreign.pop(0)
def print_status(self):
print('对私窗口状态:', self.private_win_in_use)
print('对公窗口状态:', self.public_win_in_use)
print('外币窗口状态:', self.foreign_win_in_use)
print('对私客户等待队列:', self.waiting_private)
print('对公客户等待队列:', self.waiting_public)
print('外币客户等待队列:', self.waiting_foreign)
class Customer:
def __init__(self, id, service_type):
self.id = id # 客户ID
self.service_type = service_type # 服务类型,'private'、'public'或'foreign'
def __repr__(self):
return 'Customer {}'.format(self.id)
def run_bank_simulation(num_private_win, num_public_win, num_foreign_win, max_time):
bank = Bank(num_private_win, num_public_win, num_foreign_win)
customers = []
for i in range(100):
if i % 5 == 0:
customers.append(Customer(i, 'public'))
elif i % 7 == 0:
customers.append(Customer(i, 'foreign'))
else:
customers.append(Customer(i, 'private'))
start_time = time.time()
current_time = 0
while current_time < max_time:
# 添加新客户
if customers and random.random() < 0.5:
bank.add_customer(customers.pop(0))
# 服务客户
bank.serve_customer()
# 输出状态
print('Time: {:.2f}'.format(current_time))
bank.print_status()
time.sleep(1)
current_time = time.time() - start_time
run_bank_simulation(3, 1, 1, 60)
```
在这个程序中,我们定义了 `Bank` 类来表示银行,其中包括服务窗口数量、等待队列和窗口状态等信息,并定义了 `add_customer` 和 `serve_customer` 方法来添加客户和服务客户。我们还定义了 `Customer` 类来表示客户,包括客户ID和服务类型。
在 `run_bank_simulation` 函数中,我们初始化了银行和一些客户,然后开始模拟服务过程。在每个时间步长中,我们随机决定是否添加新客户,然后调用 `serve_customer` 方法来服务现有客户。最后输出当前银行状态,并使用 `time.sleep` 函数来模拟客户等待的时间。
当对私窗口等待服务的客户平均排队人数超过7人时,等待客户将可能有抱怨,为了避免影响服务质量,程序会根据一定的规则将其它窗口中一个或两个改为对私服务,当平均排队客户少于7人时,程序将立即恢复原有业务。具体实现可以参考 `serve_customer` 方法中的代码。