陳凱
源起
迷思,是一個(gè)很有意思的詞語,它的意義,遠(yuǎn)不止于字面上的“迷惑的思考”,據(jù)說它來源于希臘語單詞Μ?θο?(mythos),是英語單詞Myth的音譯,大致是指與現(xiàn)實(shí)事物有所對(duì)應(yīng),能帶給人思索,但卻未必有答案的神話、傳說和虛構(gòu)的故事。列維-斯特勞斯認(rèn)為,人們遇到?jīng)]有辦法完全解決的矛盾時(shí),就會(huì)編造出一些故事來作為“迷思”。似乎有這樣一種感覺,創(chuàng)造這些迷思,其意圖不是為那些矛盾找出解決方案,而是為了找出讓矛盾繼續(xù)存在的恰當(dāng)?shù)睦碛伞?/p>
筆者也創(chuàng)造了一個(gè)虛構(gòu)的故事,故事中的主角是一位探索謎之路徑的學(xué)徒,他在自己的行程中,遇見一處難以通行的關(guān)卡,為了打開關(guān)卡大門,需要解答一個(gè)謎題。但請注意,到現(xiàn)在為止,無論是謎題還是故事本身,它們暫時(shí)還不是“迷思”。
謎題是這樣的:在關(guān)卡的門前擺放著五個(gè)大小不一的箱子,必須將它們從小到大擺放整齊,門才會(huì)被打開。然而,這不是一個(gè)簡單的排序問題,因?yàn)閷W(xué)徒可做的動(dòng)作是被嚴(yán)格限定的,他要么可以執(zhí)行L動(dòng)作,即交換身邊的兩個(gè)箱子,然后,再和左面的箱子換位,要么執(zhí)行R動(dòng)作,將自己右側(cè)的箱子扔到箱子隊(duì)列的最右面,然后再和自己右側(cè)的箱子(可能已經(jīng)不是剛才在身邊的箱子了)換位。兩種動(dòng)作由圖形展示出來,能更容易清楚其中的要求:初始時(shí)的狀態(tài),如圖1所示;執(zhí)行動(dòng)作L后,如圖2所示;執(zhí)行動(dòng)作R后,如圖3所示;需要到達(dá)的最后目標(biāo)可能是如圖4所示的樣子。
最后的結(jié)果,只要箱子是從小到大排列就可以了,箱子按要求排列好后,至于學(xué)徒可能會(huì)在哪個(gè)位置,可以沒有關(guān)系。當(dāng)然,也可以特別規(guī)定學(xué)徒所在的位置,這會(huì)使得挑戰(zhàn)更具難度。大概是因?yàn)橹巧滩粔颍P者自己在玩這個(gè)游戲的時(shí)候,沒過多久就被攪得七葷八素,對(duì)這個(gè)明明就是自己想出來的題目嘆氣。顯然,這就是人工智能應(yīng)該登場的時(shí)候了。
解答
在早期的人工智能研究中,比較容易的突破點(diǎn),就是各種與邏輯推理有關(guān)的智力游戲。針對(duì)上述任務(wù),可以將各個(gè)箱子分別編碼為數(shù)字1、2、3、4、5,將人編碼為數(shù)字-1,然后存入列表。無論是L動(dòng)作還是R動(dòng)作,都可以很容易地用列表操作來完成。由于每次動(dòng)作非L即R,所以只要在執(zhí)行L或R動(dòng)作之后,記錄下箱子和人位置的狀態(tài),然后再以此狀態(tài)為基礎(chǔ),繼續(xù)執(zhí)行L或R狀態(tài),可以看出,每個(gè)狀態(tài)通往新的狀態(tài)時(shí),都面臨著一個(gè)有著兩條路徑的分叉。當(dāng)某個(gè)狀態(tài)的箱子的擺放符合要求時(shí),則可宣告解鎖完成。比起純粹隨機(jī)亂走,借助二叉樹來對(duì)左右兩個(gè)動(dòng)作逐項(xiàng)展開比對(duì),就不會(huì)遺漏最快的解答方法。
但要讓計(jì)算機(jī)完成任務(wù),需要涉及不同的技能,以Python解答這個(gè)搬箱解鎖的謎題的過程為例,在數(shù)據(jù)匹配環(huán)節(jié)中需要用到二叉樹,而為了使用二叉樹,就不得不涉及更多不同的知識(shí)技能,它們之間的關(guān)系大致如圖5所示。
這張圖大致展現(xiàn)出:如果要借助二叉樹來解決搬箱解鎖的謎題,那么還需要很多其他知識(shí)技能的支撐,將這些支撐關(guān)系用概念圖繪制出來,可能呈現(xiàn)出樹狀結(jié)構(gòu),甚至更復(fù)雜一些,呈現(xiàn)出網(wǎng)狀結(jié)構(gòu),任何一個(gè)節(jié)點(diǎn)的缺失,都會(huì)使得任務(wù)無法達(dá)成。下面,分別對(duì)搬箱解鎖謎題解答過程中的幾段重要的Python代碼進(jìn)行說明。
1.二叉樹的建立和使用
建立二叉樹的用途,是為了不遺漏所有的動(dòng)作路徑,如圖6所示。
建立二叉樹的代碼如下頁圖7所示。
代碼中使用到了“anytree”庫,利用這個(gè)已封裝好的樹結(jié)構(gòu)對(duì)象,可以輕松地建立起二叉樹(也可以從底層開始自行建立二叉樹對(duì)象),由于事先不可能知道二叉樹究竟可能有多深,所以無法預(yù)先給樹的每個(gè)節(jié)點(diǎn)命名,這里就用到了動(dòng)態(tài)命名的方法:
names['x%s' % int((i-1)/2)].name.copy()
這句語句不僅實(shí)現(xiàn)了動(dòng)態(tài)的樹節(jié)點(diǎn)命名,同時(shí)還通過取整函數(shù),將左右兩個(gè)子節(jié)點(diǎn)指定給上一層的某一個(gè)父節(jié)點(diǎn)。
2.執(zhí)行L動(dòng)作和R動(dòng)作
代碼中的doleft函數(shù),作用就是執(zhí)行L動(dòng)作,其中涉及的都是列表操作,另外doright函數(shù)執(zhí)行的是R動(dòng)作,同樣是列表操作,如下頁圖8所示。
3.執(zhí)行檢驗(yàn)動(dòng)作
檢驗(yàn)函數(shù)的代碼很簡單,就是將“人”從列表中去除,然后看剩下的箱子排列是不是“12345”即可,如下頁圖9所示。
程序運(yùn)行后很快就可以獲得解謎的答案,如下頁圖10所示。
同時(shí),程序還將二叉樹列出,限于篇幅,這里只列出樹的一部分,如下頁圖11所示。
程序代碼有四十多行,并且還完全沒有考慮解題時(shí)效率上可做的優(yōu)化,與許多迷題解答類的程序相比,已經(jīng)算是足夠簡單了。本文中要討論的問題,不限于程序代碼及謎題解答本身。
迷思
假設(shè)學(xué)徒A和B受困于關(guān)卡之前,他們發(fā)現(xiàn)自己的解謎能力有限,這時(shí),解謎大師X和Y出現(xiàn)了。
學(xué)徒A遇見了大師X,大師X告訴A,有許多解謎大師曾經(jīng)針對(duì)不同的謎語,制造過不同的解謎法寶,自己身邊恰巧就帶著一個(gè)這樣的法寶,他稱之為搬箱解鎖函數(shù),只要學(xué)習(xí)了函數(shù)的使用方法,便能成功解鎖,雖然稍微有些麻煩,但學(xué)徒A還是很快掌握了法寶的使用方法,他解鎖成功后,通過了關(guān)卡。
學(xué)徒B遇見了大師Y,大師Y的口袋里當(dāng)然有著各種法寶,包括那個(gè)叫做搬箱解鎖函數(shù)的法寶,但它卻要求學(xué)徒自己動(dòng)手,親手把那個(gè)法寶給鍛造出來。當(dāng)然,這很花費(fèi)時(shí)間,因?yàn)殄懺旆▽毜墓ぞ卟⒉积R備,學(xué)徒需要探索通向當(dāng)前大道的多條小路,去尋找到所有制造法寶的工具。問題是,工具的擁有者可能宣稱,某個(gè)工具的制作過程本身也是一個(gè)謎題——可憐的學(xué)徒于是又要去試著解開新的謎語。
學(xué)徒A和學(xué)徒B,哪一個(gè)是幸運(yùn)的?正如前文所說,迷思本身沒有標(biāo)準(zhǔn)答案,或許即將出場的學(xué)生C才是最幸運(yùn)的,因?yàn)樗群笥鲆娏舜髱焁和大師Y,也許他還遇見了大師Z,這位大師甚至沒有急著讓學(xué)徒自己打造神奇法寶,卻先是篤定地聊起那些謎題創(chuàng)造大師們的奇怪想法的來龍去脈,他又花了不少時(shí)間,講述那些工具鍛造師傅的手藝是怎樣練成的。
但若是存在以下兩個(gè)條件,學(xué)徒C的幸運(yùn)就變成了困惑:第一,假設(shè)解開謎題通過關(guān)卡這件事本身,并不是學(xué)徒的最終任務(wù),這一次通關(guān)僅僅是一種訓(xùn)練,他的真正目標(biāo),是將來能夠自主通過各種有著奇怪謎題的關(guān)卡;第二,他和導(dǎo)師相處的時(shí)間是受到限制的。那么,這三位導(dǎo)師應(yīng)該怎樣安排好和學(xué)徒C的每一次見面呢?
筆者創(chuàng)作這個(gè)迷思,其實(shí)就是為了映射當(dāng)前基礎(chǔ)教育階段中人工智能教學(xué)的困難:面對(duì)某個(gè)具體的人工智能問題,如果是直接給予學(xué)習(xí)者一個(gè)封裝好的函數(shù),那么學(xué)習(xí)者是無法體會(huì)到人工智能的具體實(shí)現(xiàn)過程的;但若是要講述清楚達(dá)成某個(gè)人工智能任務(wù)的各種細(xì)節(jié),卻又受到學(xué)習(xí)者當(dāng)前知識(shí)技能水平和教學(xué)時(shí)間的限制。
既然給出了迷思,筆者自己也努力嘗試著給出一種回答:大師X展現(xiàn)出了神奇法寶,他謎一般地通過關(guān)卡后消失了,比起關(guān)卡自身的謎題,大師X神奇法寶的由來和制造方法,則已經(jīng)成了更加需要解答的謎題。大師X的行為無疑引來大師Z的一番引經(jīng)據(jù)典的評(píng)述,對(duì)于大師Z云里霧里一樣的高深言論,學(xué)徒并不能一下子聽明白,這時(shí)候大師Y出場了,他找來了用以制造法寶的零件和工具,然后,他帶領(lǐng)著學(xué)徒,一起經(jīng)歷了用這些零件和工具鍛造出神奇法寶過程中重要的一步或者幾步,有了實(shí)際的經(jīng)驗(yàn),大師Z的言語或許就不那么難懂了。
雖然大師們的時(shí)間很有限,但他們不會(huì)忘記還存在著許多缺失的工具和零件,他們畫出了一幅用以進(jìn)一步探索的解謎地圖。最后,他們還會(huì)囑咐道:其實(shí),還有許多道路沒有被開拓出來,畢竟,路是人走出來的。