JSHOP2语法学习(上)——基础语法

1 JSHOP2背景

JSHOP2规划器是最著名的 HTN 规划器之一,它是 SHOP2规划器的 java 实现的版本。二者具有相同的 HTN 规划算法。JSHOP2 是一个 HTN 规划的修改版本,它基于有序任务分解,并且也是一个领域无关的智能规划器,这意味着规划任务也会按照相同的顺序执行。

相比其他 HTN 规划器 JSHOP2 具有以下恃点:
(1)JSHOP2 规划原理是从系统初始状态开始采用前向搜索的方式进行规划,规划过程中的每个节点都知道当前的系统状态
(2)JSHOP2 是与领域无关的规划器,即可以使用其语法对具体的问题建模求解,从而解决不同领域的问题。
(3)JSHOP2 知识表示能力强大。它从 PDDL 中吸收了很多的知识描述语法特点,在方法(method)和操作(operator)的前提条件描述中支持与或非等逻辑描述、函数计算、以及调用外部函数,并且容易扩展。
(4)采用了 unordered 关键字,利用这个关键字可以使 JSHOP2 完成不固定顺序的多任务规划。

为了求解一个实际的规划问题,必须提前给出关于这个规划问题的特定规划域描述 domain 即对规划问题进行建模,包括设定目标任务、规划的中间层次任务、合适的分解方法(method)以及原子任务等。 JSHOP2 为了扩展更多的功能支持使用 call 来调用函数,除了其内置加减乘除等函数,也可以根据需求进行补充修改,增加需要的函数,使其可以解决更多的问题。

2 JSHOP2语法

JSHOP2的语法与PDDL有许多共同之处,其基本语法如下:

2.1 变量符号(Variable Symbol)

变量符号是以问号开头的字符串:?x 、?y、?hello-there等等。变量符号通常可以作为方法(method)的头部(head)、操作(operator)的头部(head)以及描述状态的参数。

2.2 原子任务(Primitive Task)

原子任务是名称以感叹号开头的任何字符串(例如!unstack 或!putdown)。原子任务是可直接执行的任务,在描述时通常作为 operator 的头部。

2.3 常量符号,谓词符号,复合任务符号

这三者的描述为名称以字母或下划线开头的任何符号。其中复合任务(Compound Task)指非原子任务,可分解为一系列的复合任务和原子任务。复合任务可以是推理过程的中间层次任务,也可以是作为规划输入的目标任务。它将由相应的 method 分解成相应的子任务集合。

2.4 逻辑表达式(Logical Expressions)

指逻辑原子或以下任何复杂表达式:连词(and),析取(or),否定(not),含义(imply),通用量化(forall),赋值(assign)以及调用表达式(call)。

2.5 公理(Axioms)

(: ⁣ a[name1]L1 [name2]L2...[namen]Ln) (:\!-\ a [name_1] L_1\ [name_2] L_2 ... [name_n] L_n)

公理的头部是逻辑原子 aa,其尾部是:[name1]L1 [name2]L2 [namen]Ln[name_1] L_1\ [name_2] L_2\ …… [name_n] L_nLiL_i 为逻辑前提,namei 为其名字(可以省略)。该公理的意思是,如果 L1L_1为真;或L1L_1为假但L2L_2为真;……;或者L1,L2Ln1L_1, L_2 …… L_{n-1}为假,但LnL_n为真,则aa为真。

2.6 操作(Operators)

(:operator head Pre Del Add) (:operator\ head\ Pre\ Del\ Add)

其中 head(运算符的头部)是一个原子任务;Pre(运算符的前置条件)为逻辑前提条件;Del 为操作的删除列表;Add 为操作的增加列表。

2.7 方法(Methods)

(:method h[name1] L1 T1 [name2]L2 T2...[namen]Ln Tn) (:method\ h [name_1]\ L_1\ T_1\ [name_2] L_2\ T_2 ... [name_n] L_n\ T_n)

hh(方法的头部)是复合普通任务;LiL_i为该方法的前提条件;TiT_i是一个任务列表; nameiname_i是后续(Li TiL_i\ T_i)对的名称(可以省略)。 JSHOP2 主要的 HTN 形式化描述如下: 方法表明方法头部中指定的任务可以是通过在满足尾部前提条件时执行方法尾部之一中的所有任务来执行。分解方法更多依靠的是领域经验知识,应针对具体问题来确定。该部分的设定也将影响规划效率。

2.8 规划域(Planning Domain)

规划域的形式:
(de ⁣fdomain domain ⁣ ⁣name(d1 d2... dn)) (de\!fdomain \ domain\!-\!name(d_1\ d_2 ... \ d_n))

其中 domain-name 是符号,每个项djd_j是以下之一:操作(operator),方法(method)或公理(axioms)。规划域是规划器对规划问题进行求解的依据,与规划问题(problem)共同作为规划器的输入。规划域是对问题求解的核心所在,在 HTN 规划中它的设计尤其是 method 的设计很可能会影响到规划的效率,所以有必要根据具体问题去将其转化为合适的规划域。

2.9 规划问题(Planning Problem)

规划问题的形式:
de ⁣fproblem problem ⁣ ⁣name domain ⁣ ⁣name([a1,1 a1,2...a1,n]) T1...([am,1am,2...am,n]) Tm) (de\!fproblem\ problem\!-\!name\ domain\!-\!name ([a_{1,1}\ a_{1,2} . . . a_{1,n}])\ T_1 ... ([a_{m,1} a_{m,2} . . . a_{m,n}])\ T_m)
其中 problem-name 和 domain-name 是符号,每个 ai,ja_{i,j}是一个逻辑原子,每个TiT_i是一个任务列表。这种形式定义了域 domain-name 中的 m 个规划问题,每个 domain-name 都可以通过用原子 ai,1a_{i,1}ai,na_{i,n} 定义的初始状态来解决 TiT_i 中的任务来解决。规划域和规划问题构成了 JSHOP2 的输入,应根据实际问题来完成二者的设计。


3 应用例子

JSHOP2资源包里面有算例,下面会先从简单的例子(JSHOP2\examples\basic)开始解释。
创建的规划域如下:
JSHOP2语法学习(上)——基础语法
定义规划问题如下:基于规划域basic(上面那个文件),初始状态是have kiwi,需要操作一个复合普通任务swap。
JSHOP2语法学习(上)——基础语法看到这里大家应该基本明白了使用方式,这个简单的规划问题的解也是显而易见的,调用JSHOP2求解(见上一篇博客《JSHOP2的环境配置——详细教程(原创)》),求解结果如下:
JSHOP2语法学习(上)——基础语法
上述的Plan #1 表示找到一种规划方案(有兴趣的小伙伴可以看看test案例,其中的解为多种规划方案),Plan cost表示该计划的费用。


这个算例明显太简单了,想必大家还没有玩够。作为一个优秀的物流人才,之后我会和大家分享的案例为Logistics案例,并给出自己对这个案例的一些思考和变形,帮助大家更好的熟悉JSHOP2规划器。

4 参考文献

吴迪. 基于HTN规划技术在航天器上的应用研究[D]. 2019.

Documentation for JSHOP2 Okhtay Ilghami, Department of Computer Science, University of Maryland, College Park, MD 20742, USA