class NaiveOptimiser: def __init__(self): input_reader = InputReader() self.state = input_reader.read(0) self.output_writer = OutputWriter('naive') self.num_rows = self.state['numRows'] self.num_cols = self.state['numCols'] self.num_drones = self.state['numDrones'] self.num_turns = self.state['numTurns'] self.max_payload = self.state['maxPayload'] self.num_product_types = self.state['numProductTypes'] self.product_weights = self.state['productWeights'] self.num_warehouses = self.state['numWarehouses'] # warehouse: liste auf dicts: x, y, items -> itemstock self.warehouse_data = self.state['warehousesData'] # order data: liste auf dicts: x, y, numorders, items self.order_data = self.state['orderData'] # get list of items self.item_lists = numpy.zeros((len(self.order_data), len(self.product_weights)), dtype=int) self.turns_used = numpy.zeros(self.num_drones) self.drone_location = numpy.zeros((self.num_drones, 2)) for order_idx in numpy.arange(len(self.order_data)): for item in self.order_data[order_idx]['items']: self.item_lists[order_idx][item] += 1 for n in numpy.arange(self.num_drones): self.drone_location[n] = [0, 0] def optimise(self): while True: print self.turns_used[:20] # Do smallest orders first # list of num orders num_orders = [order['numOrders'] for order in self.order_data] idx_smallest_orders = num_orders.index(min(num_orders)) idx_order = idx_smallest_orders print self.item_lists[idx_smallest_orders] coordinates_smallest = (self.order_data[idx_order]['x'], self.order_data[idx_order]['y']) items_order = self.order_data[idx_order]['items'] # get warehouses with items closest to destination that have at least one of the items stocked smallest_dist = 10000 smallest_idx = -1 # get warehouses that stock suitable items suitable_warehouses = [] for warehouse in self.warehouse_data: warehouse_stock = warehouse['items'] for item in items_order: if warehouse_stock[item] > 0: suitable_warehouses.append(warehouse) coordinates_warehouse = (0, 0) # get nearest one to customer for idx, warehouse in enumerate(suitable_warehouses): coordinates_warehouse = (warehouse['x'], warehouse['y']) dist = math.ceil(math.sqrt((coordinates_smallest[0] - coordinates_warehouse[0]) ** 2 + ( coordinates_smallest[1] - coordinates_warehouse[1]) ** 2)) if dist < smallest_dist: smallest_dist = dist smallest_idx = idx cur_warehouse = self.warehouse_data[smallest_idx] # assign next drone which hasn't done much so for next_drone_idx = numpy.argmin(self.turns_used) # which stock? warehouse_stock = cur_warehouse['items'] for idx, item in enumerate(self.item_lists[idx_order]): if item > 0: print 'here' if warehouse_stock[item] > 0: # next drone fetch that stock! # how many can it fetch? num_possible = int(self.max_payload[next_drone_idx] * 1. / self.product_weights[item]) num_taken = min([num_possible, warehouse_stock[item]]) # calculate number of turns used # add delivery turn_count = smallest_dist + 1 load_dist = math.ceil( numpy.linalg.norm(self.drone_location[next_drone_idx] - coordinates_warehouse)) turn_count += load_dist + 1 # we are over max turns! if self.turns_used[next_drone_idx] + turn_count > self.num_turns: self.end() return else: self.turns_used[next_drone_idx] += turn_count # fetch that self.output_writer.writeLoad(next_drone_idx, smallest_idx, item, num_taken) self.output_writer.writeDeliver(next_drone_idx, idx_order, item, num_taken) # decrease warehouse stock warehouse_stock[item] -= num_taken # remove item from list self.item_lists[idx_order][item] -= num_taken # update drone location self.drone_location[next_drone_idx] = coordinates_smallest print 'here' break def end(self): self.output_writer.endFile()
class NaiveOptimiser: def __init__(self): input_reader = InputReader() self.state = input_reader.read(0) self.output_writer = OutputWriter('naive') self.num_rows = self.state['numRows'] self.num_cols = self.state['numCols'] self.num_drones = self.state['numDrones'] self.num_turns = self.state['numTurns'] self.max_payload = self.state['maxPayload'] self.num_product_types = self.state['numProductTypes'] self.product_weights = self.state['productWeights'] self.num_warehouses = self.state['numWarehouses'] # warehouse: liste auf dicts: x, y, items -> itemstock self.warehouse_data = self.state['warehousesData'] # order data: liste auf dicts: x, y, numorders, items self.order_data = self.state['orderData'] # get list of items self.item_lists = numpy.zeros( (len(self.order_data), len(self.product_weights)), dtype=int) self.turns_used = numpy.zeros(self.num_drones) self.drone_location = numpy.zeros((self.num_drones, 2)) for order_idx in numpy.arange(len(self.order_data)): for item in self.order_data[order_idx]['items']: self.item_lists[order_idx][item] += 1 for n in numpy.arange(self.num_drones): self.drone_location[n] = [0, 0] def optimise(self): while True: print self.turns_used[:20] # Do smallest orders first # list of num orders num_orders = [order['numOrders'] for order in self.order_data] idx_smallest_orders = num_orders.index(min(num_orders)) idx_order = idx_smallest_orders print self.item_lists[idx_smallest_orders] coordinates_smallest = (self.order_data[idx_order]['x'], self.order_data[idx_order]['y']) items_order = self.order_data[idx_order]['items'] # get warehouses with items closest to destination that have at least one of the items stocked smallest_dist = 10000 smallest_idx = -1 # get warehouses that stock suitable items suitable_warehouses = [] for warehouse in self.warehouse_data: warehouse_stock = warehouse['items'] for item in items_order: if warehouse_stock[item] > 0: suitable_warehouses.append(warehouse) coordinates_warehouse = (0, 0) # get nearest one to customer for idx, warehouse in enumerate(suitable_warehouses): coordinates_warehouse = (warehouse['x'], warehouse['y']) dist = math.ceil( math.sqrt((coordinates_smallest[0] - coordinates_warehouse[0])**2 + (coordinates_smallest[1] - coordinates_warehouse[1])**2)) if dist < smallest_dist: smallest_dist = dist smallest_idx = idx cur_warehouse = self.warehouse_data[smallest_idx] # assign next drone which hasn't done much so for next_drone_idx = numpy.argmin(self.turns_used) # which stock? warehouse_stock = cur_warehouse['items'] for idx, item in enumerate(self.item_lists[idx_order]): if item > 0: print 'here' if warehouse_stock[item] > 0: # next drone fetch that stock! # how many can it fetch? num_possible = int(self.max_payload[next_drone_idx] * 1. / self.product_weights[item]) num_taken = min([num_possible, warehouse_stock[item]]) # calculate number of turns used # add delivery turn_count = smallest_dist + 1 load_dist = math.ceil( numpy.linalg.norm( self.drone_location[next_drone_idx] - coordinates_warehouse)) turn_count += load_dist + 1 # we are over max turns! if self.turns_used[ next_drone_idx] + turn_count > self.num_turns: self.end() return else: self.turns_used[next_drone_idx] += turn_count # fetch that self.output_writer.writeLoad(next_drone_idx, smallest_idx, item, num_taken) self.output_writer.writeDeliver( next_drone_idx, idx_order, item, num_taken) # decrease warehouse stock warehouse_stock[item] -= num_taken # remove item from list self.item_lists[idx_order][item] -= num_taken # update drone location self.drone_location[ next_drone_idx] = coordinates_smallest print 'here' break def end(self): self.output_writer.endFile()