如何在PDDL中加入条件?
how to put conditions in PDDL?
我正在学习如何将 PDDL 用于 IA class,我必须编写一个计划,我需要从位置 4 接一个人并将其放到位置 1,还要在位置 3 接一个人并将它也放在 location1 中。我已经有了移动到位置的代码选择人,移动到目标位置并放下它。但是有一些规则我不能放在代码上,有一个连接路径我需要遵循但我不知道如何放置这些条件:
这是连接路径:
Loction1 -> Location2 -> Location4 -> Location3
我有从一个位置到另一个位置的代码,但我不知道如何在不能直接从位置 1 到位置 4 的位置设置条件
代码如下:
域:
(定义(域planeacion_Str)
(:predicates (Hospital ?h)
(Ambulancia ?a)
(Location ?l)
(Paciente ?px)
(Libre ?a)
(Ocupado ?a ?px)
(at-ambulancia ?l)
(at-paciente ?px ?l)
)
(:action Conducir
:parameters (?de ?para)
:precondition (and (Location ?de) (Location ?para) (at-ambulancia ?de))
:effect (and (at-ambulancia ?para)
(not (at-ambulancia ?de)))
)
(:action subirPaciente
:parameters (?pcte ?lctn ?amblnc)
:precondition (and (Paciente ?pcte) (Location ?lctn) (Ambulancia ?amblnc)
(at-paciente ?pcte ?lctn) (at-ambulancia ?lctn) (Libre ?amblnc))
:effect (and (Ocupado ?pcte ?amblnc)
(not (at-paciente ?pcte ?lctn))
(not (Libre ?amblnc)))
)
(:action bajarPaciente
:parameters (?pcte ?lctn ?amblnc)
:precondition (and (Paciente ?pcte) (Location ?lctn) (Ambulancia ?amblnc)
(Ocupado ?pcte ?amblnc) (at-ambulancia ?lctn))
:effect (and (at-paciente ?pcte ?lctn)
(Libre ?amblnc)
(not (Ocupado ?pcte ?amblnc)))
))
(定义(问题practica_Planeacion_pblm)
(:域 planeacion_Str)
(:objects l1 l2 l3 l4 amblnc px1 px2 医院)
(:init (医院 l1)
(Ambulancia amblnc)
(位置 l1)
(位置 l2)
(位置 l3)
(地点l4)
(Paciente px1)
(Paciente px2)
(自由 amblnc)
(at-ambulancia l1)
(at-paciente px1 l4)
(at-paciente px2 l3)
)
(:goal (and (at-paciente px1 l1)
(at-paciente px2 l1)
)
)
)
希望有人能帮助我。
你需要在你的移动动作中添加一个前提条件,即你只能在相邻位置之间移动;然后在初始状态中添加相邻位置列表作为谓词:
(adjacent location1 location2)
(adjacent location2 location3)
但不是 (adjacent location1 location4)
。
我正在学习如何将 PDDL 用于 IA class,我必须编写一个计划,我需要从位置 4 接一个人并将其放到位置 1,还要在位置 3 接一个人并将它也放在 location1 中。我已经有了移动到位置的代码选择人,移动到目标位置并放下它。但是有一些规则我不能放在代码上,有一个连接路径我需要遵循但我不知道如何放置这些条件:
这是连接路径: Loction1 -> Location2 -> Location4 -> Location3
我有从一个位置到另一个位置的代码,但我不知道如何在不能直接从位置 1 到位置 4 的位置设置条件
代码如下:
域:
(定义(域planeacion_Str)
(:predicates (Hospital ?h)
(Ambulancia ?a)
(Location ?l)
(Paciente ?px)
(Libre ?a)
(Ocupado ?a ?px)
(at-ambulancia ?l)
(at-paciente ?px ?l)
)
(:action Conducir
:parameters (?de ?para)
:precondition (and (Location ?de) (Location ?para) (at-ambulancia ?de))
:effect (and (at-ambulancia ?para)
(not (at-ambulancia ?de)))
)
(:action subirPaciente
:parameters (?pcte ?lctn ?amblnc)
:precondition (and (Paciente ?pcte) (Location ?lctn) (Ambulancia ?amblnc)
(at-paciente ?pcte ?lctn) (at-ambulancia ?lctn) (Libre ?amblnc))
:effect (and (Ocupado ?pcte ?amblnc)
(not (at-paciente ?pcte ?lctn))
(not (Libre ?amblnc)))
)
(:action bajarPaciente
:parameters (?pcte ?lctn ?amblnc)
:precondition (and (Paciente ?pcte) (Location ?lctn) (Ambulancia ?amblnc)
(Ocupado ?pcte ?amblnc) (at-ambulancia ?lctn))
:effect (and (at-paciente ?pcte ?lctn)
(Libre ?amblnc)
(not (Ocupado ?pcte ?amblnc)))
))
(定义(问题practica_Planeacion_pblm) (:域 planeacion_Str) (:objects l1 l2 l3 l4 amblnc px1 px2 医院) (:init (医院 l1) (Ambulancia amblnc) (位置 l1) (位置 l2) (位置 l3) (地点l4) (Paciente px1) (Paciente px2) (自由 amblnc) (at-ambulancia l1) (at-paciente px1 l4) (at-paciente px2 l3) ) (:goal (and (at-paciente px1 l1) (at-paciente px2 l1) ) ) )
希望有人能帮助我。
你需要在你的移动动作中添加一个前提条件,即你只能在相邻位置之间移动;然后在初始状态中添加相邻位置列表作为谓词:
(adjacent location1 location2)
(adjacent location2 location3)
但不是 (adjacent location1 location4)
。