㈠ 優化演算法筆記(七)差分進化演算法
(以下描述,均不是學術用語,僅供大家快樂的閱讀)
差分進化演算法(Differential Evolution Algorithm,DE)是一種基於群體的進化演算法,它模擬了群體中的個體的合作與競爭的過程。演算法原理簡單,控制參數少,只有交叉概率和縮放比例因子,魯棒性強,易於實現。
差分進化演算法中,每一個個體的基因表示待求問題的一個候選解。每次迭代將先進行變異操作,選擇一個或多個個體的基因作為基,然後選擇不同的個體的差分來構成差分基因,最後將作為基的基因與差分基因相加來得出新的個體。交叉操作將新的個體將於父代的對應個體交叉,然後進行選擇操作,比較交叉後的個體與父代的對應個體,選擇較優的個體保留至下一代。在迭代完成之後將選擇種群中最優個體的基因作為解。
差分進化演算法可以算是我所使用過的優化演算法中大魔王級別的演算法,雖然它每個方面都沒有強到離譜,但是綜合起來的效果好於大多數演算法。它就像一個每個科目都能考到90分(百分制)的學生,雖然沒門課都不是最優秀的,但是論綜合,論總分,它有極大的概率是第一名。
在我研究優化演算法的小路上,我的目標就是找到一個能打敗大魔王或是能在大多數方面壓制魔王的演算法。
這次的主角就選魔王軍吧(或者蟻王軍,為了與蟻群演算法區別還是叫魔王軍吧),個體則稱之為魔王兵。
魔王兵的能力取決於它們的基因,它們可以根據環境或者需要改變自己的基因使得自己更加強大,更方便的處理問題,問題的維度與基因維度相同。
表示第i個魔王兵在進化了第t次後的基因,該個體有D位基因。
與遺傳演算法同為進化演算法的差分進化演算法,它們的操作(運算元)也都非常相似的,都是交叉,變異和選擇,流程也幾乎一樣(遺傳演算法先交叉後變異,差分進化演算法先變異後交叉)。
說到差分進化演算法中的變異,我就想到一句論語 「三人行,必有我師焉。擇其善者而從之,其不善者而改之。」 ,其實這句論語已經向我們說明了差分進化演算法的整個流程:
「三人行,必有我師焉」——變異,交叉。
「擇其善者而從之,其不善者而改之」——選擇。
差分進化演算法中,當一個魔王兵變異時,它會先找來3個小夥伴,當然是隨機找來3個小夥伴,避免同化。在一個小夥伴的基因上加上另外兩個小夥伴基因之差作為自己的目標基因。其變異公式如下:
表示第i個魔王兵找到了編號為r1、r2和r3的三個魔王兵,當然了i、r1、r2、r3為互不相同的整數,F為縮放比例因子,通常 ,一般取F=0.5。 為第i個魔王兵交叉後的目標基因圖紙,不過這是個半成品,再經過交叉後,目標基因圖紙才算完成。
其實現在我們已經有了5個基因圖紙了 ,接下來將進行交叉操作。由於變異操作,差分進化演算法的種群中個體數至少為4,即魔王軍中至少有4個小兵。
交叉操作中,魔王兵i會將目標基因圖紙 進行加工得到 ,加工過程如下:
其中 。 為交叉概率,其值越大,發生交叉的概率越大,一般取 。 為{1,2,…,D}中的隨機整數,其作用是保證交叉操作中至少有一維基因來自變異操作產生的基因,不能讓交叉操作的努力白費。
從公式上可以看出交叉操作實際上是從變異操作得出的基因圖紙上選擇至少一位基因來替換自己的等位基因,得到最終的基因圖紙。
選擇操作相對簡單,魔王兵i拿到了最終的基因圖紙 ,大喊一聲,進化吧,魔王兵i的基因改變了。它拿出了能力測量器fitness function,如果發現自己變強了,那麼就將基因 保留到下一代,否則它選擇放棄進化,讓自己還原成 。
實驗又來啦,還是那個實驗 ,簡單、易算、好畫圖。
實驗1 :參數如下
圖中可以看出在第20代時,群體已經非常集中了,在來看看最終得出的結果。
這結果真是好到令人發指,惡魔在心中低語「把其他的優化演算法都丟掉吧」。不過別往心裡去,任何演算法都有優缺點,天下沒有免費的午餐,要想獲得某種能力必須付出至少相應的代價。
實驗2:
將交叉率CR設為0,即每次交叉只選擇保留一位變異基因。
看看了看圖,感覺跟實驗1中相比沒有什麼變化,那我們再來看看結果。
結果總體來說比實驗1好了一個數量級。為什麼呢?個人感覺應該是每次只改變一位基因的局部搜索能力比改變多位基因更強。下面我們將交叉率CR設為1來看看是否是這樣。
實驗3:
將交叉率CR設為1,即每次交叉只選擇保留一位原有基因。
實驗3的圖與實驗1和實驗2相比好像也沒什麼差別,只是收斂速度好像快了那麼一點點。再來看看結果。
發現結果比實驗2的結果還要好?那說明了實驗2我得出的結論是可能是錯誤的,交叉率在該問題上對差分進化演算法的影響不大,它們結果的差異可能只是運氣的差異,畢竟是概率演算法。
實驗4:
將變異放縮因子設為0,即變異只與一個個體有關。
收斂速度依然很快,不過怎麼感覺結果不對,而且個體收斂的路徑好像遺傳演算法,當F=0,時,差分進化演算法退化為了沒有變異、選擇操作的遺傳演算法,結果一定不會太好。
果然如此。下面我們再看看F=2時的實驗。
實驗5:
將變異放縮因子設為2。
實驗5的圖可以明顯看出,群體的收斂速度要慢了許多,到第50代時,種群還未完全收斂於一點,那麼在50代時其結果也不會很好,畢竟演算法還未收斂就停止進化了。
結果不算很好但也算相對穩定。
通過上面5個實驗,我們大致了解了差分進化演算法的兩個參數的作用。
交叉率CR,影響基因取自變異基因的比例,由於至少要保留一位自己的基因和變異的基因導致CR在該問題上對演算法性能的影響不大(這個問題比較簡單,維度較低,影響不大)。
變異放縮因子F,影響群體的收斂速度,F越大收斂速度越慢,F絕對值越小收斂速度越快,當F=0是群體之間只會交換基因,不會變異基因。
差分進化演算法大魔王已經如此強大了,那麼還有什麼可以改進的呢?當然有下面一一道來。
方案1 .將3人行修改為5人行,以及推廣到2n+1人行。
實驗6:
將3人行修改為5人行,變異公式如下:
五人行的實驗圖看起來好像與之前並沒有太大的變化,我們再來看看結果。
結果沒有明顯提升,反而感覺比之前的結果差了。反思一下五人行的優缺點,優點,取值范圍更大,缺點,情況太多,減慢搜索速度。
可以看出演算法的收斂速度比之前的變慢了一點,再看看結果。
比之前差。
差分進化演算法的學習在此也告一段落。差分進化演算法很強大,也很簡單、簡潔,演算法的描述都充滿了美感,不愧是大魔王。不過這里並不是結束,這只是個開始,終將找到打敗大魔王的方法,讓新的魔王誕生。
由於差分進化演算法足夠強,而文中實驗的問題較為簡單導致演算法的改進甚至越改越差(其實我也不知道改的如何,需要大量實驗驗證)。在遙遠的將來,也會有更加復雜的問題來檢驗魔王的能力,總之,後會無期。
以下指標純屬個人yy,僅供參考
目錄
上一篇 優化演算法筆記(六)遺傳演算法
下一篇 優化演算法筆記(八)人工蜂群演算法
優化演算法matlab實現(七)差分進化演算法matlab實現