近期,笔者要求转换了一个资源调运的SHOP2代码为JSHOP2代码,转换过程中发现些许问题,二者的代码并不是完全兼容的,遂写此文记录。
毫无疑问,两种都是基于HTN的规划器,也是基于规划空间规划的规划器。SHOP2是采用LISP语言开发的,而JSHOP2是之后诞生的,是采用Java语言开发的。二者的出现相隔了几年,且开发的语言不同,故在使用上有些许区别。
官方指南《JSHOP2》附录中介绍了JSHOP2与SHOP2区别:
- 在SHOP2中,运算符(Operator)的前提条件可以省略,但在JSHOP2中是不允许的。
- 在变量命名的范围大小上,JSHOP2的命名范围较于SHOP2稍窄一些。这个笔者在转换SHOP2代码的时候未发现有啥bug。
- 诸如:task,:ordered和list等关键字不允许在JSHOP2中出现。当然,这些关键字在SHOP2中都有替代使用的方式,故这一操作并没一降低JSHOP2强大的领域知识描述能力。如:ordered关键字在缺省的时候默认为按顺序排列。
- 用于Debug的eval术语在JSHOP2中是不允许使用的。此外,SHOP2中只保留后向兼容性的结构(make-problem和make-domain)都在JSHOP2中不在出现。
- 在call术语的使用条件上,JSHOP2的解决了相关bug,使得call术语可以出现在任何我们期望出现的地方。
- 二者在first关键字上的表达形式有些许不一致。在JSHOP2中,表达形式为(:first L),其中L为逻辑表达式;在SHOP2中,表达形式为(:first L1 L2 … Ln),Li都是逻辑表达式。两种表达形式是等价的,但是前者更加直观。
- 任意的LISP表达语句可以出现在SHOP2的两个地方,赋值(assign)语句和运算符的成本(cost)计算中。而在JSHOP2中,任意的术语都可以夹杂着使用LISP表达。此外,在排序(sort)的前提条件语法中,LISP表达式被替换为用户定义或内置比较函数。这一段笔者可能理解有误,未经过验证。
- defproblem命令可以使用一种表达方式定义几种规划问题,这一语法在JSHOP2中是允许使用的,而在SHOP2中不允许。
在测试过程中,笔者还发现了几点区别:
- JSHOP2中Call术语可调用的内置函数个数较SHOP2中更少。具体来说,JSHOP2不能直接使用call调用max,min,floor等基本函数,得通过调用外部函数(自己用Java语言编写)来解决。
- JSHOP2在使用sort-by术语的时候,不可以出现‘#符号,而SHOP2中允许出现。
- JSHOP2较SHOP2更容易封装,这是因为Java语言比LISP语言更易封装决定的。
- 在环境配置的过程中,SHOP2更适合新手使用,而JSHOP2的配置过程有些许复杂。(URL)笔者使用LISP语言的编译器Allegro CL来运行SHOP2,仅需先编译SHOP2源文件,再一起编译domain和problem文件即可。
- SHOP2允许改变调试参数,如改变最大运行时间,设置生成的plan总成本要求小于某个值,是否输出最终Plan等,如:(find-plans 'problem :which :first :optimize-cost :plans :time-limit 5) ,而JSHOP2中出现这段虽然不报错,但貌似没有作用。
- 这一点算是JSHOP2的弊端。当我在运行大规模算例的时候,会导致自动生成的方法中的代码超过65535字节限制,程序出现错误。就必须得修改领域知识,分别进行求解。或者拆分算例分别进行求解。
小节
笔者在修改SHOP2源码到JSHOP2源码的过程中,编译器提示了一些的报错,于是查阅官方文指南,发现这些错误有的还挺麻烦的。比如需要自行写一下max,min等基本函数,使得JSHOP2中Call术语成功调用。其他错误只要跟着报错一步步来,就能够很便利地转换SHOP2代码至JSHOP2代码了。