AI基礎(chǔ):美女和野人過河問題
AI是一個提升高級度的概念,真正的AI遠遠不是說說而已。筆者以AI算法的經(jīng)典問題為例,闡釋了問題的解決邏輯和辦法,展示了算法的形成過程。
AI(Artificial Intelligence)人工智能,可以說是最近比較火熱一個詞。就像曾經(jīng)的互聯(lián)網(wǎng)概念一樣,任何一個項目只要和AI搭上邊,就似乎顯得非常高大上。
AI是一個領(lǐng)域,是一門學(xué)科,里面涉及的知識非常多,僅我們大家能想到的AI應(yīng)用,就能隨口說出數(shù)幾種,像NLP(NaturalLanguage Processing)自然語言處理,TTS(TextTo Speech)文本到語音,涉及的人機對話,語音合成;以及我們現(xiàn)在所用到的人臉識別,正在推廣的刷臉支付,家里用的智能掃地機器人;情景感知智能家具、智能金融。
無處不在的AI技術(shù),同我們的生活息息相關(guān),也在不斷影響著我們的生活。
AI概念本身不錯,如區(qū)塊鏈一樣,本身是一個很好的理念,但由于部分人過度投機,使得這個領(lǐng)域也存在著參差不齊,魚龍混雜的情況。
現(xiàn)實中存在這種情況:是個人,會寫個邏輯語句,就敢叫什么人工智能工程師,什么算法工程師;是個項目加一點點邏輯判斷,也敢叫人工智能項目。
現(xiàn)狀比較浮躁,缺乏對科學(xué)基本的敬畏。
我們目前所見到的所謂的人工智能的項目,大多是把市面上已經(jīng)有的人工智能服務(wù),自己整合一下,包裝一下,用用而已。但如果真要形成核心產(chǎn)品,要有相當(dāng)長的路要走,要投入巨大的人力物力財力。
試想,你做的所有的服務(wù),都是其他廠家所提供的,自己沒有核心的技術(shù),很容易受到其他廠商的控制,除非你將來做的產(chǎn)品可以被這些大廠收購。
但話說回來,做的產(chǎn)品沒有核心競爭力,只是整合別人的功能,是沒有什么技術(shù)壁壘的,就更不要說形成自己的護城河了,很容易被模仿、超越。
所以,個人認為,人工智能,最為基礎(chǔ)的還是算法,要最最基礎(chǔ)的研究,涉及大量的計算機、心理學(xué)、運籌學(xué)等各學(xué)科領(lǐng)域的知識。
以文字轉(zhuǎn)語音為例,單純的一個字轉(zhuǎn)成語音,不是很難,但一長段話轉(zhuǎn)成很流暢的語音,并可以跟據(jù)不同人的音色來采樣和播放,這一個看似很小的功能,背后有著大量的研發(fā)人員。
人工智能的核心,就是算法,不同的算法結(jié)合起來,像一個個DNA一樣,組成了人工智能的應(yīng)用。所以,今天我們就從一個最簡單的例子入手,從而開啟人工智能最最基礎(chǔ)的算法入門之旅。
一、問題場景
這個問題的確比較基礎(chǔ),網(wǎng)上搜索一下,會一有大堆這樣的文章。我自己也在網(wǎng)上看了一些,但發(fā)現(xiàn)網(wǎng)上探索出來的內(nèi)容還是不是很好,有些代碼還存在一些問題。不是很嚴謹。
這個世界上,指責(zé)別人最容易,認清自己最難。與其去吐槽別人,不如自己寫一個更好一點文章,分享給大家。
現(xiàn)在我們進入主題。
有3個美女和3個野人要過河,只有1條船,沒有船夫,這6個人都會劃船。但這條船1次只能載兩個人,任何情況下,只要野人的數(shù)量大于美女的數(shù)量,美女就會被野人吃掉。也就是說,在河的兩岸,即河的左岸上和右岸上,野人的數(shù)量任何時候都不能大于美女的數(shù)量。
如何6個人能全部過河,并且美女安全(即不被野人吃掉)?
如果我們從邏輯上理解,其實就是各種方案的探索,最終試出一條可行的方案。
現(xiàn)狀,我們可以認為他們都在河的左岸,要到河的右岸:
美女1 美女2 美女3 ||河||
野人1 野人2 野人3 ||河||
第一步,兩個野人先一起到河的右岸,然后一個野人回來:
美女1 美女2 美女3 ||河||
野人2 野人3||河|| 野人1
第二步,兩個野人一起到河的右岸,然后一個野人回來:
美女1 美女2 美女3 ||河||
野人3 ||河|| 野人1 野人2
第三步,兩個美女去,然后一個美女和一個野人回:
美女2 美女3||河|| 美女1
野人2 野人3 ||河|| 野人1
第四步,兩個美女去,一個野人回:
||河|| 美女1 美女2 美女3
野人1 野人2 野人3 ||河||
第五步,兩個野人去,一個野人回:
||河|| 美女1美女2 美女3
野人2 野人3||河|| 野人1
第六步,兩個野人回:
||河|| 美女1 美女2 美女3
||河|| 野人1 野人2 野人3
以上問題,可以理解為決策問題,其實也是人工智能學(xué)科中的一個非?;A(chǔ)的經(jīng)典問題。
我們分析的思路以及答案,雖然似乎是解決了問題。
但問題來了,除了我們上述使用的方法,這個題目還有沒有其他方法?哪種最快?以上問題只涉及6個人,我們通過人工分析的方法,還可以將結(jié)果羅列出來。
那如果是60個人,600個人?難道我們還是靠這種方法來分析?這樣單憑人力手工計算是非常復(fù)雜耗時的。那如何實現(xiàn)呢?這就需要我們編制一套搜索算法,通過計算機來幫助我們計算。
二、問題分析
我們從初態(tài)和終態(tài)來分析,可以知道初態(tài)是河的左岸有3個美女和3個野人,而終態(tài)是河的右岸有3個美女和3個野人。就是初始狀態(tài)是【3,3】,表示左岸最開始,有3個美女和3個野人。而終態(tài)是【0,0】,表示左岸最終美女和野人的數(shù)量均為0。
而美女和野人,從左岸到右岸,右岸回左岸,是要靠船來運送的。所以,船的狀態(tài)有兩種(航行中就不考慮了),要么在左岸,要么在右岸。我們用1表示船在左岸,用0表示船在右岸。
那么結(jié)合美女和野人的狀態(tài),最初始狀態(tài)就是【3,3,1】,表示最初船停靠在左岸,左岸有3個美女,3個野人。那么終態(tài)我們知道,是船在右岸,左岸美女和野人數(shù)量都為0,那么怎么用數(shù)學(xué)來表示呢?就是【0,0,0】。
現(xiàn)在問大家一個問題,如果從狀態(tài)的視角來分析,會有幾種狀態(tài)?
很顯顯然,會有32種狀態(tài),怎么來的?
這就用到了數(shù)學(xué)基礎(chǔ)中的排列組合。美女的狀態(tài)有4種【0,1,2,3】,表示左岸沒有美女,有1個美女,有2個美女,有3個美女;同樣,野人的狀態(tài)也有4種【0,1,2,3】,船的狀態(tài)有2種【0,1】。
排列組合一下,我們整理初以下狀態(tài);同時,我們標記出不符合條件的狀態(tài):
- 野人人數(shù)大于美女人數(shù)的狀態(tài),用綠色標出,不符合條件,因為按照題目要求,河的左岸和右岸上,野人人數(shù)大于美女人數(shù),美女會被吃掉,任務(wù)失??;這里不僅要考慮左岸的情況,也要考慮右岸的,例如:【2,0,1】,這就很明顯,船在左岸的時候,右岸有1個(3減2)美女和3個(3減0)野人,也是不滿足題目要求的。
- 不可能存在的狀態(tài),用黃色標出;例如:船不可能停在沒有人的岸邊【0,0,1】,以及美女不可能在野人占多數(shù)的情況下,劃船到對岸【3,0,1】。
整理后的狀態(tài)表,如下表所示。
表2-1 左岸美女與野人的狀態(tài)表
我們根據(jù)以上的狀態(tài),畫出狀態(tài)空間圖,如下圖所示:
圖2-2 美女與野人過河的狀態(tài)空間圖
很顯然,所有從初態(tài)可以到達終態(tài)的路徑,都是美女可以安全過河的方案。
三、算法實現(xiàn)
我們分析的思路有了,接下來就是如何通過算法,實現(xiàn)我們的思想。
其實這就用到了數(shù)據(jù)結(jié)構(gòu)中,經(jīng)典的圖的搜索——圖的遍歷,一般有深度優(yōu)先和廣度優(yōu)先遍歷算法。如果從最小生成樹的角度,可以使用普里姆算法和克魯斯卡算法。
如果題目要求最優(yōu)解,我們還會用到最短路徑計算的概念。這里如果擴展的話,又可以寫很多。因為同一個問題,解決問題的方法也肯定不止一種。
接下來,我們算法實現(xiàn)的基本思路就是:
找出船上的載人狀態(tài),比如:船上可以有1個美女,1個野人,也可以有2個美女,也可以有2個野人;也就是船上的承載人數(shù),受到船的承載量限制,本文題目要求是船上最多為2個。
我們根據(jù)船上的運送人員的數(shù)量,根據(jù)船的運送滿足題目要求的結(jié)果,來去尋找滿足條件的運送方案,之后我們存在動態(tài)數(shù)組中。
同時,為了防止重復(fù)計算,我們還要判斷生成的方法是不是已經(jīng)存在歷史結(jié)果中。
當(dāng)然,歷史結(jié)果的存儲我們用的也是動態(tài)數(shù)組;如果歷史中已經(jīng)有了這條信息,我們就不再計算,再去尋找新的方法。直到找出所有的結(jié)果。
實現(xiàn)的算法如下圖3-1所示,已經(jīng)經(jīng)過實驗檢驗,并可以保證正確運行。
圖3-1 算法實現(xiàn)
代碼執(zhí)行結(jié)果,我們可以看到,安全過河的方法有好幾種。如下圖3-2所示:
圖3-2 算法執(zhí)行結(jié)果
四、結(jié)論
本文中,我們從美女與野人過河這個經(jīng)典的問題出發(fā),展開分析,闡述了解決此類問題的基本邏輯與解決方法,并對美女與野人的算法進行了擴展。
美女人數(shù)和野人數(shù)量,以及船的承載人數(shù)進行參數(shù)修改后,此算法仍然可以根據(jù)要求進行計算,算法的靈活性較強。如下圖4-1所示:
圖4-1 人數(shù)與船承載量參數(shù)修改后執(zhí)行的結(jié)果
本文也有不足之處,就是程序的算法仍然有優(yōu)化的空間。
根據(jù)測算,當(dāng)船最大承載量為2,美女和野人數(shù)量各為8人的情況下,找到第一種方案程序需要執(zhí)行約40萬次,如下圖4-2所示。算法的時間復(fù)雜度和空間復(fù)雜度較高,仍然有進一步的優(yōu)化空間。
圖4-2 美女和野人數(shù)量各為8人的情況
從這個實驗中,我們也可以發(fā)現(xiàn),僅這么一個簡單問題,用到的理論知識已經(jīng)相當(dāng)多了,數(shù)據(jù)結(jié)構(gòu)與算法、數(shù)值計算。而且還并不是十分完美,離理想中的優(yōu)美的算法,還有較大的差距。
僅從這一個小問題出發(fā),要做到算法的極限,仍然需要付出很多努力。而這僅僅只是人工智能中,非常非常非?;A(chǔ)的,非常非常非常微小的一個知識點而已,真要做到極致,博士也不是那么容易。
所以,有時候就不明白,有時僅僅本科畢業(yè)一兩年的人也敢叫什么算法工程師,真不知道哪里來的自信。
真正的科學(xué)研究是枯燥的,是要沉下心來踏踏實實做研究的,也是要耐得住寂寞的。不走心的走秀最多只能是曇花一現(xiàn),唯有踏實與真誠才可以基業(yè)長青。
最后,希望本文能給大家?guī)韼椭?/p>
共勉!
作者:王佳亮,中國計算機學(xué)會(CCF)會員。微信公眾號:佳佳原創(chuàng)
本文由 @佳佳原創(chuàng) 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自Unspalsh, 基于CC0協(xié)議
想問一下,為何不可以每一趟,一個美女和一個野人同時過去
?? 過去了船咋回來