PDDL-人工智能领域规划语言学习笔记-1

一份完整的PDDL程序代码是由domain文件和problem文件组成。在详细介绍这两者之前,我们先看一下PDDL代码中常见的数据成员(本文章涉及的数据成员仅为最基础的解决一个简单问题需要,其它待深入学习以后才能了解)

  • objects:在规划过程中涉及到的对象
  • init: 初始状态
  • goal: 目标,也就是我们要到达的目标下各个对象的状态
  • predicates:objects的属性的描述,可以为True或者False
  • action:对objects的操作,action应该包含三个描述,一个是涉及的对象,一个是进行action之前涉及对象的状态,以及action之后对象的状态

其中,init, goal, objects是problem文件的组成部分,其它是domain文件的组成。

接下来我们通过一个例子来说明

假设有两个房间rooma和roomb,有两个球ball1和ball2都在rooma中,我们有一个机器人robby在romma中
robby有两只手臂left和right,现在我们要让robby把两个球从rooma中移到roomb中去

domain

domain的定义

(define (domain )
    (:predicates )
    (:action 
     :parameters 
     :precondition 
     :effect 
    )
)

我们来对例子中的问题写domain
objects是很明显的,具体我们在写problem的时候说,我们现在需要知道的关于objects的属性有:
- 判断是不是room
- 判断是不是球
- 判断球在哪个房间
- 判断机器人在哪个房间
- 判断是不是机器人的手臂
- 判断机器人的手臂是不是空闲
- 判断机器人的哪只手臂拿着哪个球

对应以上,我们先完成domain的第一步:

(define (domain gripper-strips)
    (:predicates (room ?r)
                 (ball ?b)
                 (at ?b ?r)
                 (at-robby ?r)
                 (gripper ?g)
                 (free ?g)
                 (carry ?b ?g))
)

接下来我们分析可能需要的动作
第一个动作应该是pick动作,也就是拿起动作,这个需要涉及的objects是球,手臂,房间。拿起的前提是球和机器人在同一个房间,而且机器人的某一手臂是空闲的。现在我们来做第二步

(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)) (carray ?obj ?gripper) (not (at ?obj ?room)))
        )
)

第二个动作是移动动作,机器人从一个房间移动到另一个房间
第三个动作是放下,机器人到达某个房间放下手中的球

(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

Problem 的成员包含objects, init, goal,它的形式是这样的

(define (problem )
    (:domain )
    (:objects )
    (:init )
    (:goal )
)

在本问题下,problem的代码这样写

(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)
        )
    )
)

正如上面例子说明的那样,在init的时候变量前是不需要加?的,加上以后编译器会报错,这时候的init状态给出的是objects的为True
的所有属性,而goal,是需要用and的,代表这些状态必须同时满足,否则也会报错。

你可能感兴趣的:(学习笔记,pddl)