數學之美 從全球導航到輸入法——談談動態規劃

今年九月二十三日,Google、T-Mobile 和 HTC 宣佈了第一款基於開源操作系統 Android 的 3G 手機,其中一個重要的功能是利用全球衛星定位系統實現全球導航。這個功能在其它手機中早已使用,並且早在五六年前就已經有實現這一功能的車載設備出售。其中的關鍵技術只有兩個:第一是利用衛星定位;第二根據用戶輸入的起終點,在地圖上規劃最短路線或者最快路線。後者的關鍵算法是計算機科學圖論中的動態規劃(Dynamic Programming)的算法。

 

 

在圖論(請見拙著《圖論和網絡爬蟲》)中,一個抽象的圖包括一些節點和連接他們的弧。比如說中國公路網就是一個很好的“圖”的例子:每個城市一是個節點,每一條公路是一個弧。圖的弧可以有權重,權重對應於地圖上的距離或者是行車時間、過路費金額等等。圖論中很常見的一個問題是要找一個圖中給定兩個點之間的最短路徑(shortest path)。比如,我們想找到從北京到廣州的最短行車路線或者最快行車路線。當然,最直接的笨辦法是把所有可能的路線看一遍,然後找到最優的。這種辦法只有在節點數是個位數的圖中還行得通,當圖的節點數(城市數目)有幾十個的時候,計算的複雜度就已經讓人甚至計算機難以接受了,因爲所有可能路徑的個數隨着節點數的增長而成呈指數增長(或者說幾何級數),也就是說每增加一個城市,複雜度要大一倍。顯然我們的導航系統中不會用這種笨辦法。

所有的導航系統採用的都是動態規劃的辦法(Dynamic Programming),這裏面的規劃(programming)一詞在數學上的含義是“優化”的意思,不是計算機裏面編程的意思。它的原理其實很簡單。以上面的問題爲例,當我們要找從北京到廣州的最短路線時,我們先不妨倒過來想這個問題:假如我們找到了所要的最短路線(稱爲路線一),如果它經過鄭州,那麼從北京到鄭州的這條子路線(比如是北京-> 保定->石家莊->鄭州,稱爲子路線一),必然也是所有從北京到鄭州的路線中最短的。否則的話,我們可以假定還存在從北京到鄭州更短的路線(比如北京->濟南->徐州->鄭州,稱爲子路線二),那麼只要用這第二條子路線代替第一條,我們就可以找到一條從北京到廣州的全程更短的路線(稱爲路線二),這就和我們講的路線一是北京到廣州最短的路線相矛盾。其矛盾的根源在於,我們假設的子路線二或者不存在,或者比子路線一還來得長。

在實際實現算法時,我們又正過來解決這個問題,也就是說,要想找到從北京到廣州的最短路線,先要找到從北京到鄭州的最短路線。當然,聰明的讀者可能已經發現其中的一個“漏洞”,就是我們在還沒有找到全程最短路線前,不能肯定它一定經過鄭州。不過沒有關係,只要我們在圖上橫切一刀,這一刀要保證將任何從北京到廣州的路一截二,如下圖。


那麼從廣州到北京的最短路徑必須經過這一條線上的某個城市(圖中藍色的菱形)。我們可以先找到從北京出發到這條線上所有城市的最短路徑,最後得到的全程最短路線一定包括這些局部最短路線中的一條,這樣,我們就可以將一個“尋找全程最短路線”的問題,分解成一個個小的尋找局部最短路線的問題。只要我們將這條橫切線從北京向廣州推移,直到廣州爲止,我們的全程最短路線就找到了。這便是動態規劃的原理。採用動態規劃可以大大降低最短路徑的計算複雜度。在我們上面的例子中,每加入一條橫截線,線上平均有十個城市,從廣州到北京最多經過十五個城市,那麼採用動態規劃的計算量是 10×10×15,而採用窮舉路徑的笨辦法是 10 的 15 次方,前後差了萬億倍。

那麼動態規劃和我們的拼音輸入法又有什麼關係呢?其實我們可以將漢語輸入看成一個通信問題,而輸入法則是一個將拼音串到漢字串的轉換器。每一個拼音可以對應多個漢字,一個拼音串就可以對應圖論中的一張圖,如下:

其中,Y1,Y2,Y3,……,YN 是使用者輸入的拼音串,W11,W12,W13 是第一個音 Y1 的候選漢字,W21,W22,W23,W24 是對應於 Y2 的候選漢字,以此類推。從第一個字到最後一個字可以組成很多很多句子,我們的拼音輸入法就是要根據上下文找到一個最優的句子。如果我們再將上下文的相關性量化,作爲從前一個漢字到後一個漢字的距離,那麼,尋找給定拼音條件下最合理句子的問題就變成了一個典型的“最短路徑”問題,我們的算法就是動態規劃。

上面這兩個例子導航系統和拼音輸入法看似沒什麼關係,但是其背後的數學模型卻是完全一樣的。數學的妙處在於它的每一個工具都具有相當的普遍性,在不同的應用中都可以發揮很大的作用。

發佈了41 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章