有名な「ヤギとオオカミとキャベツ」のシナリオの解決策を書くように依頼されました。シナリオは次のようになります。
農夫は 3 つすべてを川を渡って輸送したいと考えています。ただし、次の場合:
- ヤギとキャベツを放っておくとヤギがキャベツを食べてしまう
- オオカミとヤギを放っておくと、オオカミがヤギを食べてしまいます!
したがって、問題の1つの解決策は次のとおりです。
- ヤギを連れて川を渡り、対岸に降ろす
- 川を渡って戻ってきて
- キャベツかオオカミのどちらかを拾い、反対側に持っていく
- オオカミを降ろし、ヤギを拾い、反対側に戻る
- ヤギを降ろし、キャベツを拾い、反対側に戻る
- ヤギを拾って、出来上がり!3つすべてが輸送されます。
ただし、これを PDDL に投影するのに問題があります。私は問題の定義を与えてきました:
(define
(problem boat1)
(:domain boat)
; only needs two objects, namely representing
; either banke side of the river, [w]est and [e]ast
(:objects w e)
(:INIT
; wolf, goat, cabbage, boat are all on
; the west side to start with
(config w w w w)
; represent all valid states
; these two are the special case,
; representing that wolf and cabbage are
; safe together even if the boat is away
(valid w e w e)
(valid e w e w)
; these are all cases where two entities
; are always safe as long as the boat is
; with them. In other words, a single entity
; on the other side is also always safe
; for west side
(valid w w w w)
(valid w w e w)
(valid w e w w)
(valid e w w w)
; for east side
(valid e e e e)
(valid e e w e)
(valid e w e e)
(valid w e e e)
; these are all valid states that are
; ever allowed
)
(:goal (AND
; they all have to move to the east side
(config e e e e)
)
)
最後に、述語は 1 つしか与えられておらず、これは 4 つのアクションで実行できると言われています。Move_empty、move_goat、move_wolf、move_cabbage。
述語は次のとおりです。
(config ?wolf ?goat ?cabbage ?boat) (valid ?wolf ?goat ?cabbage ?boat)
そして、私は move_empty で開始しようとしました:
(:action move_empty
:parameters (?from ?to)
:precondition (and (valid ?x ?y ?z ?w) (on_left ?from) (on_right ?to))
:effect (and (valid ?x ?y ?z ?w)))
私が見つけたものから、PDDLに関する多くの情報がないため、これを解決する方法についてのヘルプとアドバイスのみを希望します。