class CompoundTruck(Truck): """ Compound truck object """ def __init__(self): Truck.__init__(self) self.behaviour_list = ['coming', 'waiting_to_deploy', 'changeover', 'deploying', 'changeover2', 'truck_transfer', 'waiting_to_load', 'changeover3', 'not_ready_to_load', 'ready_to_load', 'must_load', 'loading', 'changeover4', 'done'] self.current_state = 0 self.function_list = [self.coming, self.waiting, self.changeover, self.deploying, self.changeover2, self.truck_transfer, self.waiting_to_load, self.changeover3, self.not_ready_to_load, self.ready_to_load, self.must_load, self.loading, self.changeover4, self.done] self.current_time = 0 self.good = GoodStore() self.needed_goods = {} self.transfer_time = 0 self.lower_bound = 0 self.upper_bound = 0 self.good_amount = 0 def waiting(self): pass def changeover(self): if self.current_time == self.next_state_time: self.next_state() self.next_state_time = self.good.calculate_load_time() + self.current_time self.current_door.next_state() def deploying(self): if self.current_time == self.next_state_time: self.next_state_time = self.changeover_time + self.current_time self.current_door.goods_list.append(copy.deepcopy(self.good)) self.current_door.good_times.append(self.current_time + self.current_door.good_transfer_time) self.good.clear_goods() self.current_door.next_state() self.next_state() def changeover2(self): if self.current_time == self.next_state_time: self.current_door.next_state() self.next_state() self.next_state_time = self.transfer_time + self.current_time self.good = GoodStore() def truck_transfer(self): if self.current_time == self.next_state_time: self.next_state() def waiting_to_load(self): pass def changeover3(self): if self.current_time == self.next_state_time: self.next_state() self.next_state_time = self.transfer_time + self.current_time def not_ready_to_load(self): self.good_amount = sum(self.needed_goods.values()) self.next_state_time = self.good_amount * self.good.loading_time + self.current_time - 1 # if self.lower_bound < self.next_state_time: # self.next_state() # self.current_door.next_state() # elif self.next_state_time > self.upper_bound: # self.current_door.next_state() # self.next_state() self.next_state() self.current_door.next_state() def ready_to_load(self): self.next_state_time = self.good_amount * self.good.loading_time + self.current_time - 1 #if self.next_state_time >= self.upper_bound - self.changeover_time - 1: self.next_state() self.current_door.next_state() def must_load(self): self.next_state_time = self.good_amount * self.good.loading_time + self.current_time - 1 if self.current_door.good_ready: self.next_state() self.current_door.next_state() def loading(self): if self.current_time == self.next_state_time: for goods in self.current_door.goods.good_list.values(): for good in goods: self.good.add_good(good.good_name, good.amount, good.coming_truck_name) self.current_door.goods.clear_goods() self.current_door.next_state() self.next_state_time = self.current_time + self.changeover_time - 1 self.next_state() def changeover4(self): if self.current_time == self.next_state_time: self.next_state() self.current_door.current_state = 0 self.finish_time = self.current_time def done(self): pass
class ShippingDoor(Door): def __init__(self, name, station, door_list): Door.__init__(self, name, station) self.truck_list = [] self.behaviour_list = ['empty', 'waiting_to_load', 'start_loading', 'must_load', 'loading', "waiting"] self.function_list = [self.empty, self.waiting_to_load, self.start_loading, self.must_load, self.loading, self.waiting] self.next_truck_number = 0 self.waiting_name = 'waiting_to_load' self.good_ready = False self.current_goods = [] self.goods = GoodStore() self.transfer_amounts = {} self.door_list = door_list self.critic = False def run(self, current_time): self.current_time = current_time self.function_list[self.current_state]() def empty(self): try: self.truck = self.truck_list[self.next_truck_number] if self.truck.behaviour_list[self.truck.current_state] == self.waiting_name: self.good_ready = False self.current_goods = [] self.transfer_amounts = {} self.needed_goods = [] self.next_state() self.truck.next_state() self.truck.times['waiting_finish'] = self.current_time self.truck.relevant_data = self.door_name self.truck.next_state_time = self.current_time + self.truck.changeover_time self.truck.current_door = self self.next_truck_number += 1 self.needed_goods = self.truck.needed_goods except: pass def waiting_to_load(self): pass #print('waiting_to_load') def start_loading(self): self.check_self() self.transfer_goods(self.station) self.check_ready() if self.check_other_trucks(): self.next_state() self.truck.next_state() def check_other_trucks(self): for i, truck in enumerate(self.truck_list): if i >= self.next_truck_number: if truck.upper_bound < self.current_time: return True return False def must_load(self): self.critic = True self.check_self() self.transfer_goods(self.station) #self.critic_transfer_goods() self.check_ready() def loading(self): pass def check_self(self): self.current_goods = self.goods.good_amounts() for good_name, good_amount in self.needed_goods.items(): if good_name in self.current_goods: if self.current_goods[good_name] >= self.needed_goods[good_name]: self.transfer_amounts[good_name] = 0 continue elif self.current_goods[good_name] < self.needed_goods[good_name]: self.transfer_amounts[good_name] = self.needed_goods[good_name] - self.current_goods[good_name] else: self.transfer_amounts[good_name] = copy.deepcopy(self.needed_goods[good_name]) def transfer_goods(self, transfor_from=None): try: if not self.good_ready: for good_name, good_amount in self.transfer_amounts.items(): remove_goods = transfor_from.goods_list.remove_good(good_name, good_amount) for remove_good in remove_goods: self.goods.add_good(good_name, remove_good[0], remove_good[1]) except: pass def critic_transfer_goods(self): for transfer_from in self.door_list.values(): if not transfer_from == self: if type(transfer_from) is ShippingDoor: if transfer_from.critic == False: self.check_ready() self.check_self() if self.good_ready: break self.transfer_goods(transfer_from) def check_ready(self): if sum(self.transfer_amounts.values()) == 0: self.good_ready = True def waiting(self): self.critic = False
class ShippingDoor(object): """ Shipping doors of the station """ def __init__(self, station, name): self.station = station self.door_name = name self.trpe = 'Shipping' self.truck = None self.status = ['empty', 'loading', 'waiting'] self.status_number = 0 self.good_list = GoodStore() self.sequence = [] self.station = station self.waiting_trucks = 0 self.loading_truck = None self.reserved_goods = GoodStore() self.finish_time = 0 self.current_time = 0 def set_truck_doors(self): for truck in self.sequence: truck.shipping_door = self truck.shipping_door_name = self.door_name def current_action(self, current_time): self.current_time = current_time logging.debug("Reserved goods: {0}".format(self.reserved_goods)) if self.status_number == 0: self.no_truck() if self.status_number == 1: self.load() if self.status_number == 2: self.wait_truck_change() def next_state(self): self.status_number += 1 def no_truck(self): if len(self.sequence) != 0: self.loading_truck = self.sequence[0] if self.loading_truck.state_list[ self.loading_truck.current_state] == 'waiting_to_load': self.loading_truck.next_state() self.next_state() def check_goods(self): """ check if enough in reserved goods :return: """ logging.debug("---Check Goods") logging.debug("---Reserved goods:") for reserved_good in self.reserved_goods.good_list: logging.debug("Amount of reserved {0} : {1}".format( reserved_good, self.reserved_goods.total_good(reserved_good))) logging.debug("---Station goods:") for station_good in self.station.station_goods.good_list: logging.debug("Amount in station{0} : {1}".format( station_good, self.station.station_goods.total_good(station_good))) enough_goods = True for good_name, good_amount in self.loading_truck.going_good_amounts.items( ): good_name = str(good_name) if good_amount == self.reserved_goods.total_good(good_name): logging.debug('Good {0} ready'.format(good_name)) else: enough_goods = enough_goods and False if enough_goods: logging.debug('Enough goods') logging.info('Truck {0} started loading at {1}'.format( self.loading_truck.truck_name, self.current_time)) return enough_goods def reserve_goods(self, good_amounts): """ reserve goods :param good_amounts: :return: """ logging.debug("---Reserve Goods") for good_name, needed_good_amount in good_amounts.items(): good_name = str(good_name) logging.debug("Good name: {0}".format(good_name)) logging.debug("Needed amount: {0}".format(needed_good_amount)) if good_name in self.station.station_goods.good_list: logging.debug("Good in station: {0}".format(good_name)) if good_name in self.reserved_goods.good_list.keys(): logging.debug( "Good reserved before: {0}".format(good_name)) needed_good_amount = needed_good_amount - self.reserved_goods.total_good( good_name) logging.debug("needed amount {0}: {1}".format( good_name, needed_good_amount)) if needed_good_amount == 0: continue moved_amount = self.station.station_goods.move_good( good_name, needed_good_amount) needed_good_amount -= moved_amount self.reserved_goods.add_good(good_name, moved_amount) def reserve_critical_goods(self, good_amounts): self.reserve_goods(good_amounts) if self.check_goods(): return else: for good_name, needed_good_amount in good_amounts.items(): good_name = str(good_name) if good_name in self.reserved_goods.good_list: needed_good_amount -= self.reserved_goods.total_good( good_name) if needed_good_amount == 0: continue moved_amount = 0 for shipping_door in self.station.shipping_doors.values(): if shipping_door == self: break if needed_good_amount == 0: break if good_name in shipping_door.reserved_goods.good_list: moved_amount += shipping_door.reserved_goods.move_good( good_name, needed_good_amount) if moved_amount == 0: return self.reserved_goods.add_good(good_name, moved_amount) def wait_truck_change(self): if self.current_time == self.finish_time: self.status_number = 0 def load_goods(self, current_time): self.current_time = current_time self.loading_truck.going_goods = deepcopy(self.reserved_goods) self.reserved_goods = GoodStore() self.next_state() self.finish_time = current_time + self.loading_truck.changeover_time if self.sequence: self.sequence.pop(0) def load(self): pass # wait for truck
class Station(object): """ Station for the goods to come in and go out. """ def __init__(self, transfer_time): """ Initialize the station by creating doors and types :return: """ self.receiving_doors = {} self.shipping_doors = {} self.not_ready_goods = {} self.station_goods = GoodStore() self.good_transfer_time = transfer_time def add_receiving_door(self): """ creates a receiving door :return: """ name = "recv" + str(len(self.receiving_doors)) door = ReceivingDoor(self, name) self.receiving_doors[name] = door def clear_door_sequences(self): for doors in itertools.chain(self.receiving_doors.values(), self.shipping_doors.values()): doors.sequence = [] def remove_receiving_door(self): """ removes a receiving door from the station :return: """ name = "recv" + str(len(self.receiving_doors) - 1) del self.receiving_doors[name] def add_shipping_door(self): """ creates a shipping door :return: """ name = "ship" + str(len(self.shipping_doors)) door = ShippingDoor(self, name) self.shipping_doors[name] = door def remove_shipping_door(self): """ removes a receiving door from the station :return: """ name = "ship" + str(len(self.shipping_doors) - 1) del self.shipping_doors[name] def check_states(self): logging.debug("station goods") self.station_goods.log_goods() for doors in itertools.chain(self.receiving_doors.values()): if doors.good_list: self.add_goods(doors.good_list) def add_goods(self, good_store, current_time): for goods in good_store.good_list.values(): for good in goods: good.transfer_time = current_time + self.good_transfer_time if good.type in self.not_ready_goods.keys(): self.not_ready_goods[good.type].append(good) else: self.not_ready_goods[good.type] = [] self.not_ready_goods[good.type].append(good) def check_good_transfer(self, current_time): """ check if goods are ready to transfer :return: """ for goods in self.not_ready_goods.values(): for good in goods: if good.transfer_time == current_time: self.station_goods.add_good(good.type, good.amount) logging.debug("Station: Unloading goods from truck") self.check_states() def log_goods(self): total_good = 0 for good_type in self.station_goods.values(): for good_amounts in good_type: total_good += good_amounts.amount # logging.debug("--Station: good type:{0}, amount:{1}".format(good_type[0].type, total_good)) def remove_goods(self, goods): for good in goods: max_item = None moved_good = 0 error = good.amount - moved_good while error > 0: for items in self.station_goods[good.type]: next_item = items if max_item is None or max_item.amount < next_item.amount: max_item = next_item if max_item.amount < error: moved_good += max_item.amount max_item.amount = 0 elif max_item.amount >= error: moved_good += error max_item.amount -= error error = good.amount - moved_good logging.debug("Station: Loading goods to truck") self.log_goods()
class ShippingDoor(object): """ Shipping doors of the station """ def __init__(self, station, name): self.station = station self.door_name = name self.trpe = 'Shipping' self.truck = None self.status = ['empty', 'loading', 'waiting'] self.status_number = 0 self.good_list = GoodStore() self.sequence = [] self.station = station self.waiting_trucks = 0 self.loading_truck = None self.reserved_goods = GoodStore() self.finish_time = 0 self.current_time = 0 def set_truck_doors(self): for truck in self.sequence: truck.shipping_door = self truck.shipping_door_name = self.door_name def current_action(self, current_time): self.current_time = current_time logging.debug("Reserved goods: {0}".format(self.reserved_goods)) if self.status_number == 0: self.no_truck() if self.status_number == 1: self.load() if self.status_number == 2: self.wait_truck_change() def next_state(self): self.status_number += 1 def no_truck(self): if len(self.sequence) != 0: self.loading_truck = self.sequence[0] if self.loading_truck.state_list[self.loading_truck.current_state] == 'waiting_to_load': self.loading_truck.next_state() self.next_state() def check_goods(self): """ check if enough in reserved goods :return: """ logging.debug("---Check Goods") logging.debug("---Reserved goods:") for reserved_good in self.reserved_goods.good_list: logging.debug("Amount of reserved {0} : {1}".format(reserved_good, self.reserved_goods.total_good(reserved_good))) logging.debug("---Station goods:") for station_good in self.station.station_goods.good_list: logging.debug("Amount in station{0} : {1}".format(station_good, self.station.station_goods.total_good(station_good))) enough_goods = True for good_name, good_amount in self.loading_truck.going_good_amounts.items(): good_name = str(good_name) if good_amount == self.reserved_goods.total_good(good_name): logging.debug('Good {0} ready'.format(good_name)) else: enough_goods = enough_goods and False if enough_goods: logging.debug('Enough goods') logging.info('Truck {0} started loading at {1}'.format(self.loading_truck.truck_name, self.current_time)) return enough_goods def reserve_goods(self, good_amounts): """ reserve goods :param good_amounts: :return: """ logging.debug("---Reserve Goods") for good_name, needed_good_amount in good_amounts.items(): good_name = str(good_name) logging.debug("Good name: {0}".format(good_name)) logging.debug("Needed amount: {0}".format(needed_good_amount)) if good_name in self.station.station_goods.good_list: logging.debug("Good in station: {0}".format(good_name)) if good_name in self.reserved_goods.good_list.keys(): logging.debug("Good reserved before: {0}".format(good_name)) needed_good_amount = needed_good_amount - self.reserved_goods.total_good(good_name) logging.debug("needed amount {0}: {1}".format(good_name, needed_good_amount)) if needed_good_amount == 0: continue moved_amount = self.station.station_goods.move_good(good_name, needed_good_amount) needed_good_amount -= moved_amount self.reserved_goods.add_good(good_name, moved_amount) def reserve_critical_goods(self, good_amounts): self.reserve_goods(good_amounts) if self.check_goods(): return else: for good_name, needed_good_amount in good_amounts.items(): good_name = str(good_name) if good_name in self.reserved_goods.good_list: needed_good_amount -= self.reserved_goods.total_good(good_name) if needed_good_amount == 0: continue moved_amount = 0 for shipping_door in self.station.shipping_doors.values(): if shipping_door == self: break if needed_good_amount == 0: break if good_name in shipping_door.reserved_goods.good_list: moved_amount += shipping_door.reserved_goods.move_good(good_name, needed_good_amount) if moved_amount == 0: return self.reserved_goods.add_good(good_name, moved_amount) def wait_truck_change(self): if self.current_time == self.finish_time: self.status_number = 0 def load_goods(self, current_time): self.current_time = current_time self.loading_truck.going_goods = deepcopy(self.reserved_goods) self.reserved_goods = GoodStore() self.next_state() self.finish_time = current_time + self.loading_truck.changeover_time if self.sequence: self.sequence.pop(0) def load(self): pass # wait for truck
class Station(object): """ Station for the goods to come in and go out. """ def __init__(self, transfer_time): """ Initialize the station by creating doors and types :return: """ self.receiving_doors = {} self.shipping_doors = {} self.not_ready_goods = {} self.station_goods = GoodStore() self.good_transfer_time = transfer_time def add_receiving_door(self): """ creates a receiving door :return: """ name = 'recv' + str(len(self.receiving_doors)) door = ReceivingDoor(self, name) self.receiving_doors[name] = door def clear_door_sequences(self): for doors in itertools.chain(self.receiving_doors.values(), self.shipping_doors.values()): doors.sequence = [] def remove_receiving_door(self): """ removes a receiving door from the station :return: """ name = 'recv' + str(len(self.receiving_doors) - 1) del self.receiving_doors[name] def add_shipping_door(self): """ creates a shipping door :return: """ name = 'ship' + str(len(self.shipping_doors)) door = ShippingDoor(self, name) self.shipping_doors[name] = door def remove_shipping_door(self): """ removes a receiving door from the station :return: """ name = 'ship' + str(len(self.shipping_doors) - 1) del self.shipping_doors[name] def check_states(self): logging.debug("station goods") self.station_goods.log_goods() for doors in itertools.chain(self.receiving_doors.values()): if doors.good_list: self.add_goods(doors.good_list) def add_goods(self, good_store, current_time): for goods in good_store.good_list.values(): for good in goods: good.transfer_time = current_time + self.good_transfer_time if good.type in self.not_ready_goods.keys(): self.not_ready_goods[good.type].append(good) else: self.not_ready_goods[good.type] = [] self.not_ready_goods[good.type].append(good) def check_good_transfer(self, current_time): """ check if goods are ready to transfer :return: """ for goods in self.not_ready_goods.values(): for good in goods: if good.transfer_time == current_time: self.station_goods.add_good(good.type, good.amount) logging.debug("Station: Unloading goods from truck") self.check_states() def log_goods(self): total_good = 0 for good_type in self.station_goods.values(): for good_amounts in good_type: total_good += good_amounts.amount # logging.debug("--Station: good type:{0}, amount:{1}".format(good_type[0].type, total_good)) def remove_goods(self, goods): for good in goods: max_item = None moved_good = 0 error = good.amount - moved_good while error > 0: for items in self.station_goods[good.type]: next_item = items if max_item is None or max_item.amount < next_item.amount: max_item = next_item if max_item.amount < error: moved_good += max_item.amount max_item.amount = 0 elif max_item.amount >= error: moved_good += error max_item.amount -= error error = good.amount - moved_good logging.debug("Station: Loading goods to truck") self.log_goods()
class Truck(): def __init__(self): self.element_name = "" self.truck_type = "" self.truck_times = OrderedDict() self.state_functions = OrderedDict() self.truck_states = [] self.state_change = False self.coming_time = 0 self.changeover_time = 0 self.good_loading_time = 0 self.good_unloading_time = 0 self.good_transfer_time = 0 self.station = 0 self.lower_boundary = 0 self.upper_boundary = 0 self.coming_good_store = GoodStore() self.going_good_store = GoodStore() self.coming_good_dict = dict() self.going_good_dict = dict() self.state = 0 self.current_time = 0 self.truck_results = TruckResults() self.first_door = "" self.second_door = "" self.current_door = "" self.next_state_time = 0 self.simulation_state = 0 self.truck_transfer_time = 0 # define state functions self.state_functions["coming"] = self.coming self.state_functions["waiting_to_deploy"] = self.waiting_to_deploy self.state_functions["waiting_to_load"] = self.waiting_to_load self.state_functions["changeover_load"] = self.changeover_load self.state_functions["changeover_deploy"] = self.changeover_deploy self.state_functions["deploying"] = self.deploying self.state_functions["changeover_fin"] = self.changeover_fin self.state_functions["changeover_mid"] = self.changeover_mid self.state_functions["not_enough_goods"] = self.not_enough_goods self.state_functions["loading"] = self.loading self.state_functions["done"] = self.done def add_good_types(self, number_of_goods): for i in range(number_of_goods): self.coming_good_store.add_good_type(i) def add_start_goods(self, start_goods): for i in range(len(start_goods)): self.coming_good_dict[str(i)] = start_goods[i] self.coming_good_store.add_good(start_goods[i], str(i), self.element_name) def add_last_goods(self, last_goods): for i in range(len(last_goods)): self.going_good_dict[str(i)] = last_goods[i] self.going_good_store.add_good_type(str(i)) def show_goods(self): """shows goods of the truck in a dialog""" print("show goods: ", self.element_name) good_dialog = QMessageBox() good_dialog.setWindowTitle("Goods of " + self.element_name) message = "Current Coming Goods:\n" message += self.coming_good_store.print_goods() message += "\nCurrent Going Goods:\n" message += self.going_good_store.print_goods() message += "\nPlanned Going Goods:\n" message += str(self.going_good_dict) good_dialog.setText(message) good_dialog.exec_() def show_times (self): """shows the times of the truck""" good_dialog = QMessageBox() good_dialog.setWindowTitle("Times of " + self.element_name) message = "" for state_name, state_time in self.truck_times.items(): message += state_name message += ": " message += str(state_time) message += "\n" message += "\n" message += "Current State: " message += self.state_list[self.state] message += "\n" message += "Next State: " if self.state < len(self.state_list) - 1: message += self.state_list[self.state + 1] message += "\n" message += "Next state Time: " message += str(self.next_state_time) message += "\n" good_dialog.setText(message) good_dialog.exec_() def return_truck_results(self): self.truck_results.truck_name = self.element_name self.truck_results.truck_type = self.truck_type self.truck_results.times = self.truck_times self.truck_results.coming_goods = self.coming_good_store self.truck_results.going_goods = self.going_good_store return self.truck_results def step(self): """ one tep forward """ state_name = self.state_list[self.state] self.state_change = False self.state_functions[state_name]() if self.state_change: return self.next_state_time else: return 0 def check_next_state_time (self): """check next if time for next state has come""" if self.current_time == self.next_state_time: return True else: return False def coming (self): """truck coming""" if self.check_next_state_time(): self.truck_times["arrival"] = self.current_time if self.current_door.check_door(self.element_name): self.state += 2 self.next_state_time = self.current_time + self.changeover_time else: self.state += 1 self.next_state_time = -1 self.state_change = True else: pass def next_state(self): """ called at every next state """ self.state += 1 self.state_change = True def waiting_to_deploy (self): """waiting to deploy goods for inboudn and compound trucks""" self.simulation_state = 1 if self.current_door.check_door(self.element_name): self.truck_times["started entering receiving door"] = self.current_time self.next_state() self.next_state_time = self.current_time + self.changeover_time def waiting_to_load (self): """ waiting to load for outbound and compound trucks """ self.simulation_state = 2 if self.current_door.check_door(self.element_name): self.truck_times["started entering shipping door"] = self.current_time self.next_state() self.next_state_time = self.current_time + self.changeover_time def changeover_load(self): """ changeover time for inbound and compound while loading """ self.simulation_state = 2 if self.check_next_state_time(): self.truck_times["at the shipping door"] = self.current_time if self.station.good_store.check_enough(self.going_good_dict): removed = self.station.good_store.remove_good(self.going_good_dict) self.going_good_store.add_good_dict(removed) self.state += 2 total_good = 0 self.truck_times["started loading"] = self.current_time for good_amount in self.going_good_dict.values(): total_good += good_amount self.next_state_time = self.current_time + self.good_loading_time * total_good else: self.state += 1 self.truck_times["not enough goods"] = self.current_time self.next_state_time = -1 self.state_change = True def changeover_deploy(self): """ changeover time for outbound and compound while deploying """ self.simulation_state = 1 if self.check_next_state_time(): self.truck_times["started deploying goods"] = self.current_time self.next_state() self.next_state_time = self.current_time + self.coming_good_store.calculate_total() * self.good_unloading_time def changeover_fin(self): """ changeover after process finished for all trucks """ if self.check_next_state_time(): self.current_door.door_empty = True self.truck_times["departed from the door"] = self.current_time self.truck_times["done"] = self.current_time self.next_state() def changeover_mid(self): """ changeover at mid for compound trucks """ if self.check_next_state_time(): self.current_door.door_empty = True self.current_door = self.second_door self.truck_times["started going to shipping side"] = self.current_time self.next_state_time = self.current_time + self.truck_transfer_time self.next_state() def not_enough_goods(self): """ waiting for enough goods to load """ if self.station.good_store.check_enough(self.going_good_dict): removed = self.station.good_store.remove_good(self.going_good_dict) self.going_good_store.add_good_dict(removed) total_good = 0 for good_amount in self.going_good_dict.values(): total_good += good_amount self.next_state_time = self.current_time + self.good_loading_time * total_good self.truck_times["started loading"] = self.current_time self.next_state() def loading(self): """ waiting to load goods """ if self.check_next_state_time(): self.next_state_time = self.current_time + self.changeover_time self.truck_times["finished loading"] = self.current_time self.next_state() def deploying(self): """ deploying for inbound and compound trucks """ if self.check_next_state_time(): self.current_door.transfer_finished = True self.current_door.good_store.add_good_dict(self.coming_good_store.good_dictionary) self.current_door.good_transfer_time = self.current_time + self.good_transfer_time self.coming_good_store.reset_goods() self.next_state_time = self.current_time + self.changeover_time self.truck_times["finished deploying"] = self.current_time self.next_state() def done(self): """ done for all trucks set the done signal """ self.simulation_state = 3
from src.good_store import GoodStore good_store = GoodStore() good_store.add_good_type(0) good_store.add_good_type(1) good_store.add_good_type(3) print(good_store.good_amounts) print(good_store.good_dictionary) good_store.add_good(50, 0, 'inbound0') good_store.add_good(50, 0, 'inbound1') print(good_store.good_amounts) print(good_store.good_dictionary) good_store.add_good(200, 2, 'inbound0') good_store.add_good(200, 1, 'inbound0') print(good_store.good_amounts) print(good_store.good_dictionary) remove_dict = {0: 100, 1: 200, 2:100} removed = good_store.remove_good(remove_dict) print(removed) print(good_store.good_amounts) print(good_store.good_dictionary) for good_list in removed.values(): good_list.print_goods() good_store.add_good_dict(removed) print(good_store.good_amounts)