人工智能入门——pddl简例

作为一个刚刚学习人工智能的小白,对许多的知识都表示一脸懵逼。随着课程进展到规划问题,不可避免地与pddl相遇,经历了一段时间的学习,下面以小白的角度简要介绍一下pddl,并且附带简例说明。

Planning Domain Definition Language(简称pddl,规划区域定义语言)

是一种标准化的人工智能规划语言,主要涉及到逻辑学以及规划任务问题,这里不细说。大家可以自行谷歌,这有一个关于pddl的PDF文件,里面包含了简介以及最基本的语法,在开启学习之前,首先得自己先了解基本的语法内容。下面是一个最简单的例子。该例子模拟了一个机器人清洁两个房间的简单过程。

domain文件:

(define (domain state)          //domain命名,怎么喜欢怎么来
    (:predicates (room ?r)        //谓词,这里应该包括该文件中出现的所有的谓词逻辑,不然会error:Undefined,这里判断是不是room
                (robot ?rob)       //这里则是判断一个抽象对象rob是不是robot
                (at-robot ?r)          //判断robot是不是在room r中
                (dirty ?r)        //判断room r是不是脏的
                (clean ?r)        //判断room r是不是干净的
                (fullPower ?rob))    //判断机器人robot是不是有电
    (:action sweep             //扫地动作
        :parameters(?robot ?r)      //设置参数
        :precondition           //前提条件(前件)
            (and              //and的意思是以下括号内的都必须为真
                (robot ?robot)      //这个对象robot是robot为真
                (room ?r)         //这个对象r是room为真
                (dirty ?r)        //这个r是dirty的
                (at-robot ?r)      //而且robot在r中刚好为真
                (fullPower ?robot)   //机器人有电
            )
        :effect               //满足以上条件,执行扫地动作,效果为如下
            (and                    
                (clean ?r)        //r已经干净了
                (not  
                    (dirty ?r)      //r不脏
                )
                (not
                    (fullPower ?robot) //机器人没电,默认为扫一个房间即耗尽电量
                )
            )
    )

    (:action charging            //充电动作
        :parameters(?robot ?r)           //两个参数为robot跟r,就近充电
        :precondition 
            (and   
                (robot ?robot)        
                (room ?r) 
                (at-robot ?r)
                (clean ?r)
                (not
                    (fullPower ?robot)
                )
            )
        :effect 
            (and 
                (fullPower ?robot)    //充满电,可进行下一动作
            )
    )

    (:action move               //移动动作
        :parameters (?from ?to)      //从from移动到to
        :precondition 
            (and 
                (dirty ?to)          //移动的前提:to还是脏的,from已经扫干净了,而且robot在扫干净的房间里,想移动到脏的房间
                (clean ?from)
                (room ?from) 
                (room ?to) 
                (at-robot ?from)
            )
        :effect 
            (and 
                (at-robot ?to)       //效果:到达脏的房间,离开干净的房间
                (not 
                    (at-robot ?from)
                )
            )
    )
)

problem(测试)文件:

(define (problem solve)
    (:domain state)
    (:objects 
        rooma roomb robot     //设置对象,这个例子比较简单,只有三个对象,房间a房间b还有机器人
    )
    (:init               //初始化起始状态,有两个房间,都是脏的,机器人在房间a并且满电,注意此处不用(room ?rooma)
        (room rooma)
        (room roomb) 
        (robot robot)
        (dirty rooma)
        (dirty roomb)
        (at-robot rooma)
        (fullPower robot)
    )
    (:goal                        //设定这个规划问题最终要达到的目标状态,两个房间是干净的,并且机器人仍旧是满电待命的
        (and
            (clean rooma)
            (clean roomb)
            (fullPower robot)
        )
    )
)

运行结果:



发布了34 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41111088/article/details/80213873