4.15 重復第五階段:版本2的分析
關于GPS在多個問題領域內(nèi)的擴展性我們已經(jīng)展示過了。重點就在于我們不需要改變程序本身來適應新的問題;我們僅僅改變傳遞給GPS的操作符列表就可以了。在不同問題上的經(jīng)驗確實也顯示要做出一些更改,我們也展示了如何去適應一些改變。雖然版本2比版本1 有了大的改進,仍然還是有很多問題。現(xiàn)在我們就發(fā)現(xiàn)了一些最棘手的問題。
4.16 不跳就不看的問題
我們解決跳之前看一看問題的方式是引入一些變量來保存一個未來可能的程序狀態(tài)的表示,而不是僅僅使用單一變量來存儲當前的狀態(tài)。這防止了GPS做出一些不好的行為,但是我們也會看到即使是所有的預防手段在最后一節(jié)都引入之后,還是不能保證可用的解決方法可以計算得出。
為了找到這個問題,在school-ops列表之前加上另一個操作符,并且把調(diào)試輸出打開。
(use (push (op ‘taxi-son-to-school
:preconds ‘(son-at-home have-money)
:add-list ‘(son-at-school)
:del-list ‘(son-at-home have-money))
*school-ops*))
(debug :gps)
現(xiàn)在設想一下不適用任何錢就把孩子送到學校的問題:
> (gps '(son-at-home have-money car-works)
'(son-at-school have-money))
Goal: SON-AT-SCHOOL
Consider: TAXI-SON-TO-SCHOOL
Goal: SON-AT-HOME
Goal: HAVE-MONEY
Action: TAXI-SON-TO-SCHOOL
Goal: HAVE-MONEY
Goal: HAVE-MONEY
Goal: SON-AT-SCHOOL
Consider: TAXI-SON-TO-SCHOOL
Goal: SON-AT-HOME
Goal: HAVE-MONEY
Action: TAXI-SON-TO-SCHOOL
NIL
頭五行輸出顯示成功解決了兒子在學校這個目標,但是后面遇到還有錢的目標是顯示失敗了。下一步就是嘗試換一下順序。這一次,首先嘗試有錢這個目標,成功了,之后孩子在學校這個目標被行為打出租去學校行為完成。但是在achieve-all檢查一致性的時候失敗了,而且沒有挽回的手段。目標失敗,即使是說有一個合法的方法存在:開車去學校。
問題在于achieve使用some來尋找appropriate-ops。因此,如果有合適的操作符,achieve就完成了。如果僅僅是有一個目標的話,這的確是一個好方法。然而,如果是有多個目標,就像上面的情況,achieve會只找到一個滿足第一個目標的方法,如果這個方法失敗,為一個挽救方法就是嘗試修補這個方法。在如積木世界和迷宮世界的問題中,修補常常是可行的,因為所有的步驟都是可逆的。但是在出租車這個例子中的話,錢一旦花出去了,就沒有修補方案可以挽回了,整個計劃就會失敗。
解決這個問題主要有兩種方式,第一種是事先檢測所有可能的解決方案,而不僅僅是滿足子目標的第一個方案。Prolog語言,會在第11章討論的內(nèi)容中,就是這么干的。第二種方式是讓achieve和achieve-all追蹤一個被保護的目標的列表。在出租車這個例子中,我們先完成了還有錢這個目標之后嘗試完成把孩子送學校這個目標,但是會先把還有錢這個目標保護起來,有所保留。如果一個操作符僅僅是因為被保護目標的刪除而合適的話,就會要求程序進行一些修補,檢索更多的方案。
4.17 描述力缺乏的問題
在迷宮問題中,如果是有一個操作符可以將我們從這里移到那里,如果說這里到那里有一個連接存在的話,那么就會顯得簡單高效很多了。對于一些特定問題的輸入也哭了一列出一些合法的連接,我們可以使用單一的操作符來解決迷宮問題。相似的,我們可以定義一個操作符在猴子把椅子從門口推向屋里的動作,一般化成吧鄰近的任意位置的可以推的東西推向任意位置,只要中間沒有障礙物就好了。這個結論可以到處操作符中會有變量,所以我們可以這么說:
(op ‘(push X from A to B)
?:preconds ‘((monkey at A) (X at A) (pushable X) (path A B))
?:add-list ‘((monkey at B) (X at B))
?:del-list ‘((monkey at A) (X at A)))
經(jīng)常性的,我們廟會一些特征是根據(jù)比一系列的條件更加抽象的事物來描述的。例如,在下棋問題中,目標是將對手的軍,是一種難以用簡單斷言來描述的情況,比如(black king A 4),所以我們在結果狀態(tài)中需要一種常量來能夠做出描述,而不是僅僅列出它的組件。我們可能希望能夠獲取條件的分離或者否決,在當前狀態(tài)下只允許一種組合的時候。
在很多問題中,能夠描述處理時間的問題也是很重要的:我們想要在時間T0之前大城目標X,之后在時間T2之前但是一定要在T1之后,達成目標Y。時間表在工廠中的應用就是個例子,時間扮演了很重要的角色。
花費,經(jīng)常是和行為有相關性的,所以我們就尋找最小花費的解決方法,或者是接近最小花費。花費的意思也許就是解決方法所要求的操作符執(zhí)行的數(shù)量,在積木世界問題中我們看到一個唄應用的操作符可以被馬上忽略,轉而被一個需要滿足一些先決條件的操作符取代。或者我們可能只蠻夷一部分的解決方案,如果整體的解決方案不可行或者太火昂貴的話,我們也許會想要花費計算空間來換取時間。
4.18 完美信息問題
我們之前遇到過的所有操作符都有明晰的結果;從當前狀態(tài)中增加或者刪除指定的東西,GPS總是準確的知道他要做什么。在真實世界中,事情不是這么明了和干脆的。我們回到變有錢這個問題上來,一個比較中肯的操作符是去買彩票。這操作符的效果是花費一些鈔票來換取中彩票的幾率。但是這僅僅是幾率,小的可憐。相似的,我們不能忽視具體事情執(zhí)行的時候,會發(fā)生意想不到的困難。在送孩子去學校問題中,我們說的是車子的問題在于電池,GPS的顯式檢查來看看車子是不是可以工作。或者需要電池,每一次程序都會考慮開車這個操作符。在現(xiàn)實世界中,很少會這么小心,我們坐進車子里,僅僅是在不能開的時候才會想到是電池的問題。
4.19 相互作用的目標問題
人們往往傾向于同時有多個目標,而不是一次搞定一個再去想下一個。不僅僅是開車送孩子去學校,還要同時注意不被別的車子撞上,準時上班,搞定工作任務,見見朋友,找點樂子,保持呼吸,等等等等。也是要不得不自己去發(fā)現(xiàn)目標,而不是由其他人來告訴你一些預先定義好的目標。有一些目標我們可以放在心里好幾年之久,之后等時機成熟了在執(zhí)行完成。沒有一種合適所有目標的標記方法。但是卻有一中完成一些目標的可持續(xù)過程,完成一部分,放棄或者推遲另外一部分。
除了達成既有的目標之外,人們還會注意防止需要避免的情況出現(xiàn)。例如,假設我有一個朋友住醫(yī)院了,我想去看望看望他,這就需要我人到醫(yī)院這么一個行為。一個可用的操作符就是走去醫(yī)院,還有另一個操作符是故意把自己弄傷等救護車來送我去,或許會更快。第二個操作符僅僅是達成了目標,但是去產(chǎn)生了人們不想要的副作用。這可能會記錄在方案花費的標記中,人們會避免對一些背景的目標有所損害,比如個人的健康。
Herb Simon提出了術語滿意度來描述達成一個合理水平的合理目標的策略,也包含了同時推遲或者放棄的其他目標的影響。GPS僅僅知道成功和失敗,因此僅僅是片面成功的最大化罷了。
4.20 GPS的最后
最后四個小節(jié)的內(nèi)容給出了對于GPS局限的領域的一些暗示。事實上,GPS并不是一個完全通用的問題解決程序。在算法沒有綁定特定領域問題的層面上,他的確是個通用的程序;我們也可以通過更改操作符來更改問題領域。但是GPS在無法解決很多有趣的問題的時候就是去了通用性。限制在一些小的技巧和游戲之中。
GPS最終失敗的原因很是微妙,其中一個就是說他出現(xiàn)在不被世人欣賞的1957年,去愛現(xiàn)在成了計算機科學的核心。現(xiàn)在一些被認為是計算機無法解決的問題,并不是說理論上正確的程序?qū)懖怀鰜恚且驗槌绦驁?zhí)行的時間實在是太長。很多問題都被歸類為這類叫做NP困難問題。計算這些問題的時間隨著問題的規(guī)模的增長,時間呈指數(shù)級增長。這是因為問題本身的特性導致的,跟程序員本身的質(zhì)素沒有關系。指數(shù)級增長的意思是五個輸入會花費幾秒鐘求解的問題,100個輸入就需要幾億年的時間來處理了。即使買更快的電腦也無濟于事。最終來說,如果你有一個需要幾億年才能解決的問題,買了100臺比現(xiàn)在的電腦快1000倍的電腦來處理,也還是要等上幾百萬年的。對于理論計算機科學家來說,發(fā)現(xiàn)問題是NP困難問題就是答案本身了,但是對于AI來說,就以為這被問了錯誤的問題。很多NP困難問題在我們不堅持最佳解決方案,退而求其次的時候就會簡單很多了。
GPS的輸入基本上就是一個程序,GPS的執(zhí)行也就是程序的執(zhí)行。如果GPS的輸入語言組足夠通用可以用來表達任何程序。那他不能解決的問題要么沒有答案要么時間太長。現(xiàn)代的問題解決程序會辨認這些基礎的制限,或者限制問題的規(guī)模,或者找一個接近的解決方法或者部分的解決。一些問題解決程序也會監(jiān)視執(zhí)行時間,當問題太過困難就會放棄執(zhí)行。
下面引用的話是出自Drew McDermott的文章《人工智能遇上天然的愚蠢》,概括了當時對于GPS的感覺。記住它,下次你不得不評價一個程序的時候會有用的。
GPS?現(xiàn)在,GPS就是一個沒有意義的術語,僅僅是給出了一個解謎語的愚蠢程序。但是他既然叫做一般問題解決器,但是僅僅是吊起了人們沒有意義的興奮和好奇。他應該叫做LFGNS,本地特定導引萬羅搜索器。
盡管如此,GPS還是一個用來瀏覽編程技巧的有用程序,特別是在AI編程這方面。更重要的是,他會是一個來看純粹的思考的工具。當然我們承認亞里士多德要比你我聰明的多,用隱喻來說明計算模型的概念,使人們更加欣賞目的手段分析法了,至少是在計算模型這個方面。我們也必須堅持并不是所有的思考都是按照這個模型走的。
AI的吸引力在于一種目的和手段的分離。一個成功的AI項目的結果可以使一個程序,吧之前能做的事情做的更好更快。在這意義上來說,GPS是一個失敗之作,沒有很好地解決特定的問題。但是他對于問題解決過程的調(diào)查和格式化,從某種程度上來說是陳宮的,讓讀者對整個過程有個更好的理解。