Z3py, как эффективно решить проблему со многими возможными путями (k из n возможных действий, порядок имеет значение) - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь решить проблему, состоящую из n действий (n> = 8). Путь состоит из k (пока k == 4) действий. Я хотел бы проверить, существует ли какой-либо путь, который удовлетворяет определенному мною ограничению.

Я сделал две попытки решить эту проблему:

Попытка 1 : Грубая сила, попробуйте все перестановки

Попытка 2 : закодируйте матрицу выбора пути M [k x n], чтобы каждая строка содержала один и только один элемент больше 0, а все остальные элементы равны в 0.

Например, если k == 2, n == 2, M = [[0.9, 0], [0, 0.7]] представляет сначала выполнение действия 1, затем действие 2.

Затем мой переход состояния был закодирован как:

S1 = a2(a1(S0, M[1][1]), M[1][2]) = a2(a1(S0, 0.9), 0)

S2 = a2(a1(S1, M[2][1]), M[2][2]) = a2(a1(S1, 0), 0.7)

Примечание: я убедился, что S == a(S,0), так что на каждом шаге выполняется только одно действие.

Затем ограничения были проверены на S2

Я надеялся, что это быть быстрее, чем способ перестановки сделать это. К сожалению, это оказывается медленнее. Просто интересно, есть ли лучший способ решить эту проблему?

Код:

_path = [[Real(f'step_{_i}_action_{_j}') for _j in range(len(actions))] for _i in range(number_of_steps)]
_states: List[State] = [self.s0]
for _i in range(number_of_steps):
    _new_state = copy.deepcopy(_states[-1])
    for _a, _p in zip(actions, _path[_i]):
        self.solver.add(_a.constraints(_states[-1], _p))
        _new_state = _a.execute(_new_state, _p)
        _states.append(_new_state)
...