優(yōu)化算法筆記(七)差分進(jìn)化算法

1. 差分進(jìn)化算法簡介

(以下描述,均不是學(xué)術(shù)用語,僅供大家快樂的閱讀)
  差分進(jìn)化算法(Differential Evolution Algorithm,DE)是一種基于群體的進(jìn)化算法,它模擬了群體中的個(gè)體的合作與競爭的過程。算法原理簡單,控制參數(shù)少,只有交叉概率和縮放比例因子,魯棒性強(qiáng),易于實(shí)現(xiàn)。
  差分進(jìn)化算法中,每一個(gè)個(gè)體的基因表示待求問題的一個(gè)候選解。每次迭代將先進(jìn)行變異操作,選擇一個(gè)或多個(gè)個(gè)體的基因作為基,然后選擇不同的個(gè)體的差分來構(gòu)成差分基因,最后將作為基的基因與差分基因相加來得出新的個(gè)體。交叉操作將新的個(gè)體將于父代的對應(yīng)個(gè)體交叉,然后進(jìn)行選擇操作,比較交叉后的個(gè)體與父代的對應(yīng)個(gè)體,選擇較優(yōu)的個(gè)體保留至下一代。在迭代完成之后將選擇種群中最優(yōu)個(gè)體的基因作為解。
  差分進(jìn)化算法可以算是我所使用過的優(yōu)化算法中大魔王級別的算法,雖然它每個(gè)方面都沒有強(qiáng)到離譜,但是綜合起來的效果好于大多數(shù)算法。它就像一個(gè)每個(gè)科目都能考到90分(百分制)的學(xué)生,雖然沒門課都不是最優(yōu)秀的,但是論綜合,論總分,它有極大的概率是第一名。


(兩位(正經(jīng))魔王,一位宇宙帝王,一位蟻王,蟻王更符合差分進(jìn)化算法,因?yàn)樗梢圆粩嗟耐淌称渌麄€(gè)體并吸收他們的能力從而不斷變強(qiáng),是不是和優(yōu)化算法很像?富堅(jiān)老賊還是狠)

  在我研究優(yōu)化算法的小路上,我的目標(biāo)就是找到一個(gè)能打敗大魔王或是能在大多數(shù)方面壓制魔王的算法。

2. 算法流程

這次的主角就選魔王軍吧(或者蟻王軍,為了與蟻群算法區(qū)別還是叫魔王軍吧),個(gè)體則稱之為魔王兵。
  魔王兵的能力取決于它們的基因,它們可以根據(jù)環(huán)境或者需要改變自己的基因使得自己更加強(qiáng)大,更方便的處理問題,問題的維度與基因維度相同。
     X_i^t=(x_{i,1}^t,x_{i,2}^t,...,x_{i,D}^t)
  表示第i個(gè)魔王兵在進(jìn)化了第t次后的基因,該個(gè)體有D位基因。
與遺傳算法同為進(jìn)化算法的差分進(jìn)化算法,它們的操作(算子)也都非常相似的,都是交叉,變異和選擇,流程也幾乎一樣(遺傳算法先交叉后變異,差分進(jìn)化算法先變異后交叉)。

2.1變異

說到差分進(jìn)化算法中的變異,我就想到一句論語“三人行,必有我?guī)熝伞衿渖普叨鴱闹洳簧普叨闹!?/strong>,其實(shí)這句論語已經(jīng)向我們說明了差分進(jìn)化算法的整個(gè)流程:
  “三人行,必有我?guī)熝伞薄儺悾徊妗?br>   “擇其善者而從之,其不善者而改之”——選擇。
  差分進(jìn)化算法中,當(dāng)一個(gè)魔王兵變異時(shí),它會(huì)先找來3個(gè)小伙伴,當(dāng)然是隨機(jī)找來3個(gè)小伙伴,避免同化。在一個(gè)小伙伴的基因上加上另外兩個(gè)小伙伴基因之差作為自己的目標(biāo)基因。其變異公式如下:
      U_i=X_{r1}+F(X_{r2}-X_{r3}),i\ne r1\ne r2\ne r3
  表示第i個(gè)魔王兵找到了編號為r1、r2和r3的三個(gè)魔王兵,當(dāng)然了i、r1、r2、r3為互不相同的整數(shù),F(xiàn)為縮放比例因子,通常 ,一般取F=0.5。U_i為第i個(gè)魔王兵交叉后的目標(biāo)基因圖紙,不過這是個(gè)半成品,再經(jīng)過交叉后,目標(biāo)基因圖紙才算完成。
  其實(shí)現(xiàn)在我們已經(jīng)有了5個(gè)基因圖紙了U_i,X_i,X_{r1},X_{r2},X_{r3},接下來將進(jìn)行交叉操作。由于變異操作,差分進(jìn)化算法的種群中個(gè)體數(shù)至少為4,即魔王軍中至少有4個(gè)小兵。

2.2交叉

交叉操作中,魔王兵i會(huì)將目標(biāo)基因圖紙 U_i^t=(u_{i,1}^t,u_{i,2}^t,...,u_{i,D}^t)進(jìn)行加工得到 V_i^t=(v_{i,1}^t,v_{i,2}^t,...,v_{i,D}^t),加工過程如下:
v_{i,d}=\begin{cases} u_{i,d},rand(0,1)<CR \ \ or\ \ d = d_{rand} \\ x_{i,d},rand(0,1) else \end{cases}
  其中 。 為交叉概率,其值越大,發(fā)生交叉的概率越大,一般取 。 d_{rand}為{1,2,…,D}中的隨機(jī)整數(shù),其作用是保證交叉操作中至少有一維基因來自變異操作產(chǎn)生的基因,不能讓交叉操作的努力白費(fèi)。
  從公式上可以看出交叉操作實(shí)際上是從變異操作得出的基因圖紙上選擇至少一位基因來替換自己的等位基因,得到最終的基因圖紙。

2.3選擇

選擇操作相對簡單,魔王兵i拿到了最終的基因圖紙 V_i^t=(v_{i,1}^t,v_{i,2}^t,...,v_{i,D}^t),大喊一聲,進(jìn)化吧,魔王兵i的基因改變了。它拿出了能力測量器fitness function,如果發(fā)現(xiàn)自己變強(qiáng)了,那么就將基因 保留到下一代,否則它選擇放棄進(jìn)化,讓自己還原成 X_i^t=(x_{i,1}^t,x_{i,2}^t,...,x_{i,D}^t)

3. 實(shí)驗(yàn)初步

實(shí)驗(yàn)又來啦,還是那個(gè)實(shí)驗(yàn)f(x_1,x_2)=(x_1-a)^2+(x_2-b)^2,簡單、易算、好畫圖。
  實(shí)驗(yàn)1:參數(shù)如下

參數(shù)
問題維度(維度) 2
小兵數(shù)量(種群數(shù)) 20
進(jìn)化次數(shù)(最大迭代次數(shù)) 50
CR(交叉率) 0.3
F(放縮因子) 0.5
取值范圍 (-100,100)
實(shí)驗(yàn)次數(shù) 10

  圖中可以看出在第20代時(shí),群體已經(jīng)非常集中了,在來看看最終得出的結(jié)果。

最優(yōu)值 1.0917867028293985E-8
最差值 2.9361020954274757E-6
平均值 5.847453820715603E-7

這結(jié)果真是好到令人發(fā)指,惡魔在心中低語“把其他的優(yōu)化算法都丟掉吧”。不過別往心里去,任何算法都有優(yōu)缺點(diǎn),天下沒有免費(fèi)的午餐,要想獲得某種能力必須付出至少相應(yīng)的代價(jià)。
實(shí)驗(yàn)2:
將交叉率CR設(shè)為0,即每次交叉只選擇保留一位變異基因。

參數(shù)
問題維度(維度) 2
小兵數(shù)量(種群數(shù)) 20
進(jìn)化次數(shù)(最大迭代次數(shù)) 50
CR(交叉率) 0.0
F(放縮因子) 0.5
取值范圍 (-100,100)
實(shí)驗(yàn)次數(shù) 10

看看了看圖,感覺跟實(shí)驗(yàn)1中相比沒有什么變化,那我們再來看看結(jié)果。

最優(yōu)值 2.922699066690564E-10
最差值 1.5170095944418442E-7
平均值 1.9533094363773728E-8

結(jié)果總體來說比實(shí)驗(yàn)1好了一個(gè)數(shù)量級。為什么呢?個(gè)人感覺應(yīng)該是每次只改變一位基因的局部搜索能力比改變多位基因更強(qiáng)。下面我們將交叉率CR設(shè)為1來看看是否是這樣。
  實(shí)驗(yàn)3:
  將交叉率CR設(shè)為1,即每次交叉只選擇保留一位原有基因。

參數(shù)
問題維度(維度) 2
小兵數(shù)量(種群數(shù)) 20
進(jìn)化次數(shù)(最大迭代次數(shù)) 50
CR(交叉率) 1.0
F(放縮因子) 0.5
取值范圍 (-100,100)
實(shí)驗(yàn)次數(shù) 10

實(shí)驗(yàn)3的圖與實(shí)驗(yàn)1和實(shí)驗(yàn)2相比好像也沒什么差別,只是收斂速度好像快了那么一點(diǎn)點(diǎn)。再來看看結(jié)果。

最優(yōu)值 1.247729854010192E-10
最差值 2.3424955950460443E-8
平均值 4.089766498652818E-9

發(fā)現(xiàn)結(jié)果比實(shí)驗(yàn)2的結(jié)果還要好?那說明了實(shí)驗(yàn)2我得出的結(jié)論是可能是錯(cuò)誤的,交叉率在該問題上對差分進(jìn)化算法的影響不大,它們結(jié)果的差異可能只是運(yùn)氣的差異,畢竟是概率算法。
  實(shí)驗(yàn)4:
  將變異放縮因子設(shè)為0,即變異只與一個(gè)個(gè)體有關(guān)。

參數(shù)
問題維度(維度) 2
小兵數(shù)量(種群數(shù)) 20
進(jìn)化次數(shù)(最大迭代次數(shù)) 50
CR(交叉率) 0.3
F(放縮因子) 0.0
取值范圍 (-100,100)
實(shí)驗(yàn)次數(shù) 10

收斂速度依然很快,不過怎么感覺結(jié)果不對,而且個(gè)體收斂的路徑好像遺傳算法,當(dāng)F=0,時(shí),差分進(jìn)化算法退化為了沒有變異、選擇操作的遺傳算法,結(jié)果一定不會(huì)太好。

最優(yōu)值 0.453120676982517
最差值 286.3408283178992
平均值 106.1719276191775

果然如此。下面我們再看看F=2時(shí)的實(shí)驗(yàn)。
  實(shí)驗(yàn)5:
  將變異放縮因子設(shè)為2。

參數(shù)
問題維度(維度) 2
小兵數(shù)量(種群數(shù)) 20
進(jìn)化次數(shù)(最大迭代次數(shù)) 50
CR(交叉率) 0.3
F(放縮因子) 2.0
取值范圍 (-100,100)
實(shí)驗(yàn)次數(shù) 10

實(shí)驗(yàn)5的圖可以明顯看出,群體的收斂速度要慢了許多,到第50代時(shí),種群還未完全收斂于一點(diǎn),那么在50代時(shí)其結(jié)果也不會(huì)很好,畢竟算法還未收斂就停止進(jìn)化了。

參數(shù)
最優(yōu)值 0.003982238947037151
最差值 1.1517176365886543
平均值 0.23692008026134745

結(jié)果不算很好但也算相對穩(wěn)定。

通過上面5個(gè)實(shí)驗(yàn),我們大致了解了差分進(jìn)化算法的兩個(gè)參數(shù)的作用。
  交叉率CR,影響基因取自變異基因的比例,由于至少要保留一位自己的基因和變異的基因?qū)е翪R在該問題上對算法性能的影響不大(這個(gè)問題比較簡單,維度較低,影響不大)。
  變異放縮因子F,影響群體的收斂速度,F(xiàn)越大收斂速度越慢,F(xiàn)絕對值越小收斂速度越快,當(dāng)F=0是群體之間只會(huì)交換基因,不會(huì)變異基因。

4. 探究與改進(jìn)

差分進(jìn)化算法大魔王已經(jīng)如此強(qiáng)大了,那么還有什么可以改進(jìn)的呢?當(dāng)然有下面一一道來。
  方案1.將3人行修改為5人行,以及推廣到2n+1人行。
  實(shí)驗(yàn)6:
  將3人行修改為5人行,變異公式如下:
  U_i=X_{r1}+F_1(X_{r2}-X_{r3})+F_2(X_{r4}-X_{r5})

參數(shù)
問題維度(維度) 2
小兵數(shù)量(種群數(shù)) 20
進(jìn)化次數(shù)(最大迭代次數(shù)) 50
CR(交叉率) 0.3
F1(放縮因子) 0.5
F2(放縮因子) 0.5
取值范圍 (-100,100)
實(shí)驗(yàn)次數(shù) 10

五人行的實(shí)驗(yàn)圖看起來好像與之前并沒有太大的變化,我們再來看看結(jié)果。

參數(shù)
最優(yōu)值 1.7892717650452213E-8
最差值 4.573249741855863E-6
平均值 1.0415260793972972E-6

結(jié)果沒有明顯提升,反而感覺比之前的結(jié)果差了。反思一下五人行的優(yōu)缺點(diǎn),優(yōu)點(diǎn),取值范圍更大,缺點(diǎn),情況太多,減慢搜索速度。


  上圖為U_i=X_A+F(X_C-X_B)(這里的公式不顯示?)的情況,其中ABCD為平行四邊形AD=DE,U可以取到AE上的任一點(diǎn)。

  上圖為 U_i=X_A+F_1(X_C-X_B)+F_2(X_G-X_F)(這里的公式不顯示?)的情況,其中ABCD為平行四邊形AD=DE,AFGH為平行四邊形,AIJE為平行四邊形,AH=HI, U可以取到平行四邊形AIJE上的任一點(diǎn)。
  對于交叉操作來所,“五人行”的選擇更多,搜索能力應(yīng)該更強(qiáng),但這個(gè)問題的適應(yīng)度函數(shù)過于簡單,可能無法發(fā)揮其優(yōu)勢,所以此時(shí)“五人行”的結(jié)果差于“三人行”的結(jié)果。
  方案2,變異放縮因子隨機(jī)化
  第3節(jié)中我們可以明顯看出變異放縮因子F對差分進(jìn)化算法的影響明顯大于交叉率CR,F能影響算法的收斂速度。注意到差分進(jìn)化算法沒有跳出局部最優(yōu)的操作,如果算法收斂太快容易陷入局部最優(yōu),而收斂太慢又會(huì)影響求解速度。因此我向隨機(jī)化F來均衡一下算法的收斂速度。
  實(shí)驗(yàn)7:
  F取值為(0,2)內(nèi)的隨機(jī)數(shù)。

參數(shù)
問題維度(維度) 2
小兵數(shù)量(種群數(shù)) 20
進(jìn)化次數(shù)(最大迭代次數(shù)) 50
CR(交叉率) 0.3
F(放縮因子) (0,2)
取值范圍 (-100,100)
實(shí)驗(yàn)次數(shù) 10

可以看出算法的收斂速度比之前的變慢了一點(diǎn),再看看結(jié)果。

參數(shù)
最優(yōu)值 1.002461804484959E-8
最差值 1.5000010808013516E-4
平均值 2.5148494598068475E-5

比之前差。


  探究過程中失敗是難免的,F(xiàn)為(0,2)內(nèi)的隨機(jī)數(shù),那么F的期望為1,其收斂速度變慢導(dǎo)致結(jié)果變差也是難免,畢竟最大迭代次數(shù)只有50,而且適應(yīng)度函數(shù)過于簡單。
  方案3:為差分進(jìn)化算法新增跳出局部最優(yōu)的操作。
  這個(gè)方案沒有試驗(yàn),差分進(jìn)化算法是否需要該操作還是未知數(shù)?差分進(jìn)化算法有著優(yōu)秀的搜索能力,那么跳出局部最優(yōu)能力是否需要呢?一個(gè)攻擊能力超強(qiáng)的戰(zhàn)士是否需要加強(qiáng)防御能力呢?
  其實(shí)我認(rèn)為還是必要的,因?yàn)楝F(xiàn)在我們需要用優(yōu)化算法去解決的實(shí)際問題大多是動(dòng)態(tài)的而不是實(shí)驗(yàn)中的靜態(tài)還是,在處理動(dòng)態(tài)問題時(shí),一點(diǎn)跳出局部最優(yōu)能力能夠讓優(yōu)化算法快速做出反應(yīng)而不是再緩慢的進(jìn)化。只是如何給差分進(jìn)化算法優(yōu)雅的添加跳出局部最優(yōu)性能的方案還沒有想到。

5. 總結(jié)

差分進(jìn)化算法的學(xué)習(xí)在此也告一段落。差分進(jìn)化算法很強(qiáng)大,也很簡單、簡潔,算法的描述都充滿了美感,不愧是大魔王。不過這里并不是結(jié)束,這只是個(gè)開始,終將找到打敗大魔王的方法,讓新的魔王誕生。
  由于差分進(jìn)化算法足夠強(qiáng),而文中實(shí)驗(yàn)的問題較為簡單導(dǎo)致算法的改進(jìn)甚至越改越差(其實(shí)我也不知道改的如何,需要大量實(shí)驗(yàn)驗(yàn)證)。在遙遠(yuǎn)的將來,也會(huì)有更加復(fù)雜的問題來檢驗(yàn)?zāi)醯哪芰Γ傊髸?huì)無期。
  以下指標(biāo)純屬個(gè)人yy,僅供參考

指標(biāo) 星數(shù)
復(fù)雜度 ★★★☆☆☆☆☆☆☆
收斂速度 ★★★★★★★★☆☆
全局搜索 ★★★★★★★★☆☆
局部搜索 ★★★★★★★★☆☆
優(yōu)化性能 ★★★★★★★★☆☆
跳出局部最優(yōu) ☆☆☆☆☆☆☆☆☆☆
改進(jìn)點(diǎn) ★★☆☆☆☆☆☆☆☆

目錄
上一篇 優(yōu)化算法筆記(六)遺傳算法
下一篇 優(yōu)化算法筆記(八)人工蜂群算法

優(yōu)化算法matlab實(shí)現(xiàn)(七)差分進(jìn)化算法matlab實(shí)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

推薦閱讀更多精彩內(nèi)容