Самый простой пример может выглядеть так.
Давайте представим двумерную сетку из N строк и M столбцов, движущийся агент A начинается в узле (x, y). Его цель T имеет координаты (x_i, y_j):
а>
Чтобы добраться до цели, агент должен совершить несколько шагов - двигаться влево, вправо, вверх или вниз последовательно. Мы не знаем, сколько шагов ему нужно, поэтому мы должны сами ограничить это число. Допустим, мы ищем план, состоящий из K шагов. В этом случае мы должны добавить N*M*K логических переменных: N и M представляют собой координаты, K - время. Если переменная имеет значение True, то агент в настоящий момент находится в узле (x,y) в момент времени k.
Далее мы добавляем различные ограничения:
- Агент должен менять свою позицию на каждом шаге (на самом деле это необязательно)
- Если робот на шаге k находится в позиции (x,y), то на шаге k+1 он должен быть в одном из четырех соседних узлов
- Формула SAT выполняется тогда и только тогда, когда агент на шаге k находится в целевом узле.
Я не буду подробно обсуждать здесь реализацию ограничений, это не так сложно. Аналогичный подход можно использовать для многоагентного планирования.
Этот пример является просто иллюстрацией. Люди используют satplan и STRIPS в реальной жизни.
EDIT1 В случае пути без столкновений вы должны добавить дополнительные ограничения:
- Если узел содержит препятствие, агент не может его посетить. Например. соответствующие логические переменные не могут быть True на любом временном шаге, например. это всегда False
- Если мы говорим о многоагентной системе, то две логические переменные, соответствующие двум агентам, находящимся на одном и том же временном шаге в одном и том же узле, не могут быть True одновременно:
AND (agent1_x_y_t, agent2_x_y_t) <=> False
РЕДАКТИРОВАТЬ2
Как построить формулу, которая бы удовлетворяла. Перебрать все узлы и все временные метки, например. над каждой булевой переменной. Для каждой логической переменной добавьте ограничения (я буду использовать Python-подобный псевдокод):
formula = []
for x in range(N):
for y in range(M):
for t in range (K):
current_var = all_vars[x][y][t]
# obstacle
if obstacle:
formula = AND (formula, NOT (current_var))
# an agent should change his location each step
prev_step = get_prev_step (x,y,t)
change = NOT (AND (current_var, prev_step))
formula = AND (formula, change)
adjacent_nodes = get_adj (x,y, k+1)
constr = AND (current_var, only_one_is_true (adjacent_nodes))
formula = AND (formula, constr)
satisfy (formula)
person
CaptainTrunky
schedule
30.05.2017