This repository has been archived on 2019-08-08. You can view files and clone it, but cannot push or open issues or pull requests.
hashcode2016/main.py

200 lines
4.2 KiB
Python
Raw Normal View History

2016-02-11 17:43:32 +00:00
#!/usr/bin/env python3
2016-02-11 18:18:29 +00:00
import math
2016-02-11 19:35:07 +00:00
import sys
2016-02-11 18:18:29 +00:00
2016-02-11 17:43:32 +00:00
print("#hashcode2016")
2016-02-11 18:18:29 +00:00
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
2016-02-11 19:35:07 +00:00
t = -1 # Turn
2016-02-11 18:56:36 +00:00
2016-02-11 19:38:29 +00:00
Dp = [] # Positions of drones
2016-02-11 18:18:29 +00:00
# (x, y)
2016-02-11 19:38:29 +00:00
Di = [] # Items of drones
2016-02-11 18:18:29 +00:00
# {product number: qt}
2016-02-11 19:38:29 +00:00
Dd = [] # Turn avaibility of drone
2016-02-11 18:18:29 +00:00
# int
2016-02-11 19:38:29 +00:00
Da = [] # Avaibles drones
2016-02-11 18:56:36 +00:00
# int
2016-02-11 18:18:29 +00:00
2016-02-11 19:38:29 +00:00
Pw = [] # Weight of products
2016-02-11 18:18:29 +00:00
# int
2016-02-11 19:38:29 +00:00
Wp = [] # Positions of warehouses
2016-02-11 18:18:29 +00:00
# (x, y)
2016-02-11 19:38:29 +00:00
Wi = [] # Items of warehouses
2016-02-11 18:18:29 +00:00
# {product number: qt}
2016-02-11 19:38:29 +00:00
Cp = [] # Positions of customers
2016-02-11 18:18:29 +00:00
# (x, y)
2016-02-11 19:38:29 +00:00
Ci = [] # Needs of customers
2016-02-11 18:18:29 +00:00
# {product number: qt}
2016-02-11 19:35:07 +00:00
# Reading raw data
f = open(sys.argv[1], 'r')
line = f.readline()
info = line.split(' ')
GRILLE = (int(info[0]), int(info[1]))
X, Y = GRILLE
D = int(info[2])
T = int(info[3])
M = int(info[4])
line = f.readline()
P = int(line)
line = f.readline()
info = line.split(' ')
for i in range(0, P):
Pw.append(int(info[i]))
line = f.readline()
W = int(line)
for i in range(0, W):
line = f.readline()
info = line.split(' ')
Wp.append((int(info[0]), int(info[1])))
line = f.readline()
info = line.split(' ')
productQ = {}
for j in range(0, len(info)):
productQ[j] = int(info[j])
Wi.append(productQ)
line = f.readline()
C = int(line)
for i in range(0, C):
line = f.readline()
info = line.split(' ')
Cp.append((int(info[0]), int(info[1])))
line = f.readline()
nbP = int(line)
line = f.readline()
info = line.split(' ')
orderQ = {}
for k in range(0, P):
orderQ[k] = 0
for j in range(0, nbP):
orderQ[int(info[j])] += 1
Ci.append(orderQ)
f.close()
# Constituting data
for d in range(D):
Dp.append(Wp[0])
Di.append(dict((p, 0) for p in range(P)))
Dd.append(0)
2016-02-11 19:48:54 +00:00
Out = [] # Drones commands
2016-02-11 19:10:18 +00:00
# Debug
2016-02-11 19:35:07 +00:00
assert(len(Dp) == len(Di) == len(Dd) == D)
2016-02-11 19:10:18 +00:00
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="")
2016-02-11 19:35:07 +00:00
print()
2016-02-11 19:10:18 +00:00
2016-02-11 18:56:36 +00:00
# Utilities
2016-02-11 18:18:29 +00:00
def distance(A, B):
return math.ceil(sqrt(pow((B[0] - A[0], 2) + pow(B[1] - A[1], 2))))
2016-02-11 18:56:36 +00:00
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)
2016-02-11 19:38:29 +00:00
assert(Dd[d] <= T)
2016-02-11 18:56:36 +00:00
print("Drone", d, "loads", q, "of", p, "from warehouse", w, "", Dd[d])
2016-02-11 19:55:22 +00:00
Out.append(str(d) + ' L ' + str(w+1) + ' ' + str(p+1) + ' ' + str(q))
2016-02-11 18:56:36 +00:00
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
2016-02-11 19:38:29 +00:00
assert(Dd[d] <= T)
2016-02-11 18:56:36 +00:00
print("Drone", d, "unloads", q, "of", p, "from warehouse", w, "", Dd[d])
2016-02-11 19:55:22 +00:00
Out.append(str(d) + ' U ' + str(w+1) + ' ' + str(p+1) + ' ' + str(q))
2016-02-11 18:56:36 +00:00
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
2016-02-11 19:38:29 +00:00
assert(Dd[d] <= T)
2016-02-11 18:56:36 +00:00
print("Drone", d, "delivers", q, "of", p, "to client", w, "", Dd[d])
2016-02-11 19:55:22 +00:00
Out.append(str(d) + ' D ' + str(c+1) + ' ' + str(p+1) + ' ' + str(q))
2016-02-11 18:56:36 +00:00
def wait(d, w=1):
assert(d in Da)
Dd[d] += w
2016-02-11 19:48:54 +00:00
Da.remove(d)
2016-02-11 18:56:36 +00:00
print("Drone", d, "waits", w, "turn" + ('s' if w >= 2 else ''), "", Dd[d])
2016-02-11 19:48:54 +00:00
Out.append(str(d) + ' W ' + str(w))
2016-02-11 18:56:36 +00:00
# Control
def newTurn():
2016-02-11 19:48:54 +00:00
global t
2016-02-11 18:56:36 +00:00
t += 1
print("--- Turn", t)
for d in Da:
wait(d)
2016-02-11 19:10:18 +00:00
assert(len(Da) == 0)
2016-02-11 18:56:36 +00:00
for d in range(D):
if Dd[d] <= t:
2016-02-11 19:48:54 +00:00
Da.append(d)
print("Drones", ", ".join([str(d) for d in Da]), "(", len(Da), ")", "are avaible")
2016-02-11 18:56:36 +00:00
def end():
print("--- End!")
2016-02-11 18:18:29 +00:00
2016-02-11 18:56:36 +00:00
# IA
2016-02-11 19:48:54 +00:00
newTurn()
newTurn()
2016-02-11 19:35:35 +00:00
2016-02-11 19:38:29 +00:00
# Output
f = open(sys.argv[1] + 'o', 'w')
2016-02-11 19:48:54 +00:00
f.write(str(len(Out)) + '\n' + '\n'.join(Out))
2016-02-11 19:38:29 +00:00
f.close()