|
@@ -0,0 +1,73 @@
|
|
|
+#!/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))
|