124 lines
2.6 KiB
Python
124 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
||
|
||
import math
|
||
|
||
print("#hashcode2016")
|
||
|
||
X = 0 # Nb rows
|
||
Y = 0 # Nb columns
|
||
D = 0 # Nb drones
|
||
T = 0 # Deadline
|
||
M = 0 # Maximum load
|
||
P = 0 # Nb products
|
||
W = 0 # Nb warehouses
|
||
C = 0 # Nb customers
|
||
|
||
t = 0 # Turn
|
||
|
||
Dp = []; # Positions of drones
|
||
# (x, y)
|
||
Di = []; # Items of drones
|
||
# {product number: qt}
|
||
Dd = []; # Turn avaibility of drone
|
||
# int
|
||
Da = []; # Avaibles drones
|
||
# int
|
||
|
||
Pw = []; # Weight of products
|
||
# int
|
||
|
||
Wp = []; # Positions of warehouses
|
||
# (x, y)
|
||
Wi = []; # Items of warehouses
|
||
# {product number: qt}
|
||
|
||
Cp = []; # Positions of customers
|
||
# (x, y)
|
||
Ci = []; # Needs of customers
|
||
# {product number: qt}
|
||
|
||
Out = '' # Drones commands
|
||
|
||
# Debug
|
||
|
||
assert(len(Dp) == len(Di) == len(Dd) == len(Da) == D)
|
||
assert(len(Pw) == P)
|
||
assert(len(Wp) == len(Wi) == W)
|
||
assert(len(Cp) == len(Ci) == C)
|
||
|
||
#def droneInfos(d):
|
||
# print("- Drone", d, "carries", ", ".join([p + ": " + q + "×" + Dw[p] for
|
||
|
||
def showGrid():
|
||
for y in range(Y):
|
||
for x in range(X):
|
||
if (x, y) in Wp:
|
||
print("W", end="")
|
||
if (x, y) in Cp:
|
||
print("C", end="")
|
||
else:
|
||
print("·", end="")
|
||
|
||
# Utilities
|
||
def distance(A, B):
|
||
return math.ceil(sqrt(pow((B[0] - A[0], 2) + pow(B[1] - A[1], 2))))
|
||
|
||
def weight(d):
|
||
return sum([Pw[i] for i in Di[d]])
|
||
|
||
# Actions
|
||
def load(d, w, p, q):
|
||
# drone number, warehouse, product, qt
|
||
assert(d in Da)
|
||
if (Dp[d] != Wp[w]):
|
||
Dd[d] += distance(Dp[d], Wp[w])
|
||
Wi[w][p] += -q
|
||
Di[d][p] += +q
|
||
assert(Wp[w][p] >= 0)
|
||
assert(weight(d) <= M)
|
||
assert(Dd[d] <= T);
|
||
print("Drone", d, "loads", q, "of", p, "from warehouse", w, "→", Dd[d])
|
||
|
||
def unload(d, w, p, q):
|
||
# drone number, warehouse, product, qt
|
||
assert(d in Da)
|
||
if (Dp[d] != Wp[w]):
|
||
Dd[d] += distance(Dp[d], Wp[w])
|
||
Wi[w][p] += +q
|
||
Di[d][p] += -q
|
||
assert(Dd[d] <= T);
|
||
print("Drone", d, "unloads", q, "of", p, "from warehouse", w, "→", Dd[d])
|
||
|
||
def deliver(d, c, p, q):
|
||
# drone number, customer, product, qt
|
||
assert(d in Da)
|
||
if (Dp[d] != Cp[c]):
|
||
Dd[d] += distance(Dp[d], Cp[c])
|
||
Ci[w][p] += +q
|
||
Di[d][p] += -q
|
||
Dd[d] += 1
|
||
assert(Dd[d] <= T);
|
||
print("Drone", d, "delivers", q, "of", p, "to client", w, "→", Dd[d])
|
||
|
||
def wait(d, w=1):
|
||
assert(d in Da)
|
||
Dd[d] += w
|
||
print("Drone", d, "waits", w, "turn" + ('s' if w >= 2 else ''), "→", Dd[d])
|
||
|
||
# Control
|
||
def newTurn():
|
||
t += 1
|
||
print("--- Turn", t)
|
||
for d in Da:
|
||
wait(d)
|
||
assert(len(Da) == 0)
|
||
for d in range(D):
|
||
if Dd[d] <= t:
|
||
Da.push(d)
|
||
print("Drones", ", ".join(Da), "(", len(Da), ")", "are avaible")
|
||
|
||
def end():
|
||
print("--- End!")
|
||
|
||
# IA
|