启发式算法在最优化问题求解中的应用与实践
最優化問題廣泛的存在于社會生產活動當中,我們一直努力尋求更高效、更準確的解決方式來應對這類問題。通常,最優化問題可以表述為一種數學規劃的形式,對于變量在可行域中的不同組合進行搜索,以得到目標函數的最優值。在解決常規的最優化問題時,有多種解決方案,如梯度下降法,拉格朗日乘數法等。然而,有一類最優化問題卻是人類目前難以逾越的門檻,即NP完全問題(Non-deterministicPolynomial)。本文介紹了最優化問題的常見應用場景和求解方式,并重點對啟發式算法在求解NP問題的次優解過程進行了分析。最后通過模擬退火算法和蟻群算法尋求最優化路徑的實例,實踐了通過啟發式算法來求解NP問題的次優解,為我們在日常生產活動中解決此類時間復雜度具有不確定性的最優化問題提供一種成本可控,目標效益更高的解決方案。
1
引言
在日常生產活動中,我們經常會面臨諸如:超市的配貨卡車需要給不同的門店送去貨物,如何規劃卡車的配貨路線,使得每個門店均可接收到貨物,并且卡車配送所花時間和行駛里程最短;某視頻門戶網站需要在全國各地設立視頻資源存放服務器,一方面要保證服務器部署節點能夠覆蓋所有的用戶,并且要降低從用戶到服務器之間的鏈路成本,提高用戶請求視頻資源的響應效率,另一方面要盡量減少服務器部署節點,以降低經濟成本;這類路線規劃和資源配置問題均可歸類到最優化問題的求解范疇。解決最優化問題的方法被稱為最優化方法,常見的最優化方法有以下幾類:1)梯度下降法;2)牛頓法;3)共軛梯度法;4)拉格朗日乘數法;5)啟發式算法。這五類算法每一種都有自己適用的場景和其優勢,因此在解決最優化問題前,分析應用場景,選取合適的最優化方法是首要任務。 計算機科學的兩大基礎目標是:發現可證明其執行效率良好且可得到問題的最優解或次優解的算法。而在最優化問題中,有這樣一類問題卻是目前人類難以逾越的門檻——NP完全問題,該問題也是世界七大數學難題之一(其中龐加萊猜想現已被俄羅斯數學家格里戈里·佩雷爾曼解決)。NP即多項式復雜程度的非確定性問題,所有的在非確定性多項式時間可解的判定問題構成了NP類問題。在解決這類問題時,常規的確定性時間復雜度的算法不再適用,而啟發式算法這類非確定性時間復雜度的算法,卻能夠較好的尋找到該類問題的一個可以接受的次優解。通常,啟發式算法搜索得到的問題的解不是最優解,而是隨著算法的改進和迭代無限接近最優解的次優解。因為目前,我們找不到一個更好的算法,能夠證明其執行效率良好、穩定,并且能得到問題最優解的算法,所以啟發式算法是目前我們解決這類問題的一種較好手段。 常用的啟發式算法有模擬退火算法、遺傳算法、蟻群算法和人工神經網絡等。以上這些算法我們都不能給出其確定的執行時間復雜度,也不能證明其求解得到的解是否是問題的最優解。而是能夠在大多數情況下,在“可接受”的時間開銷內得到問題的一個“較好”的解。評價“可接受”的依據是能夠保證生產的基本時間開銷要求,評價“較好”的依據是,所得到的雖然不是最優解,卻是一個能夠滿足生產活動需求并且帶來更大效益的解。因此學習研究啟發式算法對于我們在日常生產活動中解決某些最優化問題有著重要作用和意義。啟發式算法領域也在近幾年得到了廣泛的應用和研究,如人工神經網絡應用于機器學習等領域的研究。另外三種啟發式算法,均為仿自然界生物現象的算法。模擬退火算法來源于固體退火的過程,用于求解組合優化類問題;遺傳算法模擬了達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程,用于解決搜索類問題;蟻群算法模擬了螞蟻尋找食物過程中發現路徑的行為,用于解決路徑優化問題,也是一種比較有趣的算法。 本文的主要工作是; 1)對最優化問題及其常見的應用場景和解決方法進行了介紹和分析; 2)分析講解了P類問題,NP類問題和NP完全問題(NP-C問題); 3)介紹了常見的啟發式算法及其應用,并重點就模擬退火算法和蟻群算法為代表的啟發式算法解決NP類問題進行了講解和實踐。2
常見最優化問題及其解決方法
2.1下山最優路徑問題與梯度下降法 如下圖2.1所示,假設有一座山,四周都是濃霧,看不清任何東西。如何在山頂的A點出發,找到一條去山腳的最快路徑,這就是一個最優化問題。在解決這個問題時,我們把這座山看作可微分的函數,山的高度看作函數的目標值,也就是要找到一條路徑,使得函數值下降得最快,就可以找到最快下山的路徑。 圖2.1. 梯度下降法 建立一個平面坐標系后,將山上每個點的高度看作關于的函數:? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??(1) 站在A點的時候,通過求該點的梯度,梯度是一個向量,該向量的方向指向了函數值增長最快的方向。因此要下山最快,就沿著與梯度方向相反的方向走。當函數是單變量時,梯度即為導數;當函數為多變量時,梯度即為分別對每個自變量求偏導后構成的一個向量。采用梯度下降的算法有SGD,Adam。 2.2非線性函數與X軸交點問題與牛頓法 圖2.2. 牛頓法 如圖2.2所示,牛頓法主要用于解決研究問題中的目標值是關于變量的非線性函數,且在可行域中只有一個交點,但是通過數學計算方法無法求得精確的交點。牛頓法提供了一種通過迭代的方式無限逼近交點,其思想為從某一點出發,求得該點處函數的切線,得到切線與x軸的交點記作,再次求處的切線,得到下一個交點,就這樣無限的逼近函數與x軸的交點。 牛頓法能夠快速收斂于最優值的原因是:當函數任意階可導時,通過展開為泰勒級數,取泰勒級數一階展開式構建的線性函數來代替曲線,因為從微觀的角度看,極小的區間內,曲線就趨近于直線。而牛頓法需要求解函數在區間內的二階偏倒數,因此要求函數二階連續可微。LM算法即采用的牛頓法。 2.3牛頓法的改進——擬牛頓法 從上面介紹的牛頓法可知,雖然收斂速度較快,但是需要計算目標函數的二階偏導數來構建線性函數,該過程計算復雜度較大,并且目標函數的黑塞矩陣不是所有時候都保持正定,牛頓法在這種情況下就失效了。而擬牛頓法就是為了解決計算復雜度大,黑塞矩陣有時不是正定的問題而提出的。擬牛頓法的改進思想是:不用二階偏導數近似的構造黑塞矩陣(或其逆矩陣)的正定對稱陣。使用較多的擬牛頓算法有DFP,BFGS和L-BFGS。 以上介紹的三種最優化算法是機器學習中最常用的三類迭代算法。表格2.1給出了三種算法的特點對比和常見應用場景。 表2.1三種最優化算法的特征對比| 算法 | 迭代時間復雜度 | 算法收斂速度 | 初始值要求 | 應用場景 |
| 梯度下降法 | 需計算一階導,復雜度為 | 收斂較慢 | 容易逃離鞍點(一階倒數為0) | 特征維度較大的場景 |
| 牛頓法 | 需計算二階導,復雜度為 | 收斂快 | 有要求,非凸函數容易陷入鞍點 | 特征維度較小的場景 |
| 擬牛頓法 | 近似Hessian矩陣的逆矩陣,復雜度為 | 收斂快 | 無明顯要求 | 比較適合凸優化問題 |
2.4拉格朗日乘數法 拉格朗日乘數法由法國著名數學家約瑟夫·拉格朗日提出,用于求解多元函數在變量受一個或多個限制條件約束下的極值問題。假設一個多元函數有個變量,需要求解個約束條件下的極值,拉格朗日乘數法通過將該最優化問題轉化為一個有個變量的函數的極值問題。在這個轉化過程中,需要引入一個新的參數,即拉格朗日乘數:新構建的方程組中,每個向量的系數。 下面我們看這樣一個最優化問題的情境:有一個紡織工廠主想要盡可能的提高其工廠利潤,假設在廠房(足夠使用)等外部條件固定時,利潤函數與投入的紡織機數量和雇傭的工人數量有關,假設可表示為,因為紡織機的數量和工人數量必須構成一定的比例關系,才能不造成工人空閑或工人照看不了過多的紡織機,該比例關系表示為,由于工廠主的資金有限,最多能夠為紡織機購置和工人雇傭支付的金額。因此需要滿足:,由于在廠房夠用的情況下,工廠主希望能夠以最大的資金投入,來獲取更多的回報,因此,可以得到。接著,將上面的收益函數在約束條件最大化表示為以下形式:? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ?(2)
此時引入兩個新的參數構建方程:? ?????????????? ? ? ? ?? ? ? ? ? ?(3)
然后令函數對自變量分別求一階偏導數的值為0,可得到:? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?? ? ? ? (4)
通過求解上述方程組(4)即可得到工廠主的利潤函數z的極值,這里的極值有可能是最小值,也有可能是最大值。如果求得的極值點只有一個,那么該極值點就是問題的最優解,因為不可能是最小值(不投入資金時候收益為0)。當求得的極值點有多個時候,我們很容易把這幾個極值點代入到利潤函數z中去,通過比較計算得到的值,其中最大值對應的極值點,就是問題的最優解。 2.5啟發式算法 啟發式算法的定義是:一個基于直觀或經驗構造的算法,在可接受的花費(指計算時間和空間)下給出待解決組合優化問題每一個實例的一個可行解,該可行解與最優解的偏離程度一般不能被預計(來源于百度百科)。常見的啟發式算法有:模擬退火算法,遺傳算法,蟻群算法和神經網絡,均為仿自然體的算法。 2.5.1模擬退火算法 模擬退火算法是是仿固體退火原理,當固體被加溫時,內能增大,粒子的動能增大,處于無序狀態,而溫度逐漸降低過程中,粒子會逐漸趨于穩定有序,內能達到最低。在這一過程中,粒子的排列組合決定了內能的大小,但固體最終會形成一種內能最低的狀態。模擬退火算法就是模擬的這個隨著溫度下降,內能降低的過程。通常可以用來解決復雜度較高的組合問題。 圖2.3. 模擬退火算法示意圖 在圖2.3中,固體初始溫度低,粒子排列較為緊密,但不是最緊密的狀態。此時將固體加熱,粒子由于吸熱內能變大,熱運動變強烈,粒子間距離增大。隨著溫度逐漸降低,最終粒子會趨于平衡狀態,粒子排列最為緊密,內能最低。這種粒子排列組合狀態,就是使得內能最低的最優狀態。 2.5.2遺傳算法 遺傳算法模擬的是達爾文的生物進化理論,處理方法包括“選擇運算”,“交叉算子”和“變異運算”,評價和選擇指標則是“適者生存”。因為啟發式算法主要用來解決搜索最優解復雜度較高的問題,常規的“蠻力法”搜索通常極為耗費資源,且不能在可接受的時間內得到問題的解。那么,啟發式算法必須按照一種更“合理”的搜索方式來逼近問題的最優解,遺傳算法就是按照生物進化論的方式來搜索,將每次得到的個體(問題的一個可行解),通過一個適應度來評價,適應度越高,距離最優解的距離也就越近。因此,在每次跌倒過程中,適應度越高的個體,其基因遺傳下去的概率會更大,這就是“適者生存”。并且,個體基因遺傳下去的方式有:直接遺傳給下一代,或者與其他個體配對后遺傳(選擇運算);當兩個個體配對時,必須按照一定的規則來繼承上一代的基因,這個規則就是“交叉算子”;在遺傳的過程中,個體的基因會有一定概率發生改變,基因改變的過程就是“變異運算”。遺傳算法的過程可用圖2.4表示。 圖2.4. 遺傳算法 2.5.3蟻群算法 蟻群算法用于解決尋找最優路徑的問題,模擬的是螞蟻找食物的過程,是一種比較有趣的算法。在自然現象中,我們可以觀測到這樣的現象:螞蟻找尋找到食物時,通常能夠走一條接近直線的路線到窩,如果直線上有障礙,也能夠找到最短的繞過路線。這一現象就說明,螞蟻尋找食物的過程,一定用一種機制來指導整個蟻群尋找到最優的路徑。蟻群算法,就是對這一現象觀測研究,然后抽象簡化得到的尋找最優路徑的算法。 圖2.5. 蟻群運食物路線示意圖 螞蟻找食物最重要的兩個特征是多樣性和正反饋:多樣性,即螞蟻在選擇路徑時,有一定的概率隨機選擇任意的方向,以探索新的路徑;正反饋則是,螞蟻在選擇路徑時,較大的概率選擇較多螞蟻走過的路徑。正是這兩種機制巧妙的結合在一起,才使得螞蟻能夠找到一條接近最優的路徑。如果多樣性的影響過大,則會出現整個蟻群過于活躍,無法收斂到一條路徑上,如果正反饋影響過于大,則會出現蟻群出現僵化的現象,陷入一個區域無法出來。蟻群算法,對尋路過程抽象為以下幾個方面: 1)螞蟻的感知范圍:任何一只螞蟻只能感知以它為中心的一定半徑大小圓形區域的路徑。 2)信息素:有代表窩的信息素和代表食物的信息素,分別指導螞蟻找窩和食物。 3)遺留信息素:螞蟻尋找到窩時,會在附近遺留下最多窩的信息素,隨著距離窩越遠,遺留的信息素越少。尋找到食物時,同理,距離食物越遠遺留食物信息素越低。所有的信息素會以一定的速率揮發消失。 4)螞蟻尋路規則:如果周圍有信息素,則較大概率走信息素高的地方,否則按照慣性保持直線行走,有小概率會選擇其他的方向,并且能夠記住最近走過的點,不重復。 5)躲避障礙物:有信息素時候,選取信息素高的地方,否則隨機選擇其他方向。 2.5.4神經網絡 這里所說的神經網絡指的是人工神經網絡(ArtificialNeural Network,ANN),是近年來人工智能領域的研究熱點,模擬的是人腦神經元之間的傳遞過程,通過構建數學映射模型,在神經元之間通過激勵函數來傳遞信息,從而從輸入映射到輸出。由于最開始構建的神經網絡模型,沒有得到任何訓練,從輸入映射得到的輸出可能相對于我們期望的輸出誤差較大,這時通過把誤差反向傳播,以調節中間神經元之間的權值,經過大量這種訓練和反饋調節過程,最終神經網絡系統能夠得到準確度較高的結果。 圖2.6. 神經網絡示意圖 圖2.6中通過一個形象的例子來示意了神經網絡工作的過程,將神經網絡系統看做一個復雜的水管管道系統,每一層都有很多節點,每一個節點均與上下鄰近的所有節點相鄰,且位于節點上的開關可以控制流向下一層的每個節點的水量大小。現在希望神經網絡能夠識別阿拉伯數字,在圖片庫中有很多寫有數字的照片,我們將照片的數據看做水流,從最上層流入最下層,該系統會將最下層接收到水流最多的桶上的數字判定為輸入照片的數字。最開始的時候,誤差比較大,經常識別錯誤,這時我們就調節中間層每一個開關,控制不同方向的流量。經過大量這種訓練調節過程,最終我們只要將寫有數字的卡片輸入,就能非常準確的識別出對應的數字。3 NP類問題與啟發式算法
NP類問題與啟發式算法
3.1 P類問題、NP類問題和NP完全問題 在介紹這三類問題時,首先介紹一下多項式時間復雜度。當我們說起冒泡排序算法,會將其時間復雜度表示為,而快速排序算法,時間復雜度表示為,這兩種算法均為多項式時間復雜度。通常,一個算法具有多項式時間復雜度時,均可表示為以下形式:???(5)
P(Polynominal)類問題,即能夠在多項式時間復雜度內得到該問題的解。而NP類問題(Non-DeterministicPolynomial Problems),從字面上翻譯為“非確定性多項式問題”,即不能在確定的多項式時間復雜度內得到該問題的解。另一方面來定義,NP類問題指的是“能夠在多項式時間復雜度內驗證問題的一個解”。也就是說,雖然我們不知道是否存在一個算法能夠在多項式時間復雜度內得到NP問題的解,但我們可以在多項式時間復雜度內驗證某個答案是否是NP問題的一個可行解。旅行商問題(TSP)是一個著名的NP問題,該問題描述了一個商人要去拜訪n個城市,要求途中經過每個城市1次且僅1次,最后回到出發城市,如何找到最短的那條回路?該問題,如果用蠻力法來羅列所有的組合,復雜度為,這就不是多項式時間復雜度了。NP完全問題是NP問題的一個子集,如果任何一個NP問題,均可在多項式時間復雜度內轉化為某個NP問題,那么就被稱為NP完全問題。進而可以推得,如果中存在某個NP問題可以在多項式時間復雜度內求解,那么任何一個NP問題都可以在多項式時間復雜度內求解,即著名的難題“NP=P?”。 3.2 模擬退火算法求解TSP問題 模擬退火算法其實也是一種貪婪算法,只不過加入了隨機因素來接受一個比當前解更差的解。由于普通的貪婪算法容易陷入局部最優,因此,以一定概率接受更差的解可以跳出一些局部最優。如下圖3.1所示,從A點開始出發搜索最低點,普通貪婪算法搜索到B點時即停止搜索,而B點是一個局部最優解。模擬退火算法會以一個概率接受繼續向C點移動,因此有可能會跨過C點,進而到達問題的最優解D。 圖 3.1. 模擬退火算法尋求最優解示意圖 將模擬退火算法的執行步驟,表示為如下偽代碼形式: 算法1:采用模擬退火算法求解組合優化問題的執行步驟 輸入:組合優化問題的一個初始解,及目標函數的值。 輸出:問題的解(可能為最優解,也可能為次優解) 01:產生問題的一個初始解,目標函數值及初始溫度; 02:產生問題的一個新解,并計算其目標函數值和衰減后的溫度; 03:當時,接受解,否則,以概率接受解; 04:如果超過一定次數均沒有接受新解,結束當前搜索,否則,重復02~03步驟。 算法1所示步驟為在一次溫度衰減下的搜索過程,通常會重復執行算法1直到溫度衰減到某個較低的值,不斷迭代優化當前已經找到的最優解,然后從這些解中選擇使得目標值最小的那個解為問題搜索得到的最優解。 圖 3.2. 旅行商問題 在求解TSP問題時,需要在如圖3.2所示的無向圖中,尋求從某點出發并回到該點的一個哈密頓回路。每兩個點之間的路徑有一個權重,可看作路程里數,現在需要從A點出發,經過圖中其他所有點1次回到A點的最短路徑。模擬退火算法的做法是,首先我們從一條可行的回路出發,如A—>B—>D—>E—>F—>C—>A,這條回路看做初始解,并將路徑長度24記為目標函數初始值。然后將起點與終點之外的路徑做一個隨機的重排,比如隨機交換兩點的位置,得到問題的新的解,根據新的解對應的目標函數值的大小判斷是否接受新的解,運用算法1來循環執行該優化過程。04
啟發式算法在尋找最優路徑中的應用與實踐
本節介紹通過模擬退火算法實現求解TSP問題和蟻群算法模擬螞蟻找食物的仿真程序及其結果。程序通過C語言編寫,在VisualStudio2012中編譯通過。在通過圖形化界面動態展現蟻群尋找食物過程時,用到了EasyX圖形庫。 4.1 模擬退火算法應用于求解TSP問題的實踐 在該仿真中,解決一個有30個節點的全連通無向圖的TSP問題,該問題如果通過暴力求解法,需要判別的組合數量為30!,這是一個非常巨大的數字。程序首先通過一個函數生成了圖數據,寫入到txt文本中,如圖4.1和圖4.2所示。第一行表示圖中有30個節點,總共有435條邊數據。第二行開始,(x,y,m)表示從節點x到節點y的權重為m。圖4.3為模擬退火算法參數設定。 圖 4.1.圖數據 圖 4.2.圖數據 圖 4.3.模擬退火算法參數 首先生成一個初始解,并計算該解對應的TSP回路的總代價,然后經過模擬退火算法優化,對比優化后的解與初始解的總代價。圖4.4表示模擬退火過程連續拒絕接受更差解的次數為50,圖4.5表示連續拒絕更差解的次數為5000,即在一次溫度衰減時,嘗試更多次的搜索新解。可以看到,搜索次數更多時,能夠得到一個代價更低的TSP回路。 圖 4.4.模擬退火算法優化結果(拒絕次數為50) 圖 4.5.模擬退火算法優化結果(拒絕次數為5000) 4.2 蟻群算法應用于求解最短路徑問題的實踐 在本節中,介紹通過C語言編寫蟻群算法模擬螞蟻找食物的過程,并通過EasyX圖形庫將蟻群的位置動態的顯示出來。蟻群活動的區域為一個600x600像素點的區域,每個螞蟻每次可以移動一個像素點,移動的方向為以它為中心的周圍8個方向,如下圖4.6所示。圖 4.6.螞蟻移動方向示意圖 蟻群在移動時,初始化時去尋找食物,當尋找到食物的時候,就會尋找窩,尋找窩和尋找食物的過程,均依據不同信息素來表征方向。在沒有信息素的時候,大概率直線移動,但會以一定概率選取其他方向。圖4.7~圖4.10為蟻群算法在模擬螞蟻找食物過程的結果圖。 圖 4.7.蟻群算法仿真圖1 圖 4.8.蟻群算法仿真圖2 圖 4.9.蟻群算法仿真圖3 圖 4.10.蟻群算法仿真圖4 該次仿真結果得到了蟻群移動區域收斂于食物(黃色圓點)和窩(紅色圓點)之間的路徑,但結果收斂的效果并不是特別理想。這是因為信息素的損耗系數,螞蟻犯錯的概率,已經遺留信息素的多少,均影響了算法的結果。而在本次實驗中,均根據估計設定的參數,另一方面算法實現本身還需進一步優化修正,因此,算法并沒有收斂于最優的路徑。但從整個結果的趨勢可以看出,蟻群是能夠依靠信息素使得移動區域收斂于食物和窩之間的路徑,并且接近于直線。
5.
總結
本文針對常見的最優化問題及其應用場景進行了分析和實踐。首先,介紹了常用最優化方法,包括方法的基本模型,使用步驟,算法特性等。然后,對比分析了P類問題,NP問題,NP完全問題,以及如何通過啟發式算法去解決優化此類非確定性時間復雜度問題。最后,在仿真實踐部分,通過實現模擬退火算法解決具有NP難度的TSP問題,并得到了一條代價更低的路徑。通過實現蟻群算法,模擬了螞蟻找食物的過程,并得到了蟻群移動區域收斂于食物和窩之間區域的結果。
【參考文獻】
[1] ThomasH.Cormen, Charles E.Leiserson, Ronald L.Rivest,CliffordStein著.算法導論[M].機械工業出版社,2012. [2] 馬學森,宮帥,朱建,唐昊.動態凸包引導的偏優規劃蟻群算法求解TSP問題[J].通信學報,2018. [3]https://baike.baidu.com/item/NP%E5%AE%8C%E5%85%A8%E9%97%AE%E9%A2%98/4934286?fr=aladdin—?THE END —
總結
以上是生活随笔為你收集整理的启发式算法在最优化问题求解中的应用与实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 只用一周的业余时间,这位逆天博士生解决了
- 下一篇: 浙江义乌发现桥头遗址,将5000年中华文