В чем разница между Link и Path в PDDL?
В домене driverlog в PDDL мы указали ссылки и пути.
(define (domain driverlog)
(:requirements :typing)
(:types location locatable - object
driver truck obj - locatable
)
(:predicates
(at ?obj - locatable ?loc - location)
(in ?obj1 - obj ?obj - truck)
(driving ?d - driver ?v - truck)
(link ?x ?y - location) (path ?x ?y - location)
(empty ?v - truck)
)
И способ, которым это определено в проблеме:
(define (problem DLOG-2-2-2)
(:domain driverlog)
(:objects
driver1 - driver
driver2 - driver
truck1 - truck
truck2 - truck
package1 - obj
package2 - obj
s0 - location
s1 - location
s2 - location
p1-0 - location
p1-2 - location
)
(:init
(at driver1 s2)
(at driver2 s2)
(at truck1 s0)
(empty truck1)
(at truck2 s0)
(empty truck2)
(at package1 s0)
(at package2 s0)
(path s1 p1-0)
(path p1-0 s1)
(path s0 p1-0)
(path p1-0 s0)
(path s1 p1-2)
(path p1-2 s1)
(path s2 p1-2)
(path p1-2 s2)
(link s0 s1)
(link s1 s0)
(link s0 s2)
(link s2 s0)
(link s2 s1)
(link s1 s2)
)
В чем разница между путями и ссылками? Я пытался создать аналогичную проблему, но пропустил путь, и я продолжаю получать неразрешимую проблему. Как я могу правильно определить путь?
Спасибо!
1 ответ
Это пользовательские предикаты:
(define (domain driverlog)
...
(:predicates
...
(link ?x ?y - location) (path ?x ?y - location)
...
)
)
поэтому их семантика может быть выведена путем проверки соответствующей модели.
И то и другое link
а также path
являются двоичными предикатами, связывающими два местоположения, предположительно, когда возможно перемещение из одного места в другое. Это соединение является однонаправленным.
Из исходного кода я прочитал, что определены следующие действия:
(:action DRIVE-TRUCK
:parameters
(?truck
?loc-from
?loc-to
?driver)
:precondition
(and (TRUCK ?truck) (LOCATION ?loc-from) (LOCATION ?loc-to) (DRIVER ?driver)
(at ?truck ?loc-from)
(driving ?driver ?truck) (link ?loc-from ?loc-to))
:effect
(and (not (at ?truck ?loc-from)) (at ?truck ?loc-to)))
(:action WALK
:parameters
(?driver
?loc-from
?loc-to)
:precondition
(and (DRIVER ?driver) (LOCATION ?loc-from) (LOCATION ?loc-to)
(at ?driver ?loc-from) (path ?loc-from ?loc-to))
:effect
(and (not (at ?driver ?loc-from)) (at ?driver ?loc-to)))
Таким образом, кажется, что два места имеют ссылку, если это возможно DRIVE-TRUCK
из одного места в другое, и в двух местах есть путь, если это возможно WALK
из одного места в другое.
Больше нечего сказать по этому поводу.
Причина, почему вы продолжаете получать UNSAT
потому что вы разместили водителей и грузовики в двух разных местах:
(at driver1 s2)
(at driver2 s2)
(at truck1 s0)
(at truck2 s0)
Поскольку единственная связь среди s0
а также s2
является ссылкой, водители не могут добраться до грузовика (и наоборот). Это потому, что предварительным условием DRIVE-TRUCK
является (driving ?driver ?truck)
, который устанавливается только BOARD-TRUCK
если водитель находится в том же месте грузовика.
Вы можете решить эту проблему, создав путь среди s0
а также s2
, Тем не менее, это, кажется, противоречит соглашению об именах модели, которая соединяет sX
используя только ссылки. Лучшее решение состоит в том, чтобы изменить исходное состояние и поместить грузовик в то же место каждого водителя, или, по крайней мере, в место, которое доступно для WALK
действие.