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