【2023 收藏向】【PDDL/Planning/Planner-智能规划与规划器】 学习指南与工具推荐

有疑问可邮箱联系博主本人:sfreebobo@163.com。

前言

此文章我会根据自身经验对有兴趣学习PDDL的同学做出一定的简单介绍与相关工具推荐,并且会一直对此博文进行更新。(2021/12/02)

更新日志


  • 2022/5/9 更新了"本地规划器的快速部署:Optic、Metric-FF"。
  • 2022/6/15 更新了VSCODE插件负责人的PDDL建模(Modeling in PDDL)教学链接,加入本地WEB调用规划器(planning as a service)。
  • 2023/12/21
    1. 更新了TFD的仓库地址:由于原有官方gitlab仓库失踪,所以更新为github上的替代仓库
    2. 更新了planutils的使用介绍(这个蛮好用的,如果大家不太清楚具体使用逻辑请评论告知,我可以单独出个新手入门指南)

一、简介

PDDL发展多年,目前已经有PDDL1.0最初的Strips版本发展到如今PDDL3.1加强时态版。当我们打算开始学习PDDL的时候一定要清楚的知道自己所要解决的问题应使用何种PDDL版本进行求解,如果涉及到时态问题,那就是PDDL2.1、PDDL2.2、PDDL3 +的范围。但是一定要注意,有时候一个规划器虽写明支持相应PDDL版本语法,但是它可能只是支持部分语法,我个人尝试经验中就发现PDDL3的语法是90%(保守)以上的规划器都不支持的,所以如果需要PDDL3的语法进行问题求解请慎重考虑自己的想法,或许可以换条路走。

总结:推荐使用经典的PDDL2.1语法进行问题规划。

二、基础学习资料介绍:

第一步: 基本语法的学习

首先我们需要了解基本的PDDL语法,清楚其可以以何种形式去定义求解问题后,我们才能继续进行学习,所以这里推荐通过半小时的时间速阅过所有PDDL版本以及其语法点后再进行下一步的学习。

有一定基础的可以看这下MOOC视频,增加对问题求解的认知。

第二步:通过大量代码案例来进一步加强语法了解

我们可以通过往届规划器比赛所使用案例进行学习,其中案例可以在Vscode插件所提供的planning.domains中进行本地请求加载或是去国际规划器比赛的代码库直接找Demo。

International Planner Competition (国际规划器比赛)

1、使用VScode本地运行
搜索"PDDL"安装此插件,同时进入插件配置安装语法检查器

2、使用线上editer运行: 线上规划器官网地址/
在Vscode默认的“alt+p”调用规划器就是调用的这个网站的api地址: http://solver.planning.domains/

!!!注意:线上规划器默认是不支持时态规划语法的,需通过加载相应插件才能解析。

第三步:选择自己的规划器

如果你不清楚你所需要的PDDL语法,请返回前面查看相应条目进行基础学习,明确版本。

具体自己的问题后再选择合适的规划器

!!!事先说明:大部分规划器编译环境都较为古早,如Ubuntu14、Ubuntu16等,如下载后遇到编译问题,可以尝试更换系统版本或gcc、g++、cmake等软件版本进行调试。

1、Temporal Related (时态相关)
2、STRIP | ADL Related (无时态要求)
  • JavaFF: https://github.com/dpattiso/javaff
    基于FF的java版本,需自行编译打包

  • Metric FF: https://fai.cs.uni-saarland.de/hoffmann/metric-ff.html
    基于FF写的Metric版本,可以说Metric很强,不仅支持ADL,同时扩充了Numeric Fluents的支持(比如在action的前提中加入数值的判定),不过虽然NF是PDDL2.1的语法,但是Metric-FF版本没有加入Durative-action的求解,所以推荐无时态要求的同学进行使用。

3. 容器封装

如果你未确定自己的问题与哪个规划器最契合,那么你可以尝试planutils,planutils结合虚机提供了最新最全的规划器安装方式。

  • Planutils: https://github.com/AI-Planning/planutils (2020新鲜出炉)
    1、可通过docker直接部署调用planutils,多个规划器任你选用。(Docker里面也是安装singularity进行规划器调用的)
    2、Python安装,https://pypi.org/project/planutils/

进阶1:可以搭配本地Web服务一同使用: 本地Web调用规划器: planning-as-a-service
进阶2:可以构建自己的singularity容器对规划器进行快速调用:singularity安装地址

通过以上三步我相信大家会对PDDL有了一个基本了解,剩下的就是不断完善自己的问题定义,并结合所选规划器的性能、设计、语法支持去进行这样一个求解问题的学习,如有任何问题都可以私信询问或是邮箱联系,由于时间安排,消息不一定能够及时回复也请谅解。

三、本地快速部署运行规划器

这里我选用Optic、SGPlan和Metrics-FF来进行演示,分别对应时态问题和非时态问题。

时态:Optic-CLP

optic-cplex 版更换的为求解器,其中cplex需要教育账号申请或购买,经本人19年的尝试经验,其对于大部分规划问题提升并不明显,不过具体问题具体讨论,有需求的同学可以进行调试部署。

Optic原有开发环境为Ubuntu14,所以现在一般直接下载编译会发现gcc或各类库包的版本对应不上,需要自行修改头文件里面的库包版本再编译,这里使用的是我19年修改编译好后的一个版本库https://github.com/Dongbox/optic-clp-release,下载后直接赋值chmod +x optic-clp后调用即可,基本调用为optic-clp domain.pddl problem.pddl

optic默认求解的时候一般会根据约束优化结果,在得到一个结果后使用best-first search进行求解(打印G表明在搜索中),但是一般都求不出更好的结果,如果有应用需求的可以使用timeout获取到规划器的一个结果。
演示样例
查看KCL官方网址获得更多使用说明:https://nms.kcl.ac.uk/planning/software/optic.html

时态:SGPlan

SGPlan能适应更多语法(或者说不会出现莫名其妙的报错),但执行效率没有Optic高(单个人使用经历而言),所以如果想要快速开始可以使用SGPlan先构建自己的模型,需要优化再迁移到Optic上使用。
主页:https://wah.cse.cuhk.edu.hk/wah/programs/SGPlan/
下载最新版本:
https://wah.cse.cuhk.edu.hk/wah/programs/SGPlan/SP5/sgplan522.zip
下载解压给权限一套操作chmod +x sgplan522
基本操作样例:
./sgplan522 -o ~/work/covid_resolution/domain.pddl -f ~/work/covid_resolution/problem.pddl -out ~/work/covid_resolution/plan,-o对应domain领域文件、-f对应problem问题文件、-out对应结果输出地址。
SGPlan执行结果

非时态:Metric-FF

这个是FF的Metric版,最近推出了windows版本https://github.com/Vidminas/metric-ff-crossplatform,当然windows版也是需要编译的,我更多会选择使用WSL作为开发环境。选择工作目录后wget https://fai.cs.uni-saarland.de/hoffmann/ff/Metric-FF-v2.1.tgz,解压tar zxvf Metric-FF-v2.1.tgz,进入目录,make编译。
基本使用语法为./ff -o domain.pddl -f problem.pddl,更多使用说明请查看https://www.ida.liu.se/~TDDC17/info/labs/planning/2011-updated/run_ff.html
其中未安装过编译工具的可能会提示缺失库包,那么安装即可,Ubuntu20上面未发现gcc版本问题。

# 这是规划器常见库包安装
sudo apt-get install cmake coinor-libcbc-dev coinor-libclp-dev \
                     coinor-libcoinutils-dev coinor-libosi-dev coinor-libcgl-dev doxygen libbz2-dev bison flex

查看FF官方网址获得更多使用说明:https://fai.cs.uni-saarland.de/hoffmann/metric-ff.html

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
好的,农夫过河问题可以用PDDL语言进行规划,以下是一个简单的PDDL实现: ``` (define (problem farmer-crossing) (:domain farmer-crossing) (:objects farmer - person wolf - animal goat - animal cabbage - vegetable left - location right - location) (:init (at farmer left) (at wolf left) (at goat left) (at cabbage left) (opposite left right)) (:goal (and (at farmer right) (at wolf right) (at goat right) (at cabbage right))) (:action cross-farmer :parameters () :precondition (at farmer here) :effect (and (at farmer there) (not (at farmer here)))) (:action cross-wolf :parameters () :precondition (and (at farmer here) (at wolf here)) :effect (and (at wolf there) (not (at wolf here)))) (:action cross-goat :parameters () :precondition (and (at farmer here) (at goat here)) :effect (and (at goat there) (not (at goat here)))) (:action cross-cabbage :parameters () :precondition (and (at farmer here) (at cabbage here)) :effect (and (at cabbage there) (not (at cabbage here)))) (:action return-farmer :parameters () :precondition (at farmer there) :effect (and (at farmer here) (not (at farmer there)))) (:action return-wolf :parameters () :precondition (and (at farmer there) (at wolf there)) :effect (and (at wolf here) (not (at wolf there)))) (:action return-goat :parameters () :precondition (and (at farmer there) (at goat there)) :effect (and (at goat here) (not (at goat there)))) (:action return-cabbage :parameters () :precondition (and (at farmer there) (at cabbage there)) :effect (and (at cabbage here) (not (at cabbage there)))) (:predicate opposite :parameters (?x ?y) :precondition () :effect (or (and (eq ?x left) (eq ?y right)) (and (eq ?x right) (eq ?y left))))) ``` 在这个例子中,我们定义了“farmer-crossing”领域,并定义了对象、初始状态和目标状态。我们还定义了动作,如“cross-farmer”、“cross-wolf”等,以及这些动作的前提条件和效果。最后,我们定义了谓词“opposite”,表示两个位置之间的关系。 通过这个PDDL实现,我们可以使用规划来解决农夫过河问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dongbo X

感谢!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值