From 726474abb97ab5293efb375b3b4d6eb122a22d4e Mon Sep 17 00:00:00 2001 From: Geoffrey Frogeye Date: Sat, 13 Feb 2016 15:36:44 +0100 Subject: [PATCH] Deliver everyone --- reborn.py | 73 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/reborn.py b/reborn.py index 1f93ac5..b70d8c1 100755 --- a/reborn.py +++ b/reborn.py @@ -3,11 +3,14 @@ import sys import math import copy +import progressbar + +DEBUG = False outLines = [] def log(*data): - if True: + if DEBUG: print(*data) def output(*values): @@ -44,7 +47,11 @@ class Warehouse: self.pos = pos 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 def near(pos): @@ -70,12 +77,17 @@ class Client: self.pos = pos 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): return len(self.needs) == 0 def pack(self, payload=-1): + # TODO Optimise for same product wanted more than once if payload == -1: payload = Drone.PAYLOAD p = [] @@ -187,7 +199,7 @@ class Drone: def wait(self, turns=1): assert(self.available()) 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) # Set functions @@ -210,6 +222,7 @@ T = 0 # Deadline turn = 0 # Turn score = 0 # Score +done = False def readFile(filename): global X, Y, T @@ -266,20 +279,47 @@ def newTurn(): availableDrones = [str(drone.id) for drone in Drone.ALL if drone.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: - d = 0 - for c in Client.near(Warehouse.get(0).pos): - if d < Drone.len(): - pack = c.pack() - 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: + if not DEBUG: + bar = progressbar.ProgressBar(max_value=SIMULATION) + while turn < SIMULATION and not done: + think() newTurn() + if not DEBUG: + bar.update(turn) + if not DEBUG: + bar.finish() except KeyboardInterrupt: @@ -287,5 +327,6 @@ except KeyboardInterrupt: with open(sys.argv[1] + 'o', 'w') as f: f.write(str(len(outLines)) + '\n' + '\n'.join(outLines) + '\n') +print("Turn:", turn) print("Score:", score)