用python实现洗车问题。要求:有两台洗车机,一台性能好(3分钟洗一台小汽车,5分钟清洗一台SUV),一台性能较差(6分钟洗一台小汽车,10分钟清洗一台SUV)。车流量为随机,在上午是每小时20辆车,大小随机,比例1:1;下午是每小时30辆车,大小随机,比例为4:6。请问如何分别实现上下午平均等待时间最短。请编程实现这一洗车过程,并对之进行优化。 (1)程序注释清晰,类、函数、变量等命名清晰合理,可读性高; (2)程序实现思路说明; (3)程序的适用性说明; (4)简单界面取号,可视化进程等。 并解释每行代码
时间: 2023-07-15 07:12:20 浏览: 129
以下是洗车问题的Python代码实现:
```python
import heapq
import random
class Car:
def __init__(self, size):
self.size = size
class CarWash:
def __init__(self, name, car_type, wash_time):
self.name = name
self.car_type = car_type
self.wash_time = wash_time
self.finish_time = 0
def __lt__(self, other):
return self.finish_time < other.finish_time
class Simulator:
def __init__(self, num_small_washers, num_big_washers, small_wash_time, big_wash_time, interval, hours):
self.num_small_washers = num_small_washers
self.num_big_washers = num_big_washers
self.small_wash_time = small_wash_time
self.big_wash_time = big_wash_time
self.interval = interval
self.hours = hours
self.time = 0
self.waiting_cars = []
self.results = []
def run(self):
for i in range(self.hours):
self.run_hour(i)
self.print_results()
def run_hour(self, hour):
print("Hour: {}".format(hour))
self.generate_cars(hour)
self.process_cars()
self.time += 60
def generate_cars(self, hour):
if hour < 12:
num_cars = 20
small_cars = num_cars // 2
big_cars = num_cars - small_cars
else:
num_cars = 30
small_cars = num_cars // 3
big_cars = num_cars - small_cars
for i in range(small_cars):
self.waiting_cars.append(Car('small'))
for i in range(big_cars):
self.waiting_cars.append(Car('big'))
random.shuffle(self.waiting_cars)
def process_cars(self):
heapq.heapify(self.results)
washers = []
for i in range(self.num_small_washers):
washers.append(CarWash('small_{}'.format(i), 'small', self.small_wash_time))
for i in range(self.num_big_washers):
washers.append(CarWash('big_{}'.format(i), 'big', self.big_wash_time))
for washer in washers:
if len(self.waiting_cars) == 0:
return
car = self.waiting_cars.pop(0)
washer.finish_time = self.time + washer.wash_time
self.results.append(washer)
while len(self.results) > 0:
washer = heapq.heappop(self.results)
if washer.finish_time <= self.time:
washer.finish_time = 0
washers.append(washer)
continue
if len(self.waiting_cars) == 0:
return
car = self.waiting_cars.pop(0)
if washer.car_type == car.size:
washer.finish_time += washer.wash_time
heapq.heappush(self.results, washer)
else:
washer.finish_time = 0
washers.append(washer)
for washer in washers:
if washer.finish_time > 0:
heapq.heappush(self.results, washer)
def print_results(self):
print("Results:")
total_wait_time = 0
num_cars_washed = 0
for washer in self.results:
total_wait_time += washer.finish_time
num_cars_washed += 1
print("{} - {} - {} - {}".format(washer.name, washer.car_type, washer.wash_time, washer.finish_time))
if num_cars_washed > 0:
avg_wait_time = total_wait_time / num_cars_washed
print("Average wait time: {}".format(avg_wait_time))
simulator = Simulator(2, 2, 3, 5, 10, 24)
simulator.run()
```
程序实现思路:
1. 定义 `Car` 类表示车辆,拥有 `size` 属性表示车辆大小。
2. 定义 `CarWash` 类表示洗车机,拥有 `name` 属性表示洗车机名称,`car_type` 属性表示洗车机适用的车辆大小,`wash_time` 属性表示洗车机处理一辆车的时间,`finish_time` 属性表示洗车机的完成时间。
3. 定义 `Simulator` 类表示模拟器,拥有 `num_small_washers` 属性表示小型洗车机数量,`num_big_washers` 属性表示大型洗车机数量,`small_wash_time` 属性表示小型洗车机处理一辆小型车的时间,`big_wash_time` 属性表示大型洗车机处理一辆大型车的时间,`interval` 属性表示车辆到达时间间隔,`hours` 属性表示模拟的小时数,`time` 属性表示当前时间,`waiting_cars` 属性表示等待洗车的车辆列表,`results` 属性表示已经处理完成的洗车机列表。
4. 定义 `run` 方法表示运行模拟器,循环调用 `run_hour` 方法模拟每个小时的洗车过程,最后输出结果。
5. 定义 `run_hour` 方法表示模拟每个小时的洗车过程,依次调用 `generate_cars` 方法生成车辆,`process_cars` 方法处理车辆,`time` 属性加上 60 表示时间推进一分钟。
6. 定义 `generate_cars` 方法表示生成车辆,根据当前小时数决定车流量和大小比例,将车辆加入等待列表,并随机打乱等待列表。
7. 定义 `process_cars` 方法表示处理车辆,使用堆结构来维护已经完成的洗车机列表,使用列表结构来维护待处理的洗车机列表。首先将所有洗车机按照处理时间加入待处理列表,然后依次取出待处理列表中的洗车机和等待列表中的车辆进行匹配,如果匹配成功,则将洗车机加入已完成列表,并更新完成时间;否则将洗车机加入待处理列表。最后将已完成但未加入待处理列表的洗车机加入已完成列表。
8. 定义 `print_results` 方法表示输出结果,依次输出已完成的洗车机信息和平均等待时间。
程序的适用性说明:
该程序可以模拟洗车场的洗车过程,并计算出平均等待时间。可以根据实际情况调整洗车机数量和处理时间,以及车辆到达时间间隔和大小比例,来得到最优的洗车效率。
简单界面取号,可视化进程等可以使用 PyQT 或者 Tkinter 等 GUI 库实现,以便更好地展示洗车过程和结果。
阅读全文