李 麗,王大勇,張 楊,索 菲
(遼寧大學(xué) 創(chuàng)新創(chuàng)業(yè)學(xué)院 遼寧 沈陽(yáng) 110036)
智能規(guī)劃是人工智能的一個(gè)重要分支,其主要思想是在一定的初始條件下,依據(jù)備選動(dòng)作以及動(dòng)作或狀態(tài)的約束進(jìn)行推理,綜合制定出能夠?qū)崿F(xiàn)既定目標(biāo)的動(dòng)作序列的過(guò)程[1-2].智能規(guī)劃廣泛應(yīng)用在車(chē)間調(diào)度、物流管理、智能機(jī)器人、航空航天等領(lǐng)域[3-4].美國(guó)航空航天局(NASA)的EUROPA系統(tǒng)等多項(xiàng)重大項(xiàng)目中均有應(yīng)用.
CLIPS語(yǔ)言是人工智能領(lǐng)域的一個(gè)經(jīng)典語(yǔ)言,普遍應(yīng)用于專(zhuān)家系統(tǒng)[5].CLIPS(C Language Integrated Production System)語(yǔ)言語(yǔ)法簡(jiǎn)潔、易于操作、性能優(yōu)異,是廣大人工智能研究者青睞的一款語(yǔ)言,分為基于規(guī)則的CLIPS、面向?qū)ο蟮腃LIPS和面向過(guò)程的CLIPS.CLIPS包括事實(shí)列表、知識(shí)庫(kù)和推理機(jī)三個(gè)部分.該語(yǔ)言能夠與C、C++等很好的結(jié)合,適合編寫(xiě)基于規(guī)則框架的軟件.規(guī)劃問(wèn)題一般利用了前提、效果的規(guī)則推導(dǎo),因此CLIPS語(yǔ)言同樣適用在智能規(guī)劃表示中.
Python語(yǔ)言是目前比較熱門(mén)的一種編程語(yǔ)言,該語(yǔ)言簡(jiǎn)單、易于操作,包含眾多第三方庫(kù),功能強(qiáng)大、應(yīng)用廣泛.目前很多人工智能領(lǐng)域都基于該語(yǔ)言及其第三方庫(kù)開(kāi)展科學(xué)研究.PyCLIPS庫(kù)是Python中嵌入的一個(gè)功能齊全的CLIPS模塊,可以輕松地實(shí)現(xiàn)CLIPS與編程語(yǔ)言之間的交互[6-7].PyCLIPS支持面向?qū)ο蟮木幊?,支持事件觸發(fā)、事實(shí)動(dòng)態(tài)撤銷(xiāo).由于Python和CLIPS都是由C語(yǔ)言編寫(xiě)的,所以能夠?qū)崿F(xiàn)Python與CLIPS的良好交互.
智能規(guī)劃分為經(jīng)典規(guī)劃和非經(jīng)典規(guī)劃.經(jīng)典規(guī)劃問(wèn)題是一個(gè)三元組P(S,A,γ),其中S是狀態(tài)的集合,A是動(dòng)作的集合,γ是狀態(tài)轉(zhuǎn)換函數(shù).
規(guī)劃問(wèn)題常用的定義語(yǔ)言包括STRIPS、ADL、PDDL,其中STRIPS是一種經(jīng)典的規(guī)劃語(yǔ)言,很長(zhǎng)時(shí)間規(guī)劃系統(tǒng)都是采用STRIPS語(yǔ)言進(jìn)行描述的,但其也有很多限制條件,比如要求文字是無(wú)函數(shù)的、時(shí)間是離散的、動(dòng)作的前提和效果必須是合取的.ADL語(yǔ)言對(duì)STRIPS語(yǔ)言進(jìn)行了擴(kuò)展,取消了一些限制,使得其可以對(duì)更多實(shí)際問(wèn)題進(jìn)行編碼.ADL語(yǔ)言包括STRIPS的所有功能,并且還能表達(dá)動(dòng)作的條件效果和量化效果.PDDL語(yǔ)言到目前為止經(jīng)歷了PDDL1.2、PDDL2.1、PDDL+、PPDDL1.0、PDDL3.0、PDDL4J[8]等多個(gè)版本.PDDL4J是一個(gè)面向Java跨平臺(tái)開(kāi)發(fā)的開(kāi)源工具包.很多的規(guī)劃器都是基于Linux系統(tǒng)開(kāi)發(fā)的.
基于規(guī)則的CLIPS語(yǔ)言是一種多范例編程語(yǔ)言,支持正向鏈規(guī)則,不支持反向鏈規(guī)則,不同環(huán)境下格式也會(huì)有所不同.CLIPS包含三種基本元素,分別為簡(jiǎn)單數(shù)據(jù)類(lèi)型、控制數(shù)據(jù)的函數(shù)和添加知識(shí)的結(jié)構(gòu).CLIPS中提供了8種簡(jiǎn)單數(shù)據(jù)類(lèi)型,能夠完成不同任務(wù)的需求.
CLIPS提供三種知識(shí)表示方式,分別為規(guī)則、函數(shù)和對(duì)象.規(guī)則是基于啟發(fā)式經(jīng)驗(yàn)知識(shí)庫(kù)的首要選擇.函數(shù)包括自定義函數(shù)和通用函數(shù).函數(shù)與面向?qū)ο笤O(shè)計(jì)都是程序式知識(shí)表示的首選.
啟發(fā)式規(guī)則為特定場(chǎng)景定義了一系列出發(fā)動(dòng)作.設(shè)計(jì)者定義一系列規(guī)則,這些規(guī)則將協(xié)同解決一個(gè)實(shí)際問(wèn)題.規(guī)則由前件和后件組成.前件由一系列條件組成,這些條件必須全部滿(mǎn)足,該條規(guī)則才能被觸發(fā).這種由前件推導(dǎo)出后件的模式恰好與智能規(guī)劃的推導(dǎo)方式一致,如圖1、圖2所示.
assert命令會(huì)將一個(gè)或多個(gè)事實(shí)添加到事實(shí)列表中,因此用其定義智能規(guī)劃中的添加效果,其語(yǔ)法規(guī)則如下:
(assert(<事實(shí)名1>)(<事實(shí)名2>)…(<事實(shí)名n>)).
與assert對(duì)應(yīng)的命令為retract,retract命令會(huì)將一個(gè)或多個(gè)事實(shí)從事實(shí)列表中刪除,因此用其定義智能規(guī)劃中的刪除效果,retract的語(yǔ)法規(guī)則如下:
(retract <事實(shí)索引1><事實(shí)索引2>…<事實(shí)索引n>).
這類(lèi)事實(shí)的定義可以借助CLIPS語(yǔ)言中的deftemplate和deffacts來(lái)描述.deftemplate用來(lái)定義狀態(tài)結(jié)構(gòu),deffacts用來(lái)定義智能規(guī)劃中的初始狀態(tài)和目標(biāo)狀態(tài).它們的一般格式為
(deftemplate<狀態(tài)結(jié)構(gòu)名> [<可選注釋>]
<槽定義>*),
(deffacts<狀態(tài)名>[<可選注釋>]
<事實(shí)>*).
CLIPS語(yǔ)言用defrule定義規(guī)則,智能規(guī)劃中可以用defrule定義動(dòng)作,defrule的一般格式為
(defrule<動(dòng)作名>[<注釋>]
<前提>*;前件
=>
<添加效果/刪除效果>*;后件.
利用上述命令,以經(jīng)典規(guī)劃中的圖規(guī)劃為例,對(duì)于積木世界問(wèn)題進(jìn)行表示,選取初始狀態(tài)和目標(biāo)狀態(tài)如圖3所示.
圖規(guī)劃的是智能規(guī)劃的一個(gè)重要分支,圖規(guī)劃問(wèn)題是一個(gè)四元組φ(A,O,I,G),其中A是操作的集合,O是對(duì)象的集合,I是初始狀態(tài)的集合,G是目標(biāo)狀態(tài)的集合[9-10].
利用圖規(guī)劃對(duì)這一問(wèn)題進(jìn)行擴(kuò)張與解搜索,如圖4所示.
圖中時(shí)間步1的命題列為初始狀態(tài),經(jīng)過(guò)時(shí)間步1的動(dòng)作列、時(shí)間步2的命題列和動(dòng)作列,到達(dá)時(shí)間步3的命題列,即目標(biāo)狀態(tài).經(jīng)過(guò)解搜索得到規(guī)劃解的動(dòng)作集為{(put B C)(put A B)}.
這一過(guò)程采用CLIPS語(yǔ)言描述,可以利用assert、retract、deftemplate、deffacts、defrule等命令完成.
用事實(shí)描述正在被處理的積木的目標(biāo),這些目標(biāo)可以用自定義模板來(lái)描述.deffacts自定義事實(shí)結(jié)構(gòu)特別適合程序運(yùn)行前已知知識(shí)的定義,因此用其定義規(guī)劃的初始條件.同理,也可以用deffacts定義規(guī)劃的目標(biāo).具體實(shí)例如下:
(deftemplate goal
(slot on(type STRING))
(slot noting(type STRING)))
(deftemplate initial-state
(slot block(type STRING))
(slot on(type STRING))
(slot noting(type STRING)))
目標(biāo)和初始狀態(tài)的實(shí)例如下:
(deffacts goal
(on A B)
(on B C)
(on C T)
(nothing A))
(deffacts initial-state
(block A)
(block B)
(block C)
(on A T)
(on B T)
(on C T)
(noting A)
(noting B)
(noting C))
利用defrule命令定義規(guī)則put-on,該規(guī)則能夠?qū)⒁粋€(gè)積木搭建在另一塊積木上,規(guī)則定義如下所示.
(defrule put-on
?goal<-(goal(on ?block1 ?block2))
(block ?block1)
(block ?block2)
(nothing ?block1)
(nothing ?block2)
?t<-(nothing ?block2)
=>
(assert(on ?block1 ?block2)
(retract ?t))
實(shí)例推導(dǎo)過(guò)程:
(defrule put-on
?goal<-(goal(on B C))
(block B)
(block C)
(nothing B)
(nothing C)
?t<-(nothing C)
=>
(assert(on B C)
(retract ?t))
(defrule put-on
?goal<-(goal(on A B))
(block A)
(block B)
(nothing A)
(nothing B)
?t<-(nothing B)
=>
(assert(on A B)
(retract ?t))
CLIPS語(yǔ)言有自帶的開(kāi)發(fā)工具,目前最新版本為CLIPS 6.4.系統(tǒng)開(kāi)發(fā)時(shí)需要將CLIPS嵌入到高級(jí)語(yǔ)言中,主要方法為直接嵌入方式和動(dòng)態(tài)鏈接庫(kù)嵌入方式,兩種方式都存在不同程度的實(shí)現(xiàn)繁瑣、通用性差等缺點(diǎn).PyCLIPS可以實(shí)現(xiàn)CLIPS的所有功能,是Python語(yǔ)言的第三方庫(kù).在使用時(shí)只需要遵循Python常規(guī)方式先行導(dǎo)入clips庫(kù),在Python語(yǔ)言中就可以輕松調(diào)用CLIPS的功能.CLIPS與PyCLIPS常用功能對(duì)照如表1所示.
表1 CLIPS與PyCLIPS功能對(duì)照表
程序中部分PyCLIPS語(yǔ)句如下:
>>> import clips
>>>clips.Reset()
>>> t0=clips.BuildTemplate(“goal”,″″″
(slot on (type STRING))
(slotnoting (type STRING))
″″″)
>>>f1=clips.Fact(t0)
……
>>>r1=clips.BuildRule(“put-on”,″″″
?goal<-(goal (on ?block1 ?block2))
(block ?block1)
(block ?block2)
(nothing ?block1)
(nothing ?block2)
?t<-(nothing ?block2)
=>
(assert (on ?block1 ?block2)
(retract ?t))″″″)
本文研究了基于CLIPS語(yǔ)言的智能規(guī)劃表示方法.利用CLIPS語(yǔ)言的事實(shí)和規(guī)則等概念,描述智能規(guī)劃中的對(duì)象、事實(shí)、狀態(tài)和操作.CLIPS方法是經(jīng)典的人工智能表示語(yǔ)言,結(jié)合Python語(yǔ)言及其第三方庫(kù)更易于應(yīng)用在不同情況的處理.當(dāng)然,相比STRIPS、ADL和PDDL語(yǔ)言,CLIPS語(yǔ)言不是專(zhuān)門(mén)的規(guī)劃語(yǔ)言,描述規(guī)劃問(wèn)題時(shí)會(huì)有所局限.