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
以上問題,可以理解為決策問題,其實也是人工智慧學科中的一個非常基礎的經典問題。
我們分析的思路以及答案,雖然似乎是解決了問題。
但問題來了,除了我們上述使用的方法,這個題目還有沒有其他方法?哪種最快?以上問題只涉及6個人,我們透過人工分析的方法,還可以將結果羅列出來。
那如果是60個人,600個人?難道我們還是靠這種方法來分析?這樣單憑人力手工計算是非常複雜耗時的。那如何實現呢?這就需要我們編制一套搜尋演算法,透過計算機來幫助我們計算。
二、問題分析
我們從初態和終態來分析,可以知道初態是河的左岸有3個美女和3個野人,而終態是河的右岸有3個美女和3個野人。就是初始狀態是【3,3】,表示左岸最開始,有3個美女和3個野人。而終態是【0,0】,表示左岸最終美女和野人的數量均為0。
而美女和野人,從左岸到右岸,右岸回左岸,是要靠船來運送的。所以,船的狀態有兩種(航行中就不考慮了),要麼在左岸,要麼在右岸。我們用1表示船在左岸,用0表示船在右岸。
那麼結合美女和野人的狀態,最初始狀態就是【3,3,1】,表示最初船停靠在左岸,左岸有3個美女,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人的情況
從這個實驗中,我們也可以發現,僅這麼一個簡單問題,用到的理論知識已經相當多了,資料結構與演算法、數值計算。而且還並不是十分完美,離理想中的優美的演算法,還有較大的差距。
僅從這一個小問題出發,要做到演算法的極限,仍然需要付出很多努力。而這僅僅只是人工智慧中,非常非常非常基礎的,非常非常非常微小的一個知識點而已,真要做到極致,博士也不是那麼容易。
所以,有時候就不明白,有時僅僅本科畢業一兩年的人也敢叫什麼演算法工程師,真不知道哪裡來的自信。
真正的科學研究是枯燥的,是要沉下心來踏踏實實做研究的,也是要耐得住寂寞的。不走心的走秀最多隻能是曇花一現,唯有踏實與真誠才可以基業長青。
最後,希望本文能給大家帶來幫助。
共勉!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2660161/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ACM 過河問題ACM
- 演算法分析——青蛙過河問題演算法
- POJ1700 Crossing River 過河問題ROS
- 荒島野人 題解
- AI數學基礎之:P、NP、NPC問題AI
- [原始碼和文件分享]基於JAVA實現的農夫過河問題原始碼Java
- 過河 手電筒 面試題面試題
- oracle基礎知識和常見問題Oracle
- 基礎學習問題
- SQL基礎教程問題SQL
- 01.Java基礎問題Java
- ios 基礎問題記錄iOS
- 買基金的基礎問題
- C#面試基礎問題C#面試
- vb基礎(列印問題) (轉)
- Python基礎面試題30問!Python基礎教程Python面試題
- 問一個基礎的用例問題?
- [基礎問題] 陣列賦值陣列賦值
- AI 基礎知識AI
- 95 後美女激戰 AI,結果亮了……AI
- Docker與銀河麒麟的相容性問題Docker
- 面試問題記錄 一 (基礎部分)面試
- 【c++基礎】菱形繼承問題C++繼承
- 基礎問題:進位制轉換
- 前面基礎問題小總結(二)
- Mybatis基礎:常見問題與FAQMyBatis
- 15個基礎的jQuery面試問題jQuery面試
- .NET基礎之主題和皮膚
- AI數學基礎之:概率和上帝視角AI
- 小馬過河-RPC之旅RPC
- 基礎揹包問題的一些題目!!
- 基礎題
- 01.Android之基礎元件問題Android元件
- 面試中的那些 Git 問題 - 基礎部分面試Git
- oracle遊標的一些基礎問題Oracle
- Python基礎技術問題總結Python
- C# 基礎技術問題總結C#
- C++基礎——有關引用的問題C++