def closest_warehouse(self, drone, offer): potential_warehouse = None current_dist = None for w in self.warehouses: if w.has_product(offer["product"], offer["count"]): if potential_warehouse is None or dist_ceil(w.pos, drone.pos) < current_dist: potential_warehouse = w current_dist = dist_ceil(w.pos, drone.pos) assert potential_warehouse.has_product(offer["product"], offer["count"]) assert potential_warehouse is not None return potential_warehouse
def next_offer(self): """ looks at all drones and gives the nearest offer """ next_drone = self.next_free_drone() next_order = None current_dist = None for order in self.orders: if order.has_unreserved_items(): if next_order is None or dist_ceil(next_drone, order) < current_dist: next_order = order current_dist = dist_ceil(next_drone.pos, order.pos) if next_order is None: return None item, count = next_order.best_unreserved_item(self.max_payload) count = min(int(self.max_payload / self.products[item]), count) offer = {"product": item, "order": next_order, "count": count} return offer
def new_instructions(self, turn): if self.in_progress is None: return None product = self.in_progress["product"] count = self.in_progress["count"] order = self.in_progress["order"] cmd = deliver(self.id, self.in_progress["order"].id, product, count) duration = dist_ceil(self.pos, order.pos) + 1 # -1 müsste minus eins sein aber so gehen wir sicher self.busy_time = turn + duration self.in_progress = None order.complete(product, count) self.pos = order.pos return cmd
def process(self, turn, offer): self.in_progress = offer product = offer["product"] count = offer["count"] warehouse = offer["warehouse"] assert count > 0 cmd = load(self.id, warehouse.id, product, count) duration = dist_ceil(self.pos, warehouse.pos) + 1 # -1 müsste minus eins sein aber so gehen wir sicher self.busy_time = turn + duration self.in_progress = offer warehouse.take_product(product, count) offer["order"].process(product, count) self.pos = warehouse.pos return cmd