12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #!/usr/bin/env python3
- from collections import Counter
- from math import sqrt, ceil
- import sys
- # from heapq import heappush, heappop
- FILE_IN = sys.argv[1]
- FILE_OUT = sys.argv[2]
- SCORE = 0
- lines = open(FILE_IN).read().splitlines()
- R, C, nb_drones, T, max_payload = map(int, lines[0].split())
- nb_types = int(lines[1])
- weights = map(int, lines[2].split())
- nb_warehouses = int(lines[3])
- coords_w = [None] * nb_warehouses
- stocks = [None] * nb_warehouses
- for w in range(nb_warehouses):
- coords_w[w] = list(map(int, lines[4 + 2 * w].split()))
- stocks[w] = list(map(int, lines[4 + 2 * w + 1].split()))
- nb_orders = int(lines[4 + 2 * nb_warehouses])
- coords_o = [None] * nb_orders
- request = [None] * nb_orders
- for o in range(nb_orders):
- coords_o[o] = list(map(int, lines[4 + 2 * nb_warehouses + 1 + 3 * o].split()))
- request[o] = Counter(map(int, lines[4 + 2 * nb_warehouses + 1 + 3 * o + 2].split()))
- # All drones start at 0
- coords_d = [coords_w[0]] * nb_drones
- time_d = [-1] * nb_drones
- load_d = [Counter() for _ in range(nb_drones)]
- delivery_times = {}
- def dist(c1, c2):
- return sqrt(pow(c1[0] - c2[0], 2) + pow(c1[1] - c2[1], 2))
- def load(drone_id):
- return sum(nb * weights[product_type] for product_type, nb in enumerate(load_d[drone_id]))
- with open(FILE_OUT) as f:
- next(f)
- for line in f:
- if 'W' in line or 'U' in line:
- pass
- else:
- drone_id, command, place_id, product_type, quantity = map(lambda x: int(x) if x not in 'DL' else x, line.split())
- if command == 'L':
- time_d[drone_id] += ceil(dist(coords_d[drone_id], coords_w[place_id]))
- # TODO verify there is sufficient stock in warehouse
- coords_d[drone_id] = coords_w[place_id]
- load_d[drone_id][product_type] += quantity
- # TODO verify max_payload
- time_d[drone_id] += 1
- # print('Drone %d loads from warehouse %d at turn %d' % (drone_id, place_id, time_d[drone_id]))
- else:
- time_d[drone_id] += ceil(dist(coords_d[drone_id], coords_o[place_id]))
- coords_d[drone_id] = coords_o[place_id]
- # TODO verify order is respected
- load_d[drone_id][product_type] -= quantity
- request[place_id][product_type] -= quantity
- time_d[drone_id] += 1
- current_time = time_d[drone_id]
- delivery_times.setdefault(place_id, []).append(current_time)
- if all(quantity == 0 for quantity in request[place_id].values()):
- # print('Order %d is satisfied by drone %d at turn %d' % (place_id, drone_id, time_d[drone_id]))
- SCORE += ceil((T - max(delivery_times[place_id])) * 100 / T)
- print(FILE_OUT + "_" + str(SCORE))
|