-
Notifications
You must be signed in to change notification settings - Fork 0
/
warehouse_manager.py
107 lines (86 loc) · 4.67 KB
/
warehouse_manager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
from Queue import Queue
from drone import DeliveryDrone, AssistantDrone
from simulation import Simulation
from warehouse import Warehouse
import sys
from data_reader import read_data
from collections import Counter, defaultdict as dd
from kmeans import assign_orders_and_drones_to_warehouses
class WarehouseManager(object):
def __init__(self, num_of_drones, warehouse_drone_nums, warehouse_order_ids, warehouse_info, order_info, drone_load):
self.warehouses = WarehouseManager.create_warehouses(warehouse_info)
self.delivery_drones, self.assistant_drones = self.initialize_drones(num_of_drones,
warehouse_drone_nums,
self.warehouses)
self.assign_orders_to_warehouse(warehouse_order_ids)
self.simulation = Simulation()
self.order_info = order_info
self.drone_load = drone_load
@staticmethod
def create_warehouses(warehouse_info):
return [Warehouse(i, w['loc'], w['stock']) for i, w in enumerate(warehouse_info.values())]
def initialize_drones(self, num_of_drones, warehouse_drone_nums, warehouses):
delivery_drones = []
assistant_drones = []
i = 0
for w_id, (delivery_drone_count, assistant_drone_count) in warehouse_drone_nums.iteritems():
delivery_drone_count = int(delivery_drone_count)
assistant_drone_count = int(assistant_drone_count)
ddrones = [DeliveryDrone(c) for c in xrange(i, i+delivery_drone_count)]
map(lambda d: self.simulation.schedule_event(d.go(warehouses[w_id].loc)), ddrones)
delivery_drones.extend(ddrones)
i += delivery_drone_count
asdrones = [AssistantDrone(c) for c in xrange(i, i+assistant_drone_count)]
map(lambda d: self.simulation.schedule_event(d.go(warehouses[w_id].loc)), asdrones)
assistant_drones.extend(ddrones)
i += assistant_drone_count
# TODO: It seems like this is an error (syntactically)
warehouses[w_id].assign_drones(ddrones + asdrones)
return delivery_drones, assistant_drones
def assign_orders_to_warehouse(self, warehouse_order_ids):
for warehouse_id, orders in warehouse_order_ids.iteritems():
self.warehouses[warehouse_id].assign_orders(orders)
def schedule_remaining_orders_in_the_warehouse(self, warehouse):
drones = warehouse.drones
unassigned_drones = Queue()
for drone in drones:
unassigned_drones.put(drone)
orders = warehouse.orders
inventory = warehouse.stock
def is_satisfiable(order):
order_as_array = [self.order_info[order][product_id] for product_id in self.order_info[order].keys()]
return all(map(lambda x: x[0] >= x[1], zip(inventory, order_as_array)))
for order in orders:
if is_satisfiable(order):
next_unassigned_drone = unassigned_drones.get()
if next_unassigned_drone
def start_delivering(self, order_info):
# Not Finished
for warehouse in self.warehouses:
for order in warehouse.orders:
if order in warehouse.stock:
pass
def transfer_remaining_orders_to_warehouses(self):
# find the closest warehouse pairs.
w2w_distances = Warehouse.calc_w2w_distances(self.warehouses)
orders = dd(list)
for w in self.warehouses:
for order in w.orders:
for product in order:
# product id
w1 = Warehouse.find_product_closest_warehouse(product, w2w_distances[w.id])
# key: (from_warehouse, to_warehouse)
orders[(w1.id, w.id)].append(product)
optimized_orders = {}
for k, order_list in orders.iteritems():
optimized_orders[k] = Counter(order_list)
def main():
simulation_parameters, weights, warehouse_info, order_info, order_location_matrix = read_data(sys.argv[1])
r, c, d, sim_deadline, drone_load = simulation_parameters
warehouse_drone_nums, warehouse_order_ids = assign_orders_and_drones_to_warehouses(simulation_parameters, weights,
warehouse_info,
order_info, order_location_matrix)
manager = WarehouseManager(d, warehouse_drone_nums, warehouse_order_ids, warehouse_info, order_info, drone_load)
manager.start_delivering(order_info)
if __name__ == '__main__':
main()