Почему pddl находит решение неполным
Ниже приведена небольшая часть проблемы перехода через реку, написанная на pddl. Я пытался найти решение в двух разных инструментах (editor.planning.domains и stripsfiddle.herokuapp.com), но оба они дали один и тот же результат.
;domain;
(define (domain RiverCrossing)
(:requirements :strips :typing)
(:types
Farmer Fox - passengers
)
(:predicates
(onLeftBank ?p - passengers)
(onRightBank ?p - passengers)
)
(:action crossRiverLR
:parameters (?f - Farmer)
:precondition ( and (onLeftBank ?f))
:effect( and (onRightBank ?f) )
)
(:action crossRiverRL
:parameters (?f - Farmer)
:precondition ( and (onRightBank ?f))
:effect( and (onLeftBank ?f) )
)
(:action crossRiverLRf
:parameters ( ?fx - Fox ?f - Farmer)
:precondition ( and (onLeftBank ?f) (onLeftBank ?fx) )
:effect( and (onRightBank ?fx) (onRightBank ?f) )
)
(:action crossRiverRLf
:parameters (?f - Farmer ?fx - Fox)
:precondition ( and (onRightBank ?f) (onRightBank ?fx) )
:effect( and (onLeftBank ?f) (onLeftBank ?fx) )
)
)
проблема
(define (problem RCP)
(:domain RiverCrossing)
(:objects
farmer - Farmer
fox - Fox
)
(:init
(onRightBank farmer) (onLeftBank fox)
)
(:goal
(and
(onLeftBank farmer) (onRightBank fox)
)
)
)
Оба компилятора дают одинаковый результат; Фермер не идет в левый банк
Solution found in 2 steps!
1. crossRiverRL farmer
2. crossRiverLRf fox farmer
Может ли кто-нибудь помочь мне выяснить, в чем я скучаю? Заранее спасибо,
1 ответ
Я понял, что проблема не сводит на нет предыдущую ситуацию (OnLeftBank) после установки следующей ситуации (OnRightBank). Ниже приведен пример исправления, которое я применил ко всем эффектам;
(:action crossRiverLR
:parameters (?f - Farmer)
:precondition ( and (onLeftBank ?f))
:effect( and (onRightBank ?f)
(not (onLefttBank ?f)) ; **** adding this solved the problem. ****
)
)