版權申明:本文為博主窗戶(Colin Cai)原創,歡迎轉帖。如要轉貼,必須注明原文網址 http://www.cnblogs.com/Colin-Cai/p/7220028.html 作者:窗戶 QQ:6679072 E-mail:6679072@qq.com
有人說程序=算法+數據結構,雖說這樣的認為有失偏頗,一個程序決定的東西實在太多,但某些方面也說明了算法是很重要的(數據結構承上啟下,最終也是要為算法服務)。
算法是用來解決問題的,要理解什么是算法,先要明白什么是問題。而無論是狹義還是廣義,算法都是用來處理問題,所以兩者放在一起來理解會比較方便。
一、可形式化的問題
我們在《算法導論》、《數據結構》里面遇到的問題基本上都是可形式化的問題,也就是可以用數學語言准確描述的問題。此類問題定義明確,是數學意義上狹義的問題。問題的解決必須在有限的步驟內解決,則為算法,這里是數學上狹義的算法,或者稱為“真正的算法”。但是不是每個可以形式化的問題都是可以用算法解決的,這個早在上個世紀前五十年就已經知道了,著名的圖靈機停機問題就是可形式化但不存在算法可以解決的問題。我們的算法實際上本質和形式系統內定理的演繹一樣,那么如同無法用算法判斷所有的圖靈機是否停機一樣,我們的自然數體系中也存在着不可判定的命題,本質一致,不過這是題外話。
很多人應該做過類似這樣的問題:假設函數f()隨機返回0~24這25個整數中的一個,且返回每個整數的概率都是1/25;那么根據f函數構造另外一個函數g,返回0~5這6個整數中的一個,且返回每個證書的概率都是1/5。
這個問題是可以形式化的,題目也不是很難做,以下給出一個偽碼:
function g
while true
let x = f()
if x != 24
break
end if
end while
return floor(x/4)
end function
以上偽碼應該不是很難懂,g函數也的確這樣被構造出來了。可是這不是算法,因為g函數可能永遠都無法結束,永遠都會因為f()返回24而死循環。此問題本質上和尺規作圖三大經典問題(化圓為方,立方倍積,三等分角)、一元五次方程求根公式一致。
諸如圍棋這樣的博弈問題也是可以形式化的。終局有一個結果,可以用一個數值來代表,博弈的雙方輪流選擇,一方的目標是終局的結果值最小,另一方的目標是中間的結果值最大。此類雙方輪流執行的離散博弈問題有個通用的算法,這是一個真正的數學意義上狹義的算法,叫做最大最小算法。做法如下:
(1)先畫出博弈樹,也就是遍歷所有直到博弈結束的可能。
(2)從博弈樹的每個樹葉開始,逐次向樹根,不斷計算出可以得到最佳結果的選擇。
遞歸的選擇方法如下圖:
從而,每一步都可以計算出得到最佳結果的選擇。
最大最小算法雖然在此處通用,但未必好,因為博弈樹過於龐大。以下問題可能很有名:
給定n堆棋子,兩個人輪流拿棋子,每個人每一次只能從其中一堆中拿,至少拿一顆,至多把一堆拿走。當輪到的人沒有棋子可拿,那么這人輸,對方贏。
如果棋子足夠多,那么這個問題的博弈樹非常大,用最大最小算法顯然是不靠譜的。可是好在我們知道,這個問題只要每次使得所有棋子個數異或結果為0,則可以立於不敗之地,也就是這個算法可比博弈樹最大最小算法要快速、靠譜的多。
再回到圍棋,圍棋的博弈樹過於龐大,所以更不可能用最大最小算法來實用。所以我們只好引入人工智能來“解決”這個問題,但我們要知道這里的人工智能並不是真正數學意義上狹義的算法。
很多時候,即使問題是可形式化的,但因為問題的解決可能十分復雜,例如NPC、NPH,我們顯然不是很方便通過狹義的算法來解決,剛才圍棋就是一個典型的例子,於是就要引入啟發性算法,這也屬於AI范疇,但未必是機器學習。比如求最短Hamiton環的tsp,這是一個NPH,當然如果問給定長度問此完全圖有無不超過給定長度的Hamiton環,這是一個NPC,我們可以用很多啟發式算法來找最短Hamiton環,比如蟻群算法、粒子群算法、遺傳算法都可以。經我實際實際驗證,蟻群效果最好,粒子群提前收斂是在太討厭,遺傳算法表現也一般。
P=NP和P!=NP的情況下,P、NP、NPC、NPH的關系不太一樣,這是題外話。
二、不可形式化的問題
可形式化的問題是完全理性的,雖然解決的時候啟發式算法里可能引入了少許”感性"的成分。而不可形式化的問題已經不在數學的范疇之內了,也就是說,連問題本身都是充滿着“感性”成分的。
很典型的就是我們的圖像、聲音這樣的問題,這就是帶有着很強的感性成分,完全不知道該如何形式化的問題。
圖像處理的解決一般分為兩類方法:一類是基於數字信號處理基礎的手段,非常推薦Gonzalez的《數字圖像處理》,這是圖像處理的經典教材;另外一類是人工智能手段,一般用於識別,目前比較好的手段是卷積神經網絡,前面的卷積層提取特征也可稱為降維手段。當然,這兩類手段並非孤立的,人工智能手段往往都是在傳統的信號處理基礎上來的,對於特殊的圖形的神經網絡識別也一樣可以使用傳統圖像處理手段作為特征輸入。
而聲音的處理則一般是直接在頻域上進行處理,只是一般基於傳統頻譜的改造,更適合於聲音處理的倒譜(cepstrum),這是把采樣值進行傅里葉變換后的結果取對數再進行傅里葉變換得到的譜。把聲音的頻譜搬移並恢復並不是太難,所以男聲變女聲也不是很困難的事情,所以接電話遇到陌生人通知你什么什么的時候千萬要小心,這個真還未必是他原本的聲音。我堂弟的公司的會計就曾經接到過董事長叫她趕快匯巨款(真的很巨)的電話,電話號碼、聲音全都對,她在准備匯款前一分鍾突然想打個電話再確認確認,這才知道是詐騙電話,江湖險惡啊。當然,人工智能就更會有啊,深度學習識別語音現在很流行很流行。識別一定范圍內的自然語言已經很OK了,這個技術我想未來也會伴隨着智能家居一起爆發吧,話說我真的是一直看好智能家居啊,只是不知道什么時候會爆發。
不可形式化的問題里可能伴隨着大量的開放性問題,規則不准確,而且在不斷變化中,甚至沒有規則可言?!這些是未來人工智能努力的方向,我還是希望人類可以把握住尺度。
當然,不是只有圖像、聲音,天下的事物很多,比如計算機如何輔導學生以期待獲得更好的學習成果,這些問題往往都適合於人工智能的手段。智能家居如何讓人更加舒適,這當然也應該是AI的天下,只是,智能家居目前要解決的問題很多,比如,進展極其緩慢的物聯網便是一個重要因素。