该系列文章主要介绍PDDL人工智能知识,由于自己也是初学者,所以欢迎大家批评指正,也希望文章对您有所帮助,一起加油喔~

文章目录

  • 一.PDDL简介
  • 二.VSCode安装教程
  • 三.PDDL基础案例快速入门
    • 1.Getting started
    • 2.创建文件
    • 3.调用在线规划器
    • 4.本地规划器配置
  • 四.PDDL基础语法知识
  • 五.总结

一.PDDL简介

PDDL:Planning Domain Definition Language
规划领域定义语言,是一种解决人工智能规划问题的比较前沿的方法。PDDL常用于解决智能规划问题,例如机器人将一个屋子的球搬运到另一间屋子里,通过合理的组织流程建造一间房子等。PDDL的规划任务(planning task)由五部分组成。

  • Objects(对象)
    Things in the world that interest us.
  • Predicates(谓词)
    Properties of objects that we are interested in; can be true or false.
  • Initial state(初始状态)
    The state of the world that we start in.
  • Goal specification(目标规范)
    Things that we want to be true.
  • Actions/Operators(操作/运算符)
    Ways of changing the state of the world.

PDDL指定的规划任务分为两个文件,domain 文件和 problem 文件。

  1. A domain file(域文件) for predicates and actions.
  2. A problem file(问题文件) for objects, initial state and goal specification.

Domain Files
域文件定义如下:

(define (domain <domain name>)<PDDL code for predicates><PDDL code for first action>[...]<PDDL code for last action>
)
  • <域名>:domain name,是标识规划域的字符串,例如gripper,后续gripper.pddl会详细介绍。

Problem Files
问题文件定义如下:

(define (problem <problem name>)(:domain <domain name>)<PDDL code for objects><PDDL code for initial state><PDDL code for goal specification>
)
  • <问题名称>:problem name,是一个标识计划任务的字符串,例如gripper-four-balls。
  • <域名>:domain name,必须与对应域名文件中的域名匹配,详见gripper-four.pddl文件。

推荐下列参考资料:

  • Visual Studio Code 官方PDDL详情介绍
  • http://www.cse.ust.hk/~qyang/221/introtopddl2.pdf
  • http://www.cs.cmu.edu/~mmv/planning/readings/98aips-PDDL.pdf
  • https://github.com/nergmada/planning-wiki/tree/master/docs/reference/PDDL
  • https://planning.wiki/

二.VSCode安装教程

第一步,在VSCode中安装PDDL插件。

  • 点击扩展按钮
  • 搜索PDDL
  • 点击安装“Install”按钮即可

安装成功后如下图所示:

第二步,在VSCode中安装VAL语法检查。

  • VAL源码地址:https://github.com/KCL-Planning/VAL

在VS Code安装PDDL成功后,打开PDDL Overview进行安装VAL。

  • View -> Command Palette -> PDDL: show overview page

安装过程如下图所示,对应“VAL tools”点击“Download”。

第三步,安装成功之后,可以看到详细的配置信息如下:

  • planning engine(在线规划引擎)
    Planning service: http://solver.planning.domains/solve
  • PDDL parser(PDDL解析器)
    c:\Users\xxx\AppData\Roaming\Code\User\globalStorage\jan-dolejsi.pddl\val\Val-20210215.2-win64\bin\Parser.exe
  • Plan Validator(规划验证器)
    c:\Users\xxx\AppData\Roaming\Code\User\globalStorage\jan-dolejsi.pddl\val\Val-20210215.2-win64\bin\Validate.exe

此时,我们可以进入后续的PDDL代码编写过程。同时,存在部分在线访问的问题,后续尝试解决。

VSCode PDDL
VSCode是建模规划域的良好工具,其扩展将PDDL引入了一流的编程语言家族中,让其与C#、Python、JavaScript等处于同等级别。PDDL旨在通过以下功能帮助新手并为专家赋能。

  • 规划领域建模
    planning domain modeling
  • 通过回归或可扩展性测试用例的数量规划域验证
    planning domain validation by number of regression or scalability test cases
  • 通过从模板生成问题文件来规划工业化解决方案
    planning solution industrializing by problem file generation from templates
  • 计划验证
    plan validation

当扩展在 .pddl 文件(通常包含域或问题定义)或选定的PDDL命令被激活时,即可配置解释器(parser)或规划器(planner)。


三.PDDL基础案例快速入门

1.Getting started

创建PDDL文件并运行计划程序,下面是官方最简单的入门步骤:

  • (1) 点击 File > Open Folder 打开VS Code中一个空白文件夹。
  • (2) 点击 File > New File 创建两个名为 domain.pddlquestion.pddl 的空白文件,这两个文件将显示在资源管理器窗格中,在编辑器中并排打开它们。
  • (3) 打开 domain.pddl 文件并输入 domain。自动模板会插入域文件的整个结构,使用 Tab 和 Enter 键跳过占位符并进行选择。
  • (4) 打开 problem.pddl 文件并输入 problem 。自动模板会插入问题文件的整个结构,确保此处的(域名)与域文件中选择的名称匹配。
  • (5) 当提示安装 VAL(验证器 Validator)工具时,请按照说明进行操作。这将为您带来一个PDDL解析器和计划验证实用程序。
  • (6) 当准备在域和问题文件上运行规划器时,可以通过文件内容或编辑器选项卡的上下文菜单,或通过Alt + P快捷方式调用规划器(planner)。这个 planning.domains 解析器也将被使用,因此不要发送任何敏感的PDDL代码。
  • (7) 按照说明配置您自己的 PDDL 规划器。

同时补充一个在线编辑PDD的网站。

  • http://planning.domains/


2.创建文件

第一步,点击 File > Open Folder 打开VS Code中一个空白文件夹。

第二步,点击 File > New File 创建两个名为 domain.pddlquestion.pddl 的空白文件,这两个文件将显示在资源管理器窗格中,在编辑器中并排打开它们。

第三步,打开 domain.pddl 文件并输入 domain。自动模板会插入域文件的整个结构,使用 Tab 和 Enter 键跳过占位符并进行选择。

第四步,打开 problem.pddl 文件并输入 problem 。自动模板会插入问题文件的整个结构,确保此处的(域名)与域文件中选择的名称匹配。

此时的代码如下所示,仅仅是一个PDDL规划问题的框架基础代码。

domain.pddl

;Header and description(define (domain domain_name);remove requirements that are not needed
(:requirements :strips :fluents :durative-actions :timed-initial-literals :typing :conditional-effects :negative-preconditions :duration-inequalities :equality)(:types ;todo: enumerate types and their hierarchy here, e.g. car truck bus - vehicle
); un-comment following line if constants are needed
;(:constants )(:predicates ;todo: define predicates here
)(:functions ;todo: define numeric functions here
);define actions here
)

problem.pddl

(define (problem problem_name) (:domain domain_name)
(:objects
)(:init;todo: put the initial state's facts and numeric values here
)(:goal (and;todo: put the goal condition here
));un-comment the following line if metric is needed
;(:metric minimize (???))
)

3.调用在线规划器

由于作者不太会安装VAL工具(学习中),所以先介绍在线运行的过程。

当准备在域和问题文件上运行规划器时,可以通过文件内容或编辑器选项卡的上下文菜单,或通过 Alt + P 快捷方式调用规划器(planner)。这个 planning.domains 解析器将将被使用,因此不要发送任何敏感的PDDL代码。

  • 在线规划器地址:http://solver.planning.domains/solve

第一步,编写一个 domain 示例代码。

  • predicates:谓词定义
  • action:动作包括pick、move和drop

domain.pddl

(define (domain gripper-strips)(:predicates (room ?r)(ball ?b)(at ?b ?r)(at-robby ?r)(gripper ?g)(free ?g)(carry ?b ?g))(:action pick:parameters(?obj ?room ?gripper):precondition (and (ball ?obj) (room ?room) (gripper ?gripper)(free ?gripper) (at ?obj ?room) (at-robby ?room)):effect (and (not (free ?gripper)) (carry ?obj ?gripper) (not (at ?obj ?room))))(:action move:parameters (?from ?to):precondition (and (room ?from) (room ?to) (at-robby ?from)):effect (and (at-robby ?to)(not (at-robby ?from))))(:action drop:parameters (?room ?ball ?gripper):precondition(and (room ?room) (ball ?ball) (at-robby ?room) (gripper ?gripper)(not (free ?gripper)) (carry ?ball ?gripper)(at-robby ?room)):effect (and (free ?gripper) (at ?ball ?room) (not(carry ?ball ?gripper))))
)

第二步,编写一个 problem 示例代码。

  • objects:两个房间,两个球,左右移动
  • init:初始化

question.pddl

(define (problem solve)(:domain gripper-strips)(:objects rooma roomb ball1 ball2 left right)(:init (room rooma)(room roomb) (ball ball1) (ball ball2)(gripper left) (gripper right) (free left) (free right)(at ball1 rooma) (at ball2 rooma) (at-robby rooma))(:goal (and(at ball1 roomb)(at ball2 roomb)))
)

第三步,如果右键选中直接运行或按 alt+P 运行planner,它会提示错误。

第四步,点击如下图所示的“Test”按钮并创建。

生成如下图所示的测试树状图,并且准备调用远程的 planning.domains 服务器

  • Planning service: http://solver.planning.domains/solve
  • Domain: gripper-strips, Problem: solve

第五步,点击“domain”右边的三角运行按钮,生成如下图所示的测试报告。注意,右边的“Planner output”是一个规划路径的输出方案。

同时,我们可以双栏打开窗口。

注意,其实我们直接在Explorer中选中PDDL文件,右键“PDDL: Run the planner and display the plan”按钮可以生成运行的规划结果。不需要创建Test,如下图所示,但仍然会进行远程连接。

至此,我们线上运行PDDL规划器的方法介绍完毕。该代码具体的含义及基础语法我们将在第四部分详细介绍。

Finished executing tests from VSCode/PDDL-test01/domain.ptest.json.
Planning service: http://solver.planning.domains/solve
Domain: gripper-strips, Problem: solve--- OK.Match tree built with 18 nodes.PDDL problem description loaded: Domain: GRIPPER-STRIPSProblem: SOLVE#Actions: 18#Fluents: 14
Landmarks found: 2
Starting search with IW (time budget is 60 secs)...
rel_plan size: 5
#RP_fluents 7
Caption
{#goals, #UNnachieved,  #Achieved} -> IW(max_w){2/2/0}:IW(1) -> [2][3][4]rel_plan size: 4
#RP_fluents 6
{2/1/1}:IW(1) -> [2][3][4][5][6][7];; NOT I-REACHABLE ;;
Total time: -8.64267e-10
Nodes generated during search: 42
Nodes expanded during search: 35
IW search completed
Starting search with BFS(novel,land,h_add)...
--[4294967295 / 8]--
--[1 / 8]--
--[1 / 6]--
--[1 / 5]--
--[1 / 4]--
--[1 / 2]--
--[1 / 1]--
--[1 / 0]--
--[0 / 0]--
Total time: -1.51992e-09
Nodes generated during search: 22
Nodes expanded during search: 7
Plan found with cost: 7
BFS search completed
0.00100: (pick ball2 rooma left)
0.00200: (move rooma roomb)
0.00300: (drop roomb ball2 left)
0.00400: (move roomb rooma)
0.00500: (pick ball1 rooma left)
0.00600: (move rooma roomb)
0.00700: (drop roomb ball1 left)
☑ question.pddl (1.176 sec)
Planner found 1 plan(s) in 1.177secs.

补充知识点
在VS Code中,如果PDDL存在错误或警告,我们是可以动态修复的,比如上述代码存在 “Undeclared requirement :negative-preconditions” 问题。


点击则可以进行修复,“Add missing requirement: negative preconditions”。


修改后如下图所示。


4.本地规划器配置

上述方法非常依赖网络,因此官方不建议将私有代码上传运行。如果断网情况下,它会提示错误“Error: PDDL Planning Service returned code 400 Invalid header received from client”。

此时,我们需要尝试配置您自己的 PDDL 规划器,并在本地能运行代码。

作者尝试本地配置规划器一直失败,希望了解的读者能评论分享下,谢谢。

第一步,点击“Show configuration”,接着会显示PDDL Overview页面,显示“AI Planning and PDDL support in VS Code”。

该页面显示的配置信息如下:

  • planning engine(在线规划引擎)
    Planning service: http://solver.planning.domains/solve
  • PDDL parser(PDDL解析器)
    c:\Users\xxx\AppData\Roaming\Code\User\globalStorage\jan-dolejsi.pddl\val\Val-20210215.2-win64\bin\Parser.exe
  • Plan Validator(规划验证器)
    c:\Users\xxx\AppData\Roaming\Code\User\globalStorage\jan-dolejsi.pddl\val\Val-20210215.2-win64\bin\Validate.exe

第二步,点击“Add a PDDL Planner”按钮,添加规划引擎。

选择POPF选项,选择对应的popf.exe程序(未找到)。

  • https://nms.kcl.ac.uk/planning/software/popf.html

第三步,继续点击“Planning engine”后面的加号,添加本地请求的网址。

  • http://localhost:8080/request

最后还是失败,o(╥﹏╥)o,知道的大佬救救孩子吧!


四.PDDL基础语法知识

四个球移动的任务(Gripper task with four balls):假设有一个机器人可以在两个房间之间移动,并用两条手臂中的任何一条捡起或扔掉球。 最初,所有球和机器人都在第一个房间,我们希望移动球到第二个房间中。

  • 对象: 两个房间、四个球和两个机械臂。
    Objects:The two rooms, four balls and two robot arms.
  • 谓词:x是一个房间? x是球? 球x在房间y内?机械臂x是空的吗?
    Predicates:Is x a room? Is x a ball? Is ball x inside room y? Is robot arm x empty? […]
  • 初始状态:所有球和机器人都在第一个房间, 所有机器人手臂都是空的。
    Initial state:All balls and the robot are in the first room. All robot arms are empty. […]
  • 目标说明:所有球必须在第二个房间。
    Goal specification:All balls must be in the second room.
  • 动作/操作:机器人可以在房间之间移动、捡球或丢球。
    Actions/Operators:The robot can move between rooms, pick up a ball or drop a ball.

接下来简单给出基本定义,由于其英语直译非常明确,这里仅给出描述,下一篇文章再进行详细的语法介绍。

Gripper task: Objects

Gripper task: Predicates

Gripper task: Initial state

  • 初始状态四个球都在房间rooma中

Gripper task: Goal specification

  • 目标:将四个球移动到roomb中

Gripper task: Movement operator

  • 移动操作:机器人从x移动到y

Gripper task: Pick-up operator

  • pick-up操作:机器人使用z从y中捡起x

Gripper task: Drop operator

  • drop操作:机器人使用z从y中丢掉x

A Note on Action Effects


五.总结

写到这里,本文就介绍完毕,希望对您有所帮助。

  • 一.PDDL简介
  • 二.VSCode安装教程
  • 三.PDDL基础案例快速入门
    1.Getting started
    2.创建文件
    3.调用在线规划器
    4.本地规划器配置
  • 四.PDDL基础语法知识
  • 五.总结

大学之道在明明德,
在亲民,在止于至善。
这周又回答了很多博友的问题,有大一学生的困惑,有论文的咨询,也有老乡和考博的疑问,还有无数博友奋斗路上的相互勉励。虽然自己早已忙成狗,但总忍不住去解答别人的问题。最后那一句感谢和祝福,永远是我最大的满足。虽然会花费我一些时间,但也挺好的,无所谓了,跟着心走。不负遇见,感恩同行。莫愁前路无知己,继续加油。晚安娜和珞。


参考文献:

  • Dongbox PDDL - CSDN 谢小波老师
  • pddl智能规划语言基础学习笔记 - 知乎 寻风者风寻老师
  • https://github.com/KCL-Planning/VAL
  • https://www.youtube.com/watch?v=XW0z8Oik6G8
  • https://marketplace.visualstudio.com/items?itemName=jan-dolejsi.pddl
  • PDDL Tooling - Episode 1: Planning.Domains session
  • https://www.programmersought.com/article/47365369263/
  • https://arxiv.org/pdf/2008.11069.pdf
  • https://blog.csdn.net/HitmeowEcho/article/details/105982457

[PDDL人工智能] 01.PDDL规划器安装及入门详解(规划领域定义语言)相关推荐

  1. 【胖虎的逆向之路】01——动态加载和类加载机制详解

    胖虎的逆向之路 01--动态加载和类加载机制详解 一.前言 二.类的加载器 1. 双亲委派模式 2. Android 中的类加载机制 1)Android 基本类的预加载 2)Android类加载器层级 ...

  2. 机器视觉库之detectron2安装及使用详解

    机器视觉库之detectron2安装及使用详解 本文转自:https://blog.csdn.net/qq_18560985/article/details/124539628 文章目录 前言 一.D ...

  3. Windows系统Git安装教程(详解Git安装过程)

    Windows系统Git安装教程(详解Git安装过程)   今天更换电脑系统,需要重新安装Git,正好做个记录,希望对第一次使用的博友能有所帮助! 获取Git安装程序   到Git官网下载,网站地址: ...

  4. python flask安装_python flask安装和命令详解

    Flask Web开发实战学习笔记 Flask简介 Flask是使用Python编写的Web微框架.Web框架可以让我们不用关 心底层的请求响应处理,更方便高效地编写Web程序.因为Flask核心简 ...

  5. 从文本界面安装RHEL5操作系统详解

     从文本界面安装RHEL5操作系统详解 译: -从图形化界面安装系统,按回车键      -从文本界面安装系统,输入linux text 回车      -使用功能键列出下面更多的信息 [F1-主界面 ...

  6. html标签非成对,深入document.write()与HTML4.01的非成对标签的详解

    深入document.write()与HTML4.01的非成对标签的详解 (一)HTML4.01中的非成对标签: 注释标签: 严格来讲不算HTML标签的:文档声明标签 设置页面元信息的:标签 设置网页 ...

  7. Julia的安装与配置详解(包含在Ubuntu 18.04和Windows 10系统上Julia的安装)

    Julia的安装与配置详解((包含在Ubuntu 18.04和Windows 10系统上Julia的安装) Julia的安装 使用二进制文件安装Julia 在Ubuntu上安装Julia 在Windo ...

  8. 垃圾收集器G1和ZGC详解

    垃圾收集器G1和ZGC详解 1.G1(Garbage-First) 1.1.分代特性 1.2.G1回收流程 1.3.G1回收主要算法 1.3.1.G1垃圾回收算法 1.3.2.G1筛选回收筛选算法 1 ...

  9. FT2232作为JTAG烧录器的使用步骤详解

    FT2232作为JTAG烧录器的使用步骤详解 FT2232作为JTAG烧录器的使用步骤详解 配置OpenOCD环境(已经配置好的可以跳过) [步骤 1]安装 FT2232HL 芯片的驱动,安装文件为 ...

  10. 云计算、大数据、人工智能傻傻分不清楚?本文详解这三者的关系

    云计算.大数据.人工智能傻傻分不清楚?本文详解这三者的关系 提示: 今天跟大家讲讲云计算.大数据和人工智能.这三个词现在非常火,并且它们之间好像互相有关系. 一般谈云计算的时候会提到大数据.谈人工智能 ...

最新文章

  1. 【常用技巧精选】尺取法
  2. 最好用的 IntelliJ 插件 Top 10
  3. 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]...
  4. 2015年9月13日-9月15日课程作业(sed、awk)
  5. 全国计算机等级考试题库二级C操作题100套(第45套)
  6. 蓝桥杯 平面切分(欧拉定理)
  7. idea 新建的java项目没发run_IntelliJ IDEA创建普通的Java 项目及创建 Java 文件并运行的教程...
  8. nodejs+supertest+mocha 接口测试环境搭建
  9. java将属性练成字符串,Java中通过属性字符串名取属性内容
  10. php图片上传有黑色背景,php Imagemagick jpg黑色背景
  11. LeetCode(557)——反转字符串中的单词 III(JavaScript)
  12. JavaScript jQuery bootstrap css ajax
  13. PostgreSQL 中如何delete重复数据
  14. 不好的测试实践——软件测试的尽早介入
  15. 一文搞懂JVM架构:java数据结构和c语言数据结构区别
  16. Eclipse安装SVN插件和svn连接器
  17. 逻辑门 与 买猫电路升级版
  18. Python hypot() 函数
  19. BATT集体发力搜索,争夺下一代搜索平台的“引路人”
  20. vue3使用screenfull实现全屏

热门文章

  1. yxy小蒟蒻的201117总结
  2. 天猫精灵服务器修改密码,天猫精灵怎么解绑 天猫精灵解绑账号方法
  3. ubuntu 19查看和修改时区
  4. php 交换机 密码,S5100系列交换机使用正确的用户名和密码进行SSH登录时提示错误的解决方法...
  5. 嵌入式ERPC框架正式发布了
  6. LOJ-10105(欧拉回路模板,套圈法,递归)
  7. 100 句世界哲学语录【句句珠玑细细品味】
  8. 用户登录页面以及后台方法、拦截器
  9. 光纤存储服务器虚拟化,光纤存储DELL MD3600连接VMware ESX 65
  10. 10006---当当架构部张亮:从码农到大牛,技术与心境的双重提升