AI編程范式 第4章 GPS:The General Problem Solver(三)

4.12 新的問(wèn)題來(lái)了:猴子和香蕉問(wèn)題

為了顯示我們的GPS真的是通用的套利,需要在不同的問(wèn)題中檢驗(yàn)。我們來(lái)看一看一個(gè)經(jīng)典的AI問(wèn)題悉默,最初是由Saul Amarel在1968年提出的城豁。想象下面的場(chǎng)景:一只饑餓的猴子正站在一個(gè)房間的門口,在房子的正中間房頂上抄课,用繩子吊著一串香蕉唱星,剛剛好高度是猴子夠不著的。在門附近有一把椅子剖膳,足夠輕便魏颓,猴子推得動(dòng),也足夠高度吱晒,猴子可以站在上面拿到香蕉甸饱。為了讓事情再?gòu)?fù)雜些,假設(shè)猴子手里拿著一個(gè)玩具球仑濒,而且規(guī)定一次只能在手里持一件東西叹话。
在嘗試表現(xiàn)這樣的場(chǎng)景的時(shí)候,我們可以靈活選擇把什么放到當(dāng)前狀態(tài)墩瞳,把什么放進(jìn)操作符驼壶。假設(shè)我們?nèi)绱硕x操作符:

(defparameter *banana-ops*
?(list
? ?(op ‘climb-on-chair
? ? ?:preconds ‘(chair-at-middle-room at-middle-room on-floor)
? ? ?:add-list ‘(at-bananas on-chair)
? ? ?:del-list ‘(at-middle-room on-floor))
? ?(op ‘push-chair-from-door-to-middle-room
? ? ?:preconds ‘(chair-at-door at-door)
? ? ?:add-list ‘(chair-at-middle-room at-middle-room)
? ? ?:del-list ‘(chair-at-door at-door))
? ?(op ‘walk-from-door-to-middle-room
? ? ?:preconds ‘(at-door on-floor)
? ? ?:add-list ‘(at-middle-room)
? ? ?:del-list ‘(at-door))
? ?(op ‘grasp-bananas
? ? ?:preconds ‘(at-bananas empty-handed)
? ? ?:add-list ‘(has-banans)
? ? ?:del-list ‘(empty-handed))
? ?(op ‘drop-ball
? ? ?:preconds ‘(has-ball)
? ? ?:add-list ‘(empty-handed)
? ? ?:del-list ‘(has-ball))
? ?(op ‘eat-banans
? ? ?:preconds ‘(has-bananas)
? ? ?:add-list ‘(empty-handed not-hungry)
? ? ?:del-list ‘(has-bananas hungry))))

使用這些運(yùn)算符,可以展現(xiàn)的問(wèn)題就是讓猴子不再饑餓喉酌,給定的初始狀態(tài)热凹,在門口泵喘,站在地板上,拿著球般妙,饑餓纪铺,在門口有把椅子。GPS可以找到一個(gè)這個(gè)問(wèn)題的解決方案:

> (use *banana-ops*) => 6
?> (GPS '(at-door on-floor has-ball hungry chair-at-door)
'(not-hungry) )
((START)
(EXECUTING PUSH-CHAIR-FROM-DOOR-TO-MIDDLE-ROOM)
(EXECUTING CLIMB-ON-CHAIR)
(EXECUTING DROP-BALL)
(EXECUTING GRASP-BANANAS)
(EXECUTING EAT-BANANAS))

這里沒(méi)有對(duì)原來(lái)的GPS程序作出任何的改動(dòng)碟渺,僅僅是使用了一個(gè)新的操作符集合鲜锚。

4.13 迷宮搜索問(wèn)題

現(xiàn)在我們來(lái)看看另一個(gè)經(jīng)典問(wèn)題,迷宮搜索苫拍。我們假定有一個(gè)迷宮芜繁,如下圖所示:


Maze.JPG

定義一些函數(shù)來(lái)幫助構(gòu)建針對(duì)問(wèn)題的操作符,比直接定義一大串操作符要容易得多绒极。下面的代碼定義了一般的迷宮操作符集合骏令,以及這個(gè)特定迷宮:

(defun make-maze-ops (pair)
? “Make maze ops in both directions”
? (list (make-maze-op (first pair) (second pair))
? ? (make-maze-op (second pair) (first pair))))

(defun make-maze-op (here there)
?“Make an operator to move between two places”
?(op ‘(move from ,here to ,there)
? ?:preconds ’((at ,here))
? ? ?:add-list ‘((at ,there))
? ?:del-list ’((at ,here))))

(defparameter *maze-ops*
?(mappend #’make-maze-ops
? ?‘((1 2) (2 3) (3 4) (4 9) (9 14) (9 8) (8 7) (7 12) (12 13)
? ?(12 11) (11 6) (11 16) (16 17) (17 22) (21 22) (22 23)
? ?(23 18) (23 24) (24 19) (19 20) (20 15) (15 10) (10 5) (20 25))))

現(xiàn)在我們可以使用操作符的列表來(lái)解決這個(gè)迷宮的一些問(wèn)題。我們也可以通過(guò)給定的連接的列表來(lái)創(chuàng)建另一個(gè)迷宮垄提。注意沒(méi)有證據(jù)表明迷宮的形式必須是55一層的伏社,他僅僅是一種連接具象化的表示方式。
> (use *maze-ops*) => 48
> (gps '((at 1)) '((at 25)))
((START)
(EXECUTING (MOVE FROM 1 TO 2))
(EXECUTING (MOVE FROM 2 TO 3))
(EXECUTING (MOVE FROM 3 TO 4))
(EXECUTING (MOVE FROM 4 TO 9))
(EXECUTING (MOVE FROM 9 TO 8))
(EXECUTING (MOVE FROM 8 TO 7))
(EXECUTING (MOVE FROM 7 TO 12))
(EXECUTING (MOVE FROM 12 TO 11))
(EXECUTING (MOVE FROM 11 TO 16))
(EXECUTING (MOVE FROM 16 TO 17))
(EXECUTING (MOVE FROM 17 TO 22))
(EXECUTING (MOVE FROM 22 TO 23))
(EXECUTING (MOVE FROM 23 TO 24))
(EXECUTING (MOVE FROM 24 TO 19))
(EXECUTING (MOVE FROM 19 TO 20))
(EXECUTING (MOVE FROM 20 TO 25))
(AT 25))

迷宮問(wèn)題指出了一個(gè)隱秘的小bug塔淤。我們要GPS返回的是一系列執(zhí)行的操作的列表摘昌。然而,因?yàn)榭紤]到目標(biāo)達(dá)成也可以沒(méi)有任何操作高蜂,所以聪黎,在GPS返回值中加上了(START)。這些例子包含了START和EXECUTING形式备恤,但是也包含了一系列的(AT n)稿饰。這就是bug。如果我們回過(guò)頭看看函數(shù)GPS露泊,就會(huì)發(fā)現(xiàn)他的結(jié)果是根據(jù)achieve-all返回的狀態(tài)刪除所有的原子得來(lái)的喉镰。這是一個(gè)雙關(guān),我們所說(shuō)的移除原子就是移除除了(start),(executing action)之外的形式惭笑。到現(xiàn)在為止侣姆,所有的這些條件都是原子,所以方法可用沉噩。迷宮問(wèn)題是從形式(AT n)中引入條件捺宗,所以首先這就是個(gè)問(wèn)題〈桑基本的精神就是當(dāng)一個(gè)程序員使用雙關(guān)的時(shí)候蚜厉,也就是將真正發(fā)生的事情用比較通俗的話來(lái)說(shuō),就會(huì)出現(xiàn)一些麻煩畜眨。我們真正想要做的不是刪除原子昼牛,而是找到所有知識(shí)操作的元素术瓮。下面的代碼就是主要的意思:
(defun GPS (state goals &optional (*ops* *ops*))
?“General Problem Solver: from state, achieve goals using *ops*.”
?(find-all-if #’action-p
? ?(achieve-all (cons ‘(start) state) goals nil)))

(defun action-p (x)
?“Is x something that is (start) or (executing …)?”
?(or (equal x ‘(start)) (executing-p x)))

迷宮問(wèn)題也顯示出了一個(gè)版本2的優(yōu)點(diǎn):就是他會(huì)返回所做的操作的表現(xiàn),而不僅僅是打印他們贰健。這樣子就可以利用結(jié)果來(lái)進(jìn)行一些處理斤斧,而不是僅僅看看而已。假設(shè)我們想要一個(gè)函數(shù)霎烙,給我們一個(gè)穿越迷宮的路徑,用一系列的位置表示蕊连。我們可以將GPS作為一個(gè)子函數(shù)調(diào)用悬垃,之后再操作結(jié)果。
(defun find-path (start end)
?“Search a maze for a path from start to end.”
?(let ((results (GPS ‘((at ,start)) ’((at ,end)))))
? ?(unless (null results)
? ? ?(cons start (mapcar #’destination
? ? ? ?(remove ‘(start) results
? ? ? ? ?:test #’equal))))))

(defun destination (action)
?“Find the Y in (executing (move from X to Y))”
?(fifth (second action)))
函數(shù)find-path調(diào)用GPS來(lái)獲取results甘苍。如果是nil就沒(méi)有答案尝蠕,如果不是nil就會(huì)提取results的rest部分(也就是移除start)。從每一個(gè)形式(executing (move from x to y))中挑選出目的地载庭,y看彼,并且記住起始點(diǎn)。
> (use *maze-ops*) => 48
?> (find-path 1 25) =>
(1 2 3 4 9 8 7 12 11 16 17 22 23 24 19 20 25)
> (find-path 1 1) => (1)
> (equal (find-path 1 25) (reverse (find-path 25 1))) => T

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末囚聚,一起剝皮案震驚了整個(gè)濱河市靖榕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌顽铸,老刑警劉巖茁计,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谓松,居然都是意外死亡星压,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門鬼譬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)娜膘,“玉大人,你說(shuō)我怎么就攤上這事优质】⑻埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵巩螃,是天一觀的道長(zhǎng)贾富。 經(jīng)常有香客問(wèn)我,道長(zhǎng)牺六,這世上最難降的妖魔是什么颤枪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮淑际,結(jié)果婚禮上畏纲,老公的妹妹穿的比我還像新娘扇住。我一直安慰自己,他們只是感情好盗胀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布艘蹋。 她就那樣靜靜地躺著,像睡著了一般票灰。 火紅的嫁衣襯著肌膚如雪女阀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天屑迂,我揣著相機(jī)與錄音浸策,去河邊找鬼。 笑死惹盼,一個(gè)胖子當(dāng)著我的面吹牛庸汗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播手报,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蚯舱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了掩蛤?” 一聲冷哼從身側(cè)響起枉昏,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揍鸟,沒(méi)想到半個(gè)月后凶掰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜈亩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年懦窘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稚配。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畅涂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出道川,到底是詐尸還是另有隱情午衰,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布冒萄,位于F島的核電站臊岸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尊流。R本人自食惡果不足惜帅戒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崖技。 院中可真熱鬧逻住,春花似錦钟哥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扒秸,卻和暖如春播演,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伴奥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工写烤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渔伯。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肄程,于是被迫代替她去往敵國(guó)和親锣吼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 4.11 GPS版本2:一個(gè)更加通用的GPS 這里這個(gè)版本的GPS中蓝厌,我們會(huì)解決跑圈兒?jiǎn)栴}玄叠,兄弟目標(biāo)沖突問(wèn)題,跳之...
    geoeee閱讀 695評(píng)論 0 1
  • 4.14 積木世界問(wèn)題 另一個(gè)引起AI領(lǐng)域中廣泛關(guān)注的問(wèn)題就是積木世界問(wèn)題拓提。想像一群在桌面上玩堆積木的孩子读恃。問(wèn)題就...
    geoeee閱讀 524評(píng)論 0 1
  • 第二部分 早期的AI程序第四章 GPS:The General Problem SolverGPS:通用問(wèn)題解決程...
    geoeee閱讀 2,305評(píng)論 0 5
  • 網(wǎng)易云課堂運(yùn)營(yíng)微專業(yè),我們?yōu)榱颂嵘龍?bào)名人數(shù)代态,在優(yōu)酷上做了一個(gè)30秒的視頻廣告寺惫,對(duì)于這個(gè)視頻廣告,我們要做出廣告效果...
    佳記閱讀 819評(píng)論 0 0
  • 風(fēng)蹦疑,總是 一陣一陣地吹 我的花瓣西雀,就這樣 一陣一陣地飛 曾經(jīng)漫山遍野,那些黃色的花 太陽(yáng)的溫暖歉摧,使他們堅(jiān)強(qiáng) 感恩生...
    俞壹閱讀 259評(píng)論 7 9