Deliver everyone
This commit is contained in:
parent
f31e6e74c8
commit
726474abb9
73
reborn.py
73
reborn.py
|
@ -3,11 +3,14 @@
|
||||||
import sys
|
import sys
|
||||||
import math
|
import math
|
||||||
import copy
|
import copy
|
||||||
|
import progressbar
|
||||||
|
|
||||||
|
DEBUG = False
|
||||||
|
|
||||||
outLines = []
|
outLines = []
|
||||||
|
|
||||||
def log(*data):
|
def log(*data):
|
||||||
if True:
|
if DEBUG:
|
||||||
print(*data)
|
print(*data)
|
||||||
|
|
||||||
def output(*values):
|
def output(*values):
|
||||||
|
@ -44,7 +47,11 @@ class Warehouse:
|
||||||
self.pos = pos
|
self.pos = pos
|
||||||
self.items = items
|
self.items = items
|
||||||
|
|
||||||
self.plannedItems = self.items
|
self.plannedItems = self.items.copy()
|
||||||
|
|
||||||
|
def plan(self, items):
|
||||||
|
for i in items:
|
||||||
|
self.plannedItems.remove(i)
|
||||||
|
|
||||||
# Set functions
|
# Set functions
|
||||||
def near(pos):
|
def near(pos):
|
||||||
|
@ -70,12 +77,17 @@ class Client:
|
||||||
self.pos = pos
|
self.pos = pos
|
||||||
self.needs = needs
|
self.needs = needs
|
||||||
|
|
||||||
self.plannedNeeds = self.needs
|
self.plannedNeeds = self.needs.copy()
|
||||||
|
|
||||||
|
def plan(self, needs):
|
||||||
|
for n in needs:
|
||||||
|
self.plannedNeeds.remove(n)
|
||||||
|
|
||||||
def satisfied(self):
|
def satisfied(self):
|
||||||
return len(self.needs) == 0
|
return len(self.needs) == 0
|
||||||
|
|
||||||
def pack(self, payload=-1):
|
def pack(self, payload=-1):
|
||||||
|
# TODO Optimise for same product wanted more than once
|
||||||
if payload == -1:
|
if payload == -1:
|
||||||
payload = Drone.PAYLOAD
|
payload = Drone.PAYLOAD
|
||||||
p = []
|
p = []
|
||||||
|
@ -187,7 +199,7 @@ class Drone:
|
||||||
def wait(self, turns=1):
|
def wait(self, turns=1):
|
||||||
assert(self.available())
|
assert(self.available())
|
||||||
self.busyFor(1)
|
self.busyFor(1)
|
||||||
#log("Drone", self.id, "waits", turns, "turn" + ('s' if turns >= 2 else ''), "→", self.avail)
|
log("Drone", self.id, "waits", turns, "turn" + ('s' if turns >= 2 else ''), "→", self.avail)
|
||||||
output(self.id, 'W', turns)
|
output(self.id, 'W', turns)
|
||||||
|
|
||||||
# Set functions
|
# Set functions
|
||||||
|
@ -210,6 +222,7 @@ T = 0 # Deadline
|
||||||
|
|
||||||
turn = 0 # Turn
|
turn = 0 # Turn
|
||||||
score = 0 # Score
|
score = 0 # Score
|
||||||
|
done = False
|
||||||
|
|
||||||
def readFile(filename):
|
def readFile(filename):
|
||||||
global X, Y, T
|
global X, Y, T
|
||||||
|
@ -266,20 +279,47 @@ def newTurn():
|
||||||
availableDrones = [str(drone.id) for drone in Drone.ALL if drone.available()]
|
availableDrones = [str(drone.id) for drone in Drone.ALL if drone.available()]
|
||||||
#log("Drones", ", ".join(availableDrones), "("+str(len(availableDrones))+")", "are available")
|
#log("Drones", ", ".join(availableDrones), "("+str(len(availableDrones))+")", "are available")
|
||||||
|
|
||||||
SIMULATION = 100
|
# Algorithm that only works for 1 warehouse
|
||||||
|
def think():
|
||||||
|
# For each drone that has nothing to do
|
||||||
|
for drone in [d for d in Drone.ALL if d.available() and not d.tasks]:
|
||||||
|
# Find the nearest warehouse
|
||||||
|
warehouse = Warehouse.near(drone.pos)[0]
|
||||||
|
# Find the nearest client that still has things to be delivered
|
||||||
|
remainingClients = [c for c in Client.near(warehouse.pos) if c.plannedNeeds]
|
||||||
|
if remainingClients:
|
||||||
|
client = remainingClients[0]
|
||||||
|
# Create a pack to deliver
|
||||||
|
pack = client.pack()
|
||||||
|
# Plan the delivery
|
||||||
|
# TODO Optimise for same product wanted more than once
|
||||||
|
for i in pack:
|
||||||
|
drone.addTask('load', warehouse, Product.get(i), 1)
|
||||||
|
warehouse.plan(pack)
|
||||||
|
for i in pack:
|
||||||
|
drone.addTask('deliver', client, Product.get(i), 1)
|
||||||
|
client.plan(pack)
|
||||||
|
else:
|
||||||
|
global done
|
||||||
|
done = True
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
if DEBUG:
|
||||||
|
SIMULATION = 1000
|
||||||
|
else:
|
||||||
|
SIMULATION = 8*T/10
|
||||||
|
|
||||||
try:
|
try:
|
||||||
d = 0
|
if not DEBUG:
|
||||||
for c in Client.near(Warehouse.get(0).pos):
|
bar = progressbar.ProgressBar(max_value=SIMULATION)
|
||||||
if d < Drone.len():
|
while turn < SIMULATION and not done:
|
||||||
pack = c.pack()
|
think()
|
||||||
if len(pack) == len(c.needs):
|
|
||||||
for i in pack:
|
|
||||||
Drone.get(d).addTask('load', Warehouse.get(0), Product.get(i), 1)
|
|
||||||
for i in pack:
|
|
||||||
Drone.get(d).addTask('deliver', c, Product.get(i), 1)
|
|
||||||
d += 1
|
|
||||||
while turn < SIMULATION:
|
|
||||||
newTurn()
|
newTurn()
|
||||||
|
if not DEBUG:
|
||||||
|
bar.update(turn)
|
||||||
|
if not DEBUG:
|
||||||
|
bar.finish()
|
||||||
|
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
|
@ -287,5 +327,6 @@ except KeyboardInterrupt:
|
||||||
|
|
||||||
with open(sys.argv[1] + 'o', 'w') as f:
|
with open(sys.argv[1] + 'o', 'w') as f:
|
||||||
f.write(str(len(outLines)) + '\n' + '\n'.join(outLines) + '\n')
|
f.write(str(len(outLines)) + '\n' + '\n'.join(outLines) + '\n')
|
||||||
|
print("Turn:", turn)
|
||||||
print("Score:", score)
|
print("Score:", score)
|
||||||
|
|
||||||
|
|
Reference in a new issue