背景圖:搜尋第四度空間╱達利
|
How simple is TSP?
Very simple.
|
推銷員問題就是,給定一個有 n個城市的集合,一個可憐的推銷員想要確實地拜訪每個城市然後再回到開始的地方。推銷員問題可以追溯到十七世紀漢米爾頓循環(Hamiltonain Cycle) 的問題。在電腦的發展歷程中,就因為推銷員問題的簡單性和 NP-problem 的代表性,推銷員問題總是做為新機器的鍊金石(就像有的喜歡以計算圓周率到數百萬位小數一樣)。
如果需要更多有關 TSP最近的發展歷程與說明,可以看看我們以前的成果。
How difficult is TSP?
Very difficult.
|
諷刺的是,越不起眼的東西通常是越致命的。什麼是地球上最致命的玩意呢?病毒。圍棋-規則最少但卻最難學得精。推銷員問題有最簡單的規則-簡單得連一個小漢都懂-可是它卻需要天文數字般的計算能力才能獲得最佳的結果,也許比「天文數字」還糟。以一個有42個城市的推銷員問題為例,如果我們很不幸地需要列舉所有的路徑才能確定何者最短,那麼總共會有 (42-1)!/2 = 1.67 * 1049 的拜訪方式。如果你不瞭解這個數字有多大,給你一個概念:全宇宙總共才有 1048 個粒子。
有了電腦的幫助,我們可以奇蹟似地解決遠比上面來得大的推銷員問題(世界記錄:米飯大學(Rice)的包柏‧比克司拜爾特( Bob Bixbyet)等人用了50台接在一起的工作站解決了3038個城市的推銷員問題)。根據欣欣那提大學的馬克‧諾司章(Mark H. Noschang)的報告,解決推銷員問題的方法可以略分為以下兩類:
Heuristic
|
Approximation
|
去年,我們在乏晰集理論與應用的課程裡,已經試過用基因演算法( Genetic Algorithm)和模擬退火(Simulated Annealing )來對付惱人的推銷員問題。今年學了類神經網路,我們便想換個花樣用類神經網路來解解看繼續推銷員問題。在這個計畫裡,我們試了兩招-彈性網絡( Elastic Net)與螞蟻王國(Ant System)。除此之外,為了能瞭解人腦在解決推銷員問題時到底靈不靈光,我們還做了一個人腦對電腦的實驗。
Can Neural Net solve TSP?
|
乍看之下,用類神經網路來解最佳組合的問題似乎不是個好主意。畢竟類神經網路比較適合解決辨識、分類,或是監督式╱非監督式學習之類的問題。第一個利用類神經網路解決推銷員問題(雖然不算太成功)的是郝伯非爾德(Hopfield)和坦克(Tank)這兩位[1]。他們宣稱已經成功地解決10個城市的推銷員問題。根據他們的論文指出(順帶一提,他們的論文實在是舊到只能從別人的論文裡道聽塗說拼湊出來),在20次不同的試驗裡,他們的類神經網路可以收斂得到16個合適的解答。並且在這些合適的解答裡,有一半是最佳解。然而,對一個30個城市的推銷員問題,他們的方法就不怎麼行了。怎麼說不怎麼行了呢?右邊是郝伯非爾德找出來的幾個10個程式的推銷員問題的所謂「合適解」,你可以想像拿來解30個城市的推銷員問題其下場有多麼不堪。 |
過了三年,另外兩個研究員威爾森(Wilson)和堡壘(Pawley)[2] 提出報告,說郝伯非爾德和坦克的方法簡直就是海市蜃樓,看得到摸不到。在他們 100次的試驗裡,只有15次是較為合適的解。而且這些所謂的合適解,其實不比亂走一通好到那裡去,其他人的報告也有相同的結果(不過並沒有論文提到郝伯非爾德和坦克聽到威爾森和堡壘的報告後有什麼反應)。但是這篇令人失望的實驗報告並沒有擊垮研究類神經網路的人,反而讓研究利用類神經網路解決最佳組合問題變成一種風尚。許多論文就是探討如何改進郝伯非爾德和坦克的類神經網路或是分析其數學特性。
基本上,三種最廣為人知用以解決推銷員問題的的類神經網路為:
郝伯非爾德和坦克的類神經網路模型是由 n個完全連接的神經元所組成( n是城市的數目)。通常我們用 n×n 的矩陣來表示。能量函數則定義成。如果城市 i 是第 j 個被拜訪的城市,Vxy 就會為 1。前兩項是為了確保網路(矩陣)中每一行每一列最多只有一個神經元被啟動。第三項是為了確保整個網路中全部只有 n個神經被啟動。第四項則讓網路會偏好較短路徑。比重的定義如下:
|
|
|
在1984年,科厚南( Kohonen)第一個提出自我組織圖( Self-Organizing Map簡稱SOM)[3]。 自我組織圖本來是設計來解資料分類叢集( data clustering)的問題,有些人卻嘗試把應用它解最佳化問題。很巧的,你也可以在張智星老師的同一本書裡(第 305頁至 308頁)找到相關的介紹。在這裡我們只簡短地介紹柏納‧安結尼爾(Bernard Angeniol)等人關於自我組織圖的的研究[4]。 現在有 m個城市和圍成圈圈的 m個點。Bernard的方法如下: 對每一個城市 Xi :
|
可以看得出來這個方法有多簡單。 G是增益參數,而 n是沿著圈圈測量,點 Cj 和 C的距離。不像郝伯非爾德和坦克的模型需要調整 5個參數,(想一下,到底是解決10個城市的推銷員問題難還是調整 5個參數以求最佳解難?), a是唯一需要調整的參數。在論文裡,對 a和 G有較詳細的討論。
你可能會對自我組織圖的程式長相感到好奇。如果這樣的話,你可能要失望了,因為我們這次並沒有設計自我組織圖的程式,主要原因是自我組織圖實在太像彈性網絡了。但是你可以連往其它的網站看看其他人如何將自我組織圖應用在解決組合問題上。
The best NN to solve TSP?
|
彈性網絡是在1987年由德賓(Durbin)和威爾蕭(Willshaw)在「自然」月刊所提出[5]。這篇只有2頁的文章(郝伯非爾德和坦克論文足足有11頁),給人的第一印象是直覺,簡單,而有力。
彈性網絡給人的第一印象是自我組織圖的孿生兄弟。事實上,他們的確相關。但是彈性網絡比它的小兄弟速度快,所得的解也較佳。彈性網絡的觀念非常簡單,就像我們在上一章所提到的柏納‧安結尼爾的研究,彈性網絡是由 m個點的圈形所組成的(注意: m必須比城市的數目 n大)。現在,想像彈性網絡是一個橡皮筋,它會自然會收斂成最小張力的狀態。現在,再把城市當具有吸引力的藍點,它會大力吸引彈性網絡上的紅點。於是對於彈性網絡上的每一點,都有兩股力量作用於上,如右圖所示。 |
彈性網絡的精髓是一組簡單的方程式( X是城市, Y是繩上的點):
彈性網絡最妙的地方是它永遠可以產生有效解。由於它不會產生交叉的路徑,所以產生的解都相當不錯。舉例來說,對一個隨機產生的50個城市的推銷員問題,彈性網絡的解只有比德賓和威爾蕭的論文中所提的最具競爭力的演算法長 2% (什麼是最具競爭力的演算法?有人說是林-克尼根( Lin-Kernighan)演算法,也有人說是 SA+OP)。但是彈性網絡最吸引人的地方不在它的有效解,而在它收斂的速度。許多人試著去改善彈性網絡收斂的速度,都有不錯的結果。舉例來說,柏爾(Burr)所提出的改良版可令50個城市的推銷員問題的收斂次數由1250大幅降為30次[6]。一個最佳化的彈性網絡的速度會比林-克尼根快兩倍。[7] |
|
How about some traveling ants?
|
|
螞蟻王國是我們最偏好的方法。它是「有機的」、直覺的、強韌的,而且迅速(有些時候)。螞蟻王國是由一個看起很和氣的比利時人馬可‧朵麗哥(Marco Dorigo)[11]在觀察真正的螞蟻時得到的靈感。螞蟻可以在食物和巢穴間找到最短的路徑,所以為什麼不能用它們來解推銷員問題呢?在深入研究螞蟻王國前,我們先來看看自然界中這些神奇的螞蟻。 |
因為螞蟻在行動的時候會釋放出一些費洛蒙,這些費洛蒙就是為什麼螞蟻會一隻一隻地跟著前面的同伴走的原因。下一隻螞蟻會跟著前一隻螞蟻走的機率跟前一隻螞蟻所釋放的費洛蒙成正比。換句話說費洛蒙越多,下一隻螞蟻會跟著走機會越大。也就是說,個體會偏好大眾的選擇。現在你可以解釋上圖的現象了嗎?
螞蟻王國只有一個函數需要瞭解:。這個函數決定了螞蟻的下一步。t(r,s)是從城市 r到城市 s的費洛蒙強度。 e(r,s)是城市 r到城市 s的距離倒數(叫做能見度)。Mk 是螞蟻 k的記憶體,也就是說螞蟻記得它已經拜訪過的城市。每一隻螞蟻會根據從所在城市至還沒拜訪城市的機率 Pk(r,s)決定下一步。等到每一隻螞蟻完成旅行,便會分別將費洛蒙 Q散布在走過的路徑上。路徑越短,加得越多。這使得下一回合時,螞蟻們便會偏好能見度較高且費洛蒙較多的路徑。當然,每一回合結束時,一部份的費洛蒙會散發掉。這就是整個螞蟻王國運作原理。夠簡單吧?
Is there anything I can play?
|
我們設計了幾個在暈倒司九五(Windows 95)下執行的程式來試試彈性網絡與螞蟻王國的效果。除此之外,我們還改寫了以前的基因演算法與設計了一個讓人試著來解推銷員問題的小程式。在下載並執行這些程式前,請花幾分鐘看一下以下的程式說明。
所有的程式都有著相似的介面,基本上可以分成三個區域:輸出區、參數區和狀態列。輸出區會畫出程式地圖,找到的解,以及其他相關的資訊(例如在螞蟻王國中,輸出區會畫出費洛蒙的強度)。要瞭解狀態列的縮寫意義,只要將滑鼠游標停留在狀態列上一下子,就可以看到提示。至於參數區的說明如下:
彈性網絡使用到的參數跟談到彈性網絡的那一章裡頭所講的是一樣的, ke 則是終止條件。如果 step 被打勾,則程式在每一步之間會暫停 100毫秒(或其他使用者輸入的數值)。如果 Random 被打勾,則程式會以系統時間作為亂數產生器的種子數,否則,就以使用者輸入的數( Random 右邊那一格)為種子數。你可以利用 load 來載入推銷員問題檔與其最佳解,如此便可比較彈性網絡所找出來的解與最佳解差了多少。 Central, Radius, and Error 這三個參數的前兩個,只影響彈性網絡的起使位置和大小,對求解沒有影響。第三個參數代表城市與網絡點之間的容忍距離,也就是說,如果某城市與某網絡點之間的距離,小於容忍距離,那就把這個城市當成是被該網絡點所拜訪。 按下小 w按鈕會將目前的結果與參數值寫到「en.out」這個檔案。使得我們可以很方便地來比較不同參數的效果。 |
螞蟻王國這個使用者介面和彈性網絡幾乎是一模一樣,唯一需要解釋的東西是 Tolerance 這個參數。這個參數代表如果每一隻螞蟻所找到的解其誤差在 Tolerance以下,則稱螞蟻們進入的停滯狀態,並中斷迴圈顯示結果。同時在狀態列的最左邊會顯示一個小 S 記號。steps這個參數決定了螞蟻們要試幾回合。 |
人腦這個程式讓你載入或用特定的種子數來初始化不同的推銷員問題,使用者只需循序按下欲拜訪的城市,最後再按下 Calculate按鈕即可。 |
你可以下載執行檔and原始程式。請注意實際上的使用者介面可能會與上面所見略有出入。
So exactly how well do these programs do? |
我們作了一連串的實驗來比較測試這兩個方法與基因演算法和人腦的解題能力。首先,我們用七種已知最佳解的推銷員問題來測試各種方法及人腦,有關這七個推銷員問題的檔案我們已經放在執行檔中或可在許多其他相關的站上找到。
推銷員問題 | 彈性網絡 | 螞蟻王國 | 基因演算法 | 人腦(平均) |
Att48 |
5.81%
|
2.86%( 875)
|
3.0%(3256) |
!4.41%(7)
|
Berlin52 |
6.90%
|
1.52%(1388)
|
7.4%(3816) |
!5.18%(6)
|
Eil101 |
9.10%
|
7.64%(1488)
|
14.2%(5000) |
8.83%(6)
|
Eil51 |
3.37%
|
4.41%(1115)
|
4.4%(5000) |
8.98%(3)
|
St70 |
4.16%
|
3.42%( 283)
|
5.9%(4408) |
7.03%(3)
|
Ulysses16 |
1.30%
|
0%(3289)
|
-0.1%( 901) |
!1.05%(2)
|
Ulysses22 |
1.57%
|
0%(4562)
|
0.3%(1364) |
N/A
|
螞蟻王國在七次的競賽中贏得六次,為最後總冠軍。然而我們必須指出螞蟻王國通常要花費十數倍於彈性網絡的時間。彈性網絡的困難之處在於參數調整,雖然預設的參數通常已可找到適當的解,但並不能找到一個較佳解。同時不要忘記,螞蟻的移動方向乃是取決於機率,所以有可能在下一次的執行後會有更好的解。但是對於城市數少的推銷員問題(例如最後兩組),螞蟻王國很容易就找到最佳解。附帶一提,基因演算法的參數設定為 ER operator, 500 offsprings, limit of 5000 generations, cutoff = 1.02, duration = 500, probability of crossover = 0.13, and probability of mutation = 0.05。
跟電腦比起來,人腦似乎不怎麼靈光。比較起來,由人腦作出答案的變異性相當大。也就是說,有些人可以在一次的試驗就找到近乎最佳的解,但有些人僅能找到適合的解。
在第二個實驗中,我們讓程式用種子數為 10,20,…100產生30個城市的推銷員問題,且不調整預設參數。螞蟻王國方面,我們用了30隻螞蟻讓它們跑1000和2000個回合,而彈性網絡則用90個點疊代1000次。實驗結果如下:
推銷員問題 | 彈性網絡 | 螞蟻王國(1000) | 螞蟻王國(2000) | 基因演算法 |
#1 |
4.442
|
4.597( 62)
|
4.442(2244) | |
#2 |
4.053
|
4.053(602)
|
4.053(2887) | |
#3 |
4.634
|
4.480(367)
|
4.480(2117) | |
#4 |
4.744
|
4.744(170)
|
4.480(1207) | 4.799(2149) |
#5 |
4.869
|
4.759(994)
|
4.737(1759) | 4.737(1344) |
#6 |
4.316
|
4.214(120)
|
4.369(1734) | |
#7 | 5.498 | 5.061(467) | 5.049(1365) | 5.322(1083) |
#8 | 4.621 | 4.601(416) | 4.846(1153) | |
#9 | 4.362 | 4.358(250) | 4.387(1776) | |
#10 | 5.535 | 5.211(139) | 5.454(2237) | |
Average |
4.707
|
4.608(359)
|
4.601(629) | 4.689(1972) |
Variance | 0.236 | 0.128 | 0.125 | 0.192 |
Anything else? |
跟郝伯非爾德和坦克的類神經網路模型比較起來,彈性網絡至少能求得一個還不錯的解。雖然郝伯非爾德和坦克的類神經網路模型可以運用到其他的最佳組合問題,但離實際的工業級應用還有一大段路要走。
比起上一段所提到的彈性網絡與郝伯非爾德和坦克的類神經網路模型,螞蟻王國要來得強韌多了,至少不受限於平面的推銷員問題。螞蟻王國已經有很多成功地應用在其他最佳組合問題上(包括各種推銷員問題的變形),實驗結果也指出它優於彈性網絡。欲知詳情,請到螞蟻王國的首頁。
重點在於,推銷員問題(對人類而言)的困難度在於內部點的多寡(外接凸邊型內的點),而非全部的點數。因此,科學家們可能會問:為什麼不抓幾隻猴子來解解看推銷員問題,看看是不是有同樣的結論?沒想到真的有人在做這方面的研究:已經有許多論文談到猴子及黑猩猩解推銷員問題的實驗。結論是,即使是動物也有解決簡單的推銷員問題的基本智能。例如,猴子們會一次考慮接下來的兩三個點,而不是只考慮離牠最近的一點。這些論文都能在「實驗生物學月刊」(Journal of Experimental Biology) 其中一篇論文[10]的參考資料中找到。或者,你可以到依伐司‧彼得森的數學島,其中有一篇簡介這類實驗的短文。
在螞蟻王國的第一篇論文中,馬可也嘗試了其他兩個叫做「螞蟻-密度」及「螞蟻-數量」的方法。這兩個方法與原始方法的主要差異在於每隻螞蟻分泌費洛蒙的時機(走一步就留一點,而不是等到全部走完再分)。而這兩個方法之間的差異在於螞蟻分泌的費絡蒙量。對「螞蟻-密度」來說,每隻螞蟻每一步都留下固定的費絡蒙量,而「螞蟻-數量」所留下的費絡蒙量是與每一步的距離成正比。但是結果顯示,這兩種方法還是沒有比原來的螞蟻王國好。
柏恩德‧布恩海默( Bernd Bullnheimer)等人提出了一個「菁英螞蟻」的構想。就是讓找到較佳解的螞蟻(菁英螞蟻)分泌比其他螞蟻更多的費絡蒙,此外也可以只讓最佳的 k隻螞蟻分泌 ,並將他們的解依大小加權。這的確是一個正確的方向。這個方法可以將螞蟻王國所找到的解從沒有「菁英螞蟻」前的1.02%降到有「菁英螞蟻」後的 0.31% (與最佳解比較),這不是挺好的嗎?
The Vault |