启发式算法
啟發式算法
- 寫在前面
- 傳統啟發式算法
- 貪心算法
- 局部搜索
- 爬山算法
- 元啟發式算法
- 禁忌搜索
- 模擬退火算法
- 遺傳算法
- 蟻群算法
- 粒子群優化算法
- 超級啟發式算法
- 參考
- 想了好久,還是準備要寫下這篇文章,好好總結之前項目中遇到的一些相關算法,然后學習其他相關算法,希望擴充自己的知識面。慢慢寫,希望善始善終
- 21.8.8 目前的目標是對每個算法的基本思路和步驟了解清楚,并且逐步開始從具體問題對算法進行練習,在這些工作全部完成之后,可以開始了解和應用算法中的其他變體。
- python實例源碼:
寫在前面
- 最優化算法、啟發式算法。本篇主角啟發式算法區別于精確算法,啟發式算法指:一個基于直觀或經驗構造的算法,在可接受的花費(指計算時間和空間) 下給出待解決組合優化問題每一個實例的一個可行解,該可行解與最優解的偏離程度一般不能被預計
- 但是傳統啟發式算法存在一些問題:一是傳統啟發式算法依賴于算法的組織結構信息,通用性不高,二是容易困在局部最優解中···
- 隨著啟發式算法的發展,出現了區別于傳統啟發式算法的元啟發式算法(題外話:如何理解meta元?),元啟發式算法簡單來說,在傳統啟發式算法的思想上增加了隨機搜索的思想,并且不過分依賴于算法的組織結構信息
- 啟發式算法中的傳統啟發式算法和元啟發式算法都不能保證獲得全局最優解,但是元啟發式算法由于增加了隨機搜索的思想,反復執行可能收斂到全局最優解,并且元啟發式算法不過分依賴算法組織結構信息,擁有更加通用啟發式策略
- 分類如下:
傳統啟發式算法
貪心算法
- 思路:貪心算法是指一種在求解問題時總是采取當前狀態下最優的選擇從而得到最優解的算法,但是缺乏對整體最優的考慮。貪心算法的思路是:建立數學模型來描述問題,把求解的問題分成若干個子問題,對每個子問題求解,得到子問題的局部最優解,把子問題的解局部最優解合成原來問題的一個解
- Dijkstra算法
局部搜索
爬山算法
元啟發式算法
禁忌搜索
模擬退火算法
- 思想:模擬退火算法思路來自于物理退火過程,在系統溫度越高,退火現象指物體逐漸降溫的物理現象,最終達到結晶狀態,系統的能量狀態最低。
- 細節:系統從高溫降溫過程中,隨機選取可行解鄰域內值,計算目標函數的增量值,如果系統能量下降,則接受該可行解,否則依照概率接受該解。在達到結束條件時結束循環
- 步驟:
- 初始化溫度和終止溫度,最大迭代次數,可行解
- 隨機選取可行解的鄰域值,計算系統能量增量,如果增量小于0則無條件接受該值;否則按照概率接受該值
- 降低溫度
- 如果達到終止溫度/最大迭代次數,則停止算法;否則跳回2
- 從狀態111到狀態222,Metropolis接受準則:
p(1→2)={1E(xnew)<E(xold)exp(?E(xnew)?E(xold)T)E(xnew>=E(xold)p(1\rarr2) = \begin{cases} 1 & E(x_{new})<E(x_{old}) \\ exp(-\frac{E(x_{new}) - E(x_{old})}{T}) & E(x_{new}>=E(x_{old}) \end{cases} p(1→2)={1exp(?TE(xnew?)?E(xold?)?)?E(xnew?)<E(xold?)E(xnew?>=E(xold?)?
- 目標函數
遺傳算法
- 思想:遺傳算法的思路來自于遺傳與進化理論,主要包含三個階段:自然選擇,基因重組,變異。
- 細節:每一條染色體對應一種解決方案,首先要尋找一種從表現型到基因型的數字化編碼方式,即我們需要的表現到數字化的表示過程,然后再隨機初始化種群/染色體群,為了選擇出適應度強的個體,我們需要構造適應度函數。隨后的過程就是:選擇、交叉、變異,并且為了保證種群個數不變,在選擇時按照適應度高低決定被保留的概率;交叉類似于基因重組,有單點交叉、多點交叉、均勻交叉,交叉點間之間的部分依照交叉概率進行交換,最終形成新的個體;變異即是染色體任意位置編碼值以一定概率反轉。
- 選擇:優勝劣汰,適者生存
- 交叉:豐富種群,持續優化
- 變異:隨機擾動,避免局部最優
- 步驟:
- 隨機初始化種群
- 評估每條染色體的適應度
- 遵循適應度越高,被抽取概率越大的原則,從種群中選取個體作為父母本
- 父母本染色體進行交叉,產生子代
- 對自帶染色體進行變異
- 在未達到循環終止條件時,跳回2
- 適應度函數用于評價某個個體的適應度,表現出群體中不同個體的好壞,一般總是非負的,由目標函數變換而來
- 選擇函數用于抽取親代中的個體,常用的選擇算子有:輪盤賭選擇,隨即競爭選擇,最佳保留選擇······
蟻群算法
粒子群優化算法
- 思想:粒子群優化算法的思路來自于鳥類覓食,粒子群優化算法思路是:每個粒子根據個人信息和團隊信息改變搜索方向,以尋找最優解
- 細節:每個粒子都有一個由目標函數決定的適應值,并且知道自己到目前為止發現的最好位置和現在的位置。這個可以看作是粒子自己的飛行經驗。除此之外,每個粒子還知道到目前為止整個群體中所有粒子發現的最好位置,這個可以看作是群體信息。
- 步驟:
- 初始化一群微粒(群體規模為N),包括隨機位置和速度;
- 并評價每個微粒的適應度;
- 對每個微粒,將其適應值與其經過的自己最好位置pbest作比較,如果較好,則將其作為當前的自己最好位置pbest;
- 對每個微粒,將其適應值與其經過的全局最好位置gbest作比較,如果較好,則將其作為當前的全局最好位置gbest;
- 調整微粒速度和位置;
- 未達到結束條件則轉第2步。
- 第kkk次迭代,微粒位置和速度調整公式(此處公式為向量化后的公式):
Vk=wVk?1+c1r1(pbest?Xk?1)+c2r2(gbest?Xk?1)Xk=Xk?1+Vkc1,c2為加速度常數r1,r2為0到1的隨機數w為慣性權重V^k=wV^{k-1}+c_1r_1(pbest-X^{k-1})+c_2r_2(gbest-X_{k-1})\\ X^k=X^{k-1}+V^k\\ c_1,c_2為加速度常數\\ r_1,r_2為0到1的隨機數\\ w為慣性權重 Vk=wVk?1+c1?r1?(pbest?Xk?1)+c2?r2?(gbest?Xk?1?)Xk=Xk?1+Vkc1?,c2?為加速度常數r1?,r2?為0到1的隨機數w為慣性權重 - 優勢:在于簡單容易實現并且沒有許多參數的調節。目前已被廣泛應用于函數優化、神經網絡訓練、模糊系統控制以及其他遺傳算法的應用領域
- 適應度函數和目標函數
超級啟發式算法
參考
總結
- 上一篇: oracle里面的double,orac
- 下一篇: plecs matlab 联合仿真,基于