def __init__(self, name):
     self.element_name = name
     self.truck_list = []
     self.door_empty = True
     self.good_store = GoodStore()
     self.good_transfer_time = 0
     self.transfer_finished = False
     self.station = 0
Example #2
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)
Example #3
0
    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
Example #4
0
 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
Example #5
0
    def __init__(self, truck_data, inbound_data):
        Truck.__init__(self, truck_data)
        self.truck_type = 0
        self.state_list = ('coming', 'waiting', 'start_deploy', 'deploying', 'done')

        self.arrival_time = inbound_data['arrival_time']
        self.mu = inbound_data['mu']
        self.product_per_truck = inbound_data['product_per_truck']

        self.inbound_gdj = 0
        self.door_number = 0
        self.receive_door = 0
        self.coming_good_amounts = {}
        self.bounds = 0
        self.coming_goods = GoodStore()
class ReceivingDoor():

    def __init__(self, name):
        self.element_name = name
        self.truck_list = []
        self.door_empty = True
        self.good_store = GoodStore()
        self.good_transfer_time = 0
        self.transfer_finished = False
        self.station = 0

    def check_door(self, truck_name):
        """
        check if its time for the truck
        """
        if self.door_empty:
            if self.truck_list:
                if truck_name == self.truck_list[0]:
                    self.truck_list.pop(0)
                    self.door_empty = False
                    return True
            else:
                return False
        else:
            return False

    def transfer_goods_to_station(self, current_time):
        if current_time == self.good_transfer_time:
            self.station.good_store.add_good_dict(self.good_store.good_dictionary)
            self.good_store.reset_goods()

        if self.transfer_finished:
            self.transfer_finished = False
            return self.good_transfer_time
        else:
            return -1

    def show_sequence(self):
        """shows goods of the truck in a dialog"""
        print("show goods: ", self.element_name)
        good_dialog = QMessageBox()
        good_dialog.setWindowTitle("Sequence of " + self.element_name)
        message = str(self.truck_list)

        good_dialog.setText(message)
        good_dialog.exec_()
Example #7
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 __init__(self):
     Truck.__init__(self)
     self.behaviour_list = ['coming', 'waiting_to_load', 'changeover', 'not_ready_to_load', 'ready_to_load', 'must_load', 'loading', 'changeover2', 'done']
     self.current_state = 0
     self.function_list = [self.coming, self.waiting_to_load, self.changeover, self.not_ready_to_load, self.ready_to_load, self.must_load, self.loading, self.changeover2, self.done]
     self.current_time = 0
     self.good = GoodStore()
     self.needed_goods = {}
     self.lower_bound = 0
     self.upper_bound = 0
     self.good_amount = 0
Example #9
0
    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
Example #10
0
    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 __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
Example #12
0
 def __init__(self, truck_data, outbound_data):
     Truck.__init__(self, truck_data)
     self.truck_type = 1
     self.state_list = ('coming', 'waiting_to_load', 'not_ready_to_load', 'ready_to_load', 'must_load', 'loading', 'done')
     self.going_goods = GoodStore()
     self.going_good_amounts = {}
     self.finish_time = 0
     self.outbound_gdj = 0
     self.shipping_door = 0
     self.shipping_door_name = None
     self.arrival_time = outbound_data['arrival_time']
     self.mu = outbound_data['mu']
     self.product_per_truck = outbound_data['product_per_truck']
Example #13
0
    def __init__(self, truck_data, compound_data):
        Truck.__init__(self, truck_data)
        self.truck_type = 2
        self.state_list = ('coming', 'waiting', 'start_deploy', 'deploying', 'transfering', 'waiting_to_load', 'not_needed_to_load', 'ready_to_load', 'must_load', 'loading', 'done')
        self.coming_goods = GoodStore()
        self.going_goods = GoodStore()

        self.coming_good_amounts = {}
        self.going_good_amounts = {}
        self.inbound_gdj = 0
        self.outbound_gdj = 0
        self.finish_time = 0
        self.receiving_door = 0
        self.shipping_door = 0
        self.receiving_door_name = None
        self.shipping_door_name = None

        # compound truck data
        self.arrival_time = compound_data['arrival_time']
        self.mu = compound_data['mu']
        self.transfer_time = compound_data['transfer_time']
        self.inbound_product_per_truck = compound_data['inbound_product_per_truck']
        self.outbound_product_per_truck = compound_data['outbound_product_per_truck']
class InboundTruck(Truck):
    """
    Inbound truck object
    """
    def __init__(self):
        Truck.__init__(self)
        self.behaviour_list = ['coming', 'waiting_to_deploy', 'changeover', 'deploying', 'changeover2', 'done']
        self.function_list = [self.coming, self.waiting, self.changeover, self.deploying, self.changeover2, self.done]

        self.good = GoodStore()

    def waiting(self):
        pass

    def changeover(self):
        if self.current_time == self.next_state_time:
            self.next_state()
            self.current_door.next_state()
            self.next_state_time = self.good.calculate_load_time() + self.current_time

    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 - 1)
            self.good.clear_goods()
            self.current_door.next_state()
            self.next_state()

    def changeover2(self):
        if self.current_time == self.next_state_time:
            self.next_state()
            self.current_door.next_state()
            self.finish_time = self.current_time

    def done(self):
        pass
Example #15
0
 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
Example #16
0
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()
Example #17
0
class CompoundTruck(Truck):
    """
    compound truck class
    """
    def __init__(self, truck_data, compound_data):
        Truck.__init__(self, truck_data)
        self.truck_type = 2
        self.state_list = ('coming', 'waiting', 'start_deploy', 'deploying', 'transfering', 'waiting_to_load', 'not_needed_to_load', 'ready_to_load', 'must_load', 'loading', 'done')
        self.coming_goods = GoodStore()
        self.going_goods = GoodStore()

        self.coming_good_amounts = {}
        self.going_good_amounts = {}
        self.inbound_gdj = 0
        self.outbound_gdj = 0
        self.finish_time = 0
        self.receiving_door = 0
        self.shipping_door = 0
        self.receiving_door_name = None
        self.shipping_door_name = None

        # compound truck data
        self.arrival_time = compound_data['arrival_time']
        self.mu = compound_data['mu']
        self.transfer_time = compound_data['transfer_time']
        self.inbound_product_per_truck = compound_data['inbound_product_per_truck']
        self.outbound_product_per_truck = compound_data['outbound_product_per_truck']

    def calculate_twogd(self):
        """
        calculates upper limit for coming times
        :return:
        """
        self.two_gdj = (2 * self.mu * self.tightness_factor * self.inbound_product_per_truck) / (2 - self.tightness_factor * self.mu * self.makespan_factor)

    def calculate_gdj(self):
        """
        calculate gdj
        :return:
        """
        self.calculate_twogd()
        self.inbound_gdj = int(uniform(self.arrival_time, self.two_gdj))
        self.outbound_gdj = self.inbound_gdj + (self.mu - 1) * self.changeover_time + self.mu * self.inbound_product_per_truck * self.loading_time + self.transfer_time
        A = self.inbound_gdj + (self.mu - 1) * self.changeover_time + self.mu * self.inbound_product_per_truck * self.loading_time + self.transfer_time +(self.mu - 1) * self.changeover_time + self.mu * self.outbound_product_per_truck * self.loading_time
        self.bounds = [A * self.alpha, A*(self.gamma)]
        self.finish_time = self.inbound_gdj

    def load_gdj(self):
        pass

    def current_action(self, current_time):
        self.log_truck()

        self.current_time = current_time
        if self.current_state == 0:
            self.coming()
        if self.current_state == 1:
            self.waiting_deploying()
        if self.current_state == 2:
            self.start_deploy()
        if self.current_state == 3:
            self.deploy_goods()
        if self.current_state == 4:
            self.transfering()
        if self.current_state == 5:
            self.waiting_loading()
        if self.current_state == 6:
            self.not_ready_to_load()
        if self.current_state == 7:
            self.ready_to_load()
        if self.current_state == 8:
            self.must_load()
        if self.current_state == 9:
            self.loading_goods()
        if self.current_state == 10:
            self.leaving()

    def not_ready_to_load(self):
        """
        check if loading time is later than lower bound
        """
        self.good_amounts = 0
        for good_amount in self.going_good_amounts.values():
            self.good_amounts += good_amount

        self.time_to_load = self.good_amounts * self.loading_time
        load_finish = self.current_time + self.time_to_load

        if load_finish < self.bounds[0]:
            logging.debug("Not ready to load: {0}".format(self.truck_name))

        elif load_finish < self.bounds[1]:
            logging.debug("Ready to load: {0}".format(self.truck_name))
            self.next_state()
        elif load_finish >= self.bounds[1]:
            self.current_state = 8

    def ready_to_load(self):
        """
        rezerve goods needed, check if must load
        """

        logging.debug("Ready to load: {0}".format(self.truck_name))
        logging.debug("Going good amounts {0}: {1}".format(self.truck_name, self.going_good_amounts))
        self.shipping_door.reserve_goods(self.going_good_amounts)
        self.finish_time = self.current_time + self.time_to_load
        logging.debug("Loading finish {0}: {1}".format(self.truck_name, self.finish_time))
        if self.shipping_door.check_goods():
            self.current_state = 9
            logging.info('Truck {0} started loading at {1}'.format(self.truck_name, self.current_time))
        elif self.finish_time >= self.bounds[1]:
            self.next_state()
        #
        # if self.shipping_door.check_goods():
        #     self.current_state = 9
        #     self.finish_time = self.current_time + self.time_to_load
        # elif load_finish >= self.bounds[1]:
        #     self.finish_time = self.current_time + self.time_to_load
        #     self.next_state()

    def must_load(self):
        """
        must load goods, move goods, wait for finish time
        """
        logging.debug("Must to load: {0}".format(self.truck_name))
        load_finish = self.current_time + self.time_to_load
        self.shipping_door.reserve_critical_goods(self.going_good_amounts)
        self.finish_time = self.current_time + self.time_to_load
        if self.shipping_door.check_goods():
            self.next_state()

    def loading_goods(self):

        if self.current_time == self.finish_time:
            logging.info('Truck {0} finished loading at {1}'.format(self.truck_name, self.current_time))
            self.shipping_door.load_goods(self.current_time)
            self.next_state()

    def start_deploy(self):
        logging.info('Truck {0} started unloading goods at {1}'.format(self.truck_name, self.current_time))
        total = 0
        logging.debug("----Deploy goods:")
        total += self.coming_goods.total()
        self.finish_time = int(self.current_time + total * self.loading_time)
        logging.debug("----Finish time: {0}".format(self.finish_time))
        self.next_state()

    def deploy_goods(self):

        if self.current_time == self.finish_time:
            logging.info('Truck {0} finished unloading goods at {1}'.format(self.truck_name, self.current_time))
            self.receiving_door.deploy_goods(self.coming_goods, self.current_time)
            self.next_state()
            self.finish_time = self.current_time + self.transfer_time + self.changeover_time

    def waiting_deploying(self):
        pass

    def coming(self):
        if self.current_time == self.inbound_gdj:
            self.next_state()

    def waiting_loading(self):
        pass

    def transfering(self):
        if self.current_time == self.finish_time:
            self.next_state()

    def leaving(self):
        pass

    def calculate_error(self):
        """
        calculate error values
        """
        logging.info("truck {0}, finish time {1}, bounds {2}".format(self.truck_name, self.finish_time, self.bounds))
        if self.bounds[0] <= self.finish_time <= self.bounds[1]:
            self.error = 0
        elif self.finish_time < self.bounds[0]:
            self.error = self.finish_time - self.bounds[0]
        else:
            self.error = self.finish_time - self.bounds[1]
Example #18
0
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
 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()
Example #20
0
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(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
Example #22
0
 def __init__(self):
     self.good_store = GoodStore()
 def __init__(self):
     self.truck_type = ""
     self.truck_name = ""
     self.times = dict()
     self.coming_goods = GoodStore()
     self.going_goods = GoodStore()
Example #24
0
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
Example #25
0
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
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
Example #27
0
class InboundTruck(Truck):
    """
    inbound truck class
    """
    def __init__(self, truck_data, inbound_data):
        Truck.__init__(self, truck_data)
        self.truck_type = 0
        self.state_list = ('coming', 'waiting', 'start_deploy', 'deploying', 'done')

        self.arrival_time = inbound_data['arrival_time']
        self.mu = inbound_data['mu']
        self.product_per_truck = inbound_data['product_per_truck']

        self.inbound_gdj = 0
        self.door_number = 0
        self.receive_door = 0
        self.coming_good_amounts = {}
        self.bounds = 0
        self.coming_goods = GoodStore()

    def calculate_gdj(self):
        self.calculate_twogd()
        self.inbound_gdj = int(uniform(self.arrival_time, self.two_gdj))
        self.finish_time = self.inbound_gdj

    def load_gdj(self):
        pass

    def current_action(self, current_time):
        self.log_truck()
        self.current_time = current_time
        if self.current_state == 0:
            self.coming()
        if self.current_state == 1:
            self.waiting()
        if self.current_state == 2:
            self.start_deploy()
        if self.current_state == 3:
            self.deploy_goods()
        if self.current_state == 4:
            self.leaving()

    def start_deploy(self):
        logging.info('Truck {0} started unloading goods at {1}'.format(self.truck_name, self.current_time))
        total = 0
        logging.debug("----Deploy goods:")
        total += self.coming_goods.total()

        self.finish_time = int(self.current_time + total * self.loading_time)
        logging.debug("----Finish time: {0}".format(self.finish_time))
        self.next_state()

    def deploy_goods(self):
        if self.current_time == self.finish_time:
            logging.info('Truck {0} finished unloading goods at {1}'.format(self.truck_name, self.current_time))
            self.receiving_door.deploy_goods(self.coming_goods, self.current_time)
            self.next_state()

    def coming(self):
        if self.current_time == self.inbound_gdj:
            self.next_state()

    def leaving(self):
        pass
        
    def waiting(self):
        pass
    def __init__(self):
        Truck.__init__(self)
        self.behaviour_list = ['coming', 'waiting_to_deploy', 'changeover', 'deploying', 'changeover2', 'done']
        self.function_list = [self.coming, self.waiting, self.changeover, self.deploying, self.changeover2, self.done]

        self.good = GoodStore()
Example #29
0
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)