Esempio n. 1
0
    def set_transition_constrs(self):
        self.constrs['transition'] = []

        for k in range(self.num_futures):
            for h in range(1, self.problem.horizon):
                xindices = [
                    self.var_to_idx[x, k, h - 1]
                    for x in self.inst_params['xs']
                ]
                aindices = [
                    self.var_to_idx[a, k, h - 1] for a in self.problem.actions
                ]
                num_xs = len(xindices)

                for x in self.inst_params['xs']:
                    clique = MRFClique([self.var_to_idx[x, k, h]])
                    determinized_val = 1 if random.random() < 0.5 else 0
                    utils.append_function_entry(clique, 0, 0, determinized_val)
                    utils.append_function_entry(clique, 1, 0, determinized_val)
                    self.constrs['transition'].append(clique)

                for y in self.inst_params['ys']:
                    var_indices = [
                        self.var_to_idx[y, k, h], self.var_to_idx[y, k, h - 1]
                    ]
                    var_indices.extend(xindices)
                    var_indices.extend(aindices)
                    clique = MRFClique(var_indices)
                    for bitmask in range(2**len(var_indices)):
                        if utils.is_set(bitmask, 1):
                            utils.append_function_entry(clique, bitmask, 0, 1)
                            continue

                        matched = True
                        for i in range(2, 2 + num_xs):
                            if utils.is_set(bitmask, i) != utils.is_set(
                                    bitmask, i + num_xs):
                                matched = False
                                break
                        if matched and random.random() < 0.49:
                            utils.append_function_entry(clique, bitmask, 0, 1)
                        else:
                            utils.append_function_entry(clique, bitmask, 0, 0)
                    self.constrs['transition'].append(clique)

        logger.info('set_transition_constraints')
Esempio n. 2
0
    def set_elevator_closed_transition(self, k, h):
        for elevator in self.inst_params['elevators']:
            var_indices = [self.get_elevator_closed_state(elevator),
                           self.get_elevator_closed_state(elevator),
                           self.get_open_door_action(elevator, 'up'),
                           self.get_open_door_action(elevator, 'down'),
                           self.get_close_door_action(elevator)]
            var_indices[0] = self.var_to_idx[var_indices[0], k, h]
            var_indices[1:] = [self.var_to_idx[v, k, h - 1] for v in var_indices[1:]]

            clique = MRFClique(var_indices)
            for bitmask in range(2**len(var_indices)):
                if utils.is_set(bitmask, 1) and not utils.is_set(bitmask, 2) \
                        and not utils.is_set(bitmask, 3) and utils.is_set(bitmask, 4):
                    utils.append_function_entry(clique, bitmask, 0, 1)
                else:
                    utils.append_function_entry(clique, bitmask, 0, 0)
            self.constrs['transition'].append(clique)
Esempio n. 3
0
    def set_elevator_dir_up_transition(self, k, h):
        for elevator in self.inst_params['elevators']:
            var_indices = [self.get_elevator_dir_state(elevator, 'up'),
                           self.get_elevator_dir_state(elevator, 'up'),
                           self.get_open_door_action(elevator, 'up'),
                           self.get_open_door_action(elevator, 'down')]
            var_indices[0] = self.var_to_idx[var_indices[0], k, h]
            var_indices[1:] = [self.var_to_idx[v, k, h - 1] for v in var_indices[1:]]
            clique = MRFClique(var_indices)
            for bitmask in range(2**len(var_indices)):
                if utils.is_set(bitmask, 2):
                    utils.append_function_entry(clique, bitmask, 0, 1)
                    continue

                if utils.is_set(bitmask, 3):
                    utils.append_function_entry(clique, bitmask, 0, 0)
                    continue

                val = 1 if utils.is_set(bitmask, 1) else 0
                utils.append_function_entry(clique, bitmask, 0, val)
            self.constrs['transition'].append(clique)
Esempio n. 4
0
    def set_elevator_at_floor_transition(self, k, h):
        for elevator in self.inst_params['elevators']:
            for floor in self.inst_params['floors']:
                adjacent_floors = []
                upper_floor_idx = len(adjacent_floors) if floor in self.inst_params['ADJACENT-UP'] else None
                if upper_floor_idx is not None:
                    adjacent_floors.append(self.inst_params['ADJACENT-UP'][floor])
                lower_floor_idx = len(adjacent_floors) if floor in self.inst_params['ADJACENT-DOWN'] else None
                if lower_floor_idx is not None:
                    adjacent_floors.append(self.inst_params['ADJACENT-DOWN'][floor])

                elevator_at_floor = self.get_elevator_at_state(elevator, floor)
                elevator_closed = self.get_elevator_closed_state(elevator)
                elevator_dir_up = self.get_elevator_dir_state(elevator, 'up')
                move_cur_dir = self.get_move_current_dir_action(elevator)
                at_adjacent_floors = [self.get_elevator_at_state(elevator, fl) for fl in adjacent_floors]

                var_indices = [elevator_at_floor, elevator_at_floor,
                               elevator_closed, elevator_dir_up, move_cur_dir]
                var_indices += at_adjacent_floors
                var_indices[0] = self.var_to_idx[var_indices[0], k, h]
                var_indices[1:] = [self.var_to_idx[v, k, h - 1] for v in var_indices[1:]]
                adjacent_floors_offset = 5

                clique = MRFClique(var_indices)
                for bitmask in range(2**len(var_indices)):
                    prev_val = utils.btoi(utils.is_set(bitmask, 1))

                    if not utils.is_set(bitmask, 2) or not utils.is_set(bitmask, 4):
                        utils.append_function_entry(clique, bitmask, 0, prev_val)
                        continue

                    if utils.is_set(bitmask, 4) and utils.is_set(bitmask, 3):
                        if lower_floor_idx is not None:
                            if utils.is_set(bitmask, adjacent_floors_offset + lower_floor_idx):
                                utils.append_function_entry(clique, bitmask, 0, 1)
                            else:
                                utils.append_function_entry(clique, bitmask, 0, 0)
                        else:
                            utils.append_function_entry(clique, bitmask, 0, prev_val)
                        continue

                    if utils.is_set(bitmask, 4) and not utils.is_set(bitmask, 3):
                        if upper_floor_idx is not None:
                            if utils.is_set(bitmask, adjacent_floors_offset + upper_floor_idx):
                                utils.append_function_entry(clique, bitmask, 0, 1)
                            else:
                                utils.append_function_entry(clique, bitmask, 0, 0)
                        else:
                            utils.append_function_entry(clique, bitmask, 0, prev_val)
                        continue

                    utils.append_function_entry(clique, bitmask, 0, prev_val)

                self.constrs['transition'].append(clique)
Esempio n. 5
0
    def set_person_in_elevator_transition(self, k, h):
        for elevator in self.inst_params['elevators']:
            person_in_elevator_going_up = self.get_person_in_elevator_state(elevator, 'up')
            person_in_elevator_going_down = self.get_person_in_elevator_state(elevator, 'down')
            elevator_closed = self.get_elevator_closed_state(elevator)
            elevator_dir_up = self.get_elevator_dir_state(elevator, 'up')
            elevator_at_floor = [self.get_elevator_at_state(elevator, floor)
                                 for floor in self.inst_params['floors']]
            person_waiting_up = [self.get_person_waiting_state(floor, 'up')
                                 for floor in self.inst_params['floors']]
            person_waiting_down = [self.get_person_waiting_state(floor, 'down')
                                   for floor in self.inst_params['floors']]

            floor_offset = 4
            waiting_offset = floor_offset + len(elevator_at_floor)
            common_indices = [(elevator_closed, k, h - 1), (elevator_dir_up, k, h - 1)]
            common_indices += [(v, k, h - 1) for v in elevator_at_floor]

            # Going up
            var_indices = [(person_in_elevator_going_up, k, h), (person_in_elevator_going_up, k, h - 1)]
            var_indices += common_indices + [(v, k, h - 1) for v in person_waiting_up]
            var_indices = [self.var_to_idx[v] for v in var_indices]
            elevator_at_top_floor_idx = 4 + self.inst_params['TOP-FLOOR']
            clique = MRFClique(var_indices)
            for bitmask in range(2**len(var_indices)):
                if utils.is_set(bitmask, 1):
                    if utils.is_set(bitmask, elevator_at_top_floor_idx):
                        utils.append_function_entry(clique, bitmask, 0, 0)
                    else:
                        utils.append_function_entry(clique, bitmask, 0, 1)
                    continue

                if utils.is_set(bitmask, 2):
                    utils.append_function_entry(clique, bitmask, 0, 0)
                    continue

                if not utils.is_set(bitmask, 3):
                    utils.append_function_entry(clique, bitmask, 0, 0)
                    continue

                done = False
                for i in range(len(elevator_at_floor)):
                    if utils.is_set(bitmask, floor_offset + i) and utils.is_set(bitmask, waiting_offset + i):
                        utils.append_function_entry(clique, bitmask, 0, 1)
                        done = True
                        break
                if not done:
                    utils.append_function_entry(clique, bitmask, 0, 0)
            self.constrs['transition'].append(clique)

            # Going down
            var_indices = [(person_in_elevator_going_down, k, h), (person_in_elevator_going_down, k, h - 1)]
            var_indices += common_indices + [(v, k, h - 1) for v in person_waiting_down]
            var_indices = [self.var_to_idx[v] for v in var_indices]
            elevator_at_bottom_floor_idx = 4 + self.inst_params['BOTTOM-FLOOR']
            clique = MRFClique(var_indices)
            for bitmask in range(2**len(var_indices)):
                if utils.is_set(bitmask, 1):
                    if utils.is_set(bitmask, elevator_at_bottom_floor_idx):
                        utils.append_function_entry(clique, bitmask, 0, 0)
                    else:
                        utils.append_function_entry(clique, bitmask, 0, 1)
                    continue

                if utils.is_set(bitmask, 2):
                    utils.append_function_entry(clique, bitmask, 0, 0)
                    continue

                if utils.is_set(bitmask, 3):
                    utils.append_function_entry(clique, bitmask, 0, 0)
                    continue

                done = False
                for i in range(len(elevator_at_floor)):
                    if utils.is_set(bitmask, floor_offset + i) and utils.is_set(bitmask, waiting_offset + i):
                        utils.append_function_entry(clique, bitmask, 0, 1)
                        done = True
                        break
                if not done:
                    utils.append_function_entry(clique, bitmask, 0, 0)
            self.constrs['transition'].append(clique)