『壹』 怎麼知道鯨魚演算法是否適用該問題
運行程序觀察其結果可知是否適用。
鯨魚優化演算法是2016年由澳大利亞格里菲斯大學的Mirjalili 等提出的一種新的群體智能優化演算法,其優點在於操作簡單,調整的參數少以及跳出局部最優的能力強。
鯨魚演算法設計的既精妙又富有特色,它源於對自然界中座頭鯨群體狩獵行為的模擬, 通過鯨魚群體搜索、包圍、追捕和攻擊獵物等過程實現優時化搜索的目的。在原始的WOA中,提供了包圍獵物,螺旋氣泡、尋找獵物的數學模型。
『貳』 優化演算法筆記(十三)鯨魚演算法
(以下描述,均不是學術用語,僅供大家快樂的閱讀)
鯨魚演算法(Whale Optimization Algorithm)是根據鯨魚圍捕獵物的行為而提出的演算法。鯨魚是一種群居的哺乳動物,在捕獵時它們也會相互合作對獵物進行驅趕和圍捕。鯨魚演算法提出時間並不長,也是一個新興的優化演算法,研究應用案例不多。
鯨魚演算法中,每個鯨魚的位置代表了一個可行解。在鯨魚群捕獵過程中,每隻鯨魚有兩種行為,一種是包圍獵物,所有的鯨魚都向著其他鯨魚前進;另一種是汽包網,鯨魚環形游動噴出氣泡來驅趕獵物。在每一代的游動中,鯨魚們會隨機選擇這兩種行為來進行捕獵。在鯨魚進行包圍獵物的行為中,鯨魚將會隨機選擇是向著最優位置的鯨魚游去還是隨機選擇一隻鯨魚作為自己的目標,並向其靠近。
鯨魚演算法,顯而易見,主角就是鯨魚了。
在D維解空間內每個鯨魚的位置為
每隻鯨魚隨機選擇進行包圍獵物或者是使用汽泡網驅趕獵物,每隻鯨魚選擇這兩種行為的該率是等的,即P(包圍)=P(汽泡網)=0.5。
鯨魚在包圍獵物時會選擇向著最優位置的鯨魚游動或者向著一隻隨機鯨魚游動。
該鯨魚的位置更新公式入下:
其中 為當前最優的鯨魚的位置,A的每一維為均勻分布在(-a,a)內的隨機數,a的初始值為2,隨著迭代次數線性遞減至0;C為均勻分布在(0,2)內的隨機數。||表示數的絕對值,即 每一維的值都是非負數。
該鯨魚的位置更新公式入下:
其中 為當前群體中隨機選擇的鯨魚的位置。
那麼鯨魚在什麼時候選擇向最優個體游動,什麼時候選擇隨機個體為目標呢?
這個將由A的值決定
當 時,鯨魚選擇向著最優個體游動。注意A是一個D維的向量,所以是A的模小於1時,鯨魚向著最優個體游動。
當 時,鯨魚選擇向著隨機個體游動。
可以看出在包圍獵物的過程中,鯨魚演算法的搜索模式為在距最優個體較近的周圍搜索或者在距隨機個體較遠的附近搜索。
2.2氣泡網
鯨魚在捕獵時會噴出汽包形成氣泡網來驅趕獵物。
其中b為常數(沒找到定義,默認取1),l為均勻分布在[-1,1]內的隨機數。
每次行動之前,每隻鯨魚都會拋個硬幣,來決定是選擇包圍獵物還是使用氣泡網來驅趕獵物。
從上面的描述可以看出,鯨魚演算法的流程也十分的簡單。
適應度函數
實驗一 :標准鯨魚演算法
從圖上可以看出演算法的收斂性還是很強的,在第35代左右就已經完全收斂。再看最後的結果,已經是非常好的結果了,同樣也說明的演算法的局部搜索能力很強。這樣印證了上一節我的說法,演算法收斂速度快,缺少跳出局部最優的能力。
從演算法的流程我們可以看出,演算法的收斂性大概是由參數a來決定的,由於a從2遞減為0,使演算法的搜索范圍越來越小,從而加速演算法的收斂。這應該是一個優化後的參數,現在我們固定住a,來弱化演算法,減弱其收斂性,看看全局搜索和跳出局部最優能力是否有所加強。
實驗二 :固定參數a
從圖像可以看出,演算法幾乎沒有收斂的了,演算法的收斂速度依舊很快。
看看實驗結果。
結果比標准鯨魚演算法差,能說明參數a影響了演算法的搜索精度,參數a對演算法收斂性的影響在於a對向量A的影響。固定a=1.5時使A的模較之前相比有更大的概率大於1,此時鯨魚們在包圍獵物的行為中選擇游向最優個體的概率更小,從而使演算法的收斂速度更慢,同時演算法的全局搜索能力有一定的提升。
鯨魚演算法作為一個新興演算法,我對它的研究也不是太多。縱觀演算法的流程,可以看出標準的鯨魚演算法和螢火蟲演算法有相似之處,它們都是在演算法前期進行全局搜索,而在演算法的後期進行局部搜索,也都沒有跳出局部最優的操作。在面對簡單問題上表現出的優秀性能到了復雜問題上可能會有所下降,但是由於演算法流程、結構相對簡單,演算法的改進點感覺也不是太多。
以下指標純屬個人yy,僅供參考
參考文獻
Mirjalili S, Lewis A. The Whale Optimization Algorithm[J]. Advances in Engineering Software, 2016, 95:51-67. 提取碼:b13x
目錄
上一篇優化演算法筆記(十二)煙花演算法
下一篇 優化演算法筆記(十四)水波演算法
優化演算法matlab實現(十三)鯨魚演算法matlab實現
『叄』 優化演算法筆記(二)優化演算法的分類
(以下描述,均不是學術用語,僅供大家快樂的閱讀)
在分類之前,我們先列舉一下常見的優化演算法(不然我們拿什麼分類呢?)。
1遺傳演算法Genetic algorithm
2粒子群優化演算法Particle Swarm Optimization
3差分進化演算法Differential Evolution
4人工蜂群演算法Artificial Bee Colony
5蟻群演算法Ant Colony Optimization
6人工魚群演算法Artificial Fish Swarm Algorithm
7杜鵑搜索演算法Cuckoo Search
8螢火蟲演算法Firefly Algorithm
9灰狼演算法Grey Wolf Optimizer
10鯨魚演算法Whale Optimization Algorithm
11群搜索演算法Group search optimizer
12混合蛙跳演算法Shuffled Frog Leaping Algorithm
13煙花演算法fireworks algorithm
14菌群優化演算法Bacterial Foraging Optimization
以上優化演算法是我所接觸過的演算法,沒接觸過的演算法不能隨便下結論,知之為知之,不知為不知。其實到目前為止優化演算法可能已經有幾百種了,我們不可能也不需要全面的了解所有的演算法,而且優化演算法之間也有較大的共性,深入研究幾個之後再看其他優化演算法上手速度會灰常的快。
優化演算法從提出到現在不過50-60年(遺傳演算法1975年提出),雖種類繁多但大多較為相似,不過這也很正常,比較香蕉和人的基因相似度也有50%-60%。當然演算法之間的相似度要比香蕉和人的相似度更大,畢竟人家都是優化演算法,有著相同的目標,只是實現方式不同。就像條條大路通羅馬,我們可以走去,可以坐汽車去,可以坐火車去,也可以坐飛機去,不管使用何種方式,我們都在去往羅馬的路上,也不會說坐飛機去要比走去更好,交通工具只是一個工具,最終的方案還是要看我們的選擇。
上面列舉了一些常見的演算法,即使你一個都沒見過也沒關系,後面會對它們進行詳細的介紹,但是對後面的分類可能會有些許影響,不過問題不大,就先當總結看了。
再對優化演算法分類之前,先介紹一下演算法的模型,在筆記(一)中繪制了優化演算法的流程,不過那是個較為簡單的模型,此處的模型會更加復雜。上面說了優化演算法有較大的相似性,這些相似性主要體現在演算法的運行流程中。
優化演算法的求解過程可以看做是一個群體的生存過程。
有一群原始人,他們要在野外中尋找食物,一個原始人是這個群體中的最小單元,他們的最終目標是尋找這個環境中最容易獲取食物的位置,即最易存活下來的位置。每個原始人都去獨自尋找食物,他們每個人每天獲取食物的策略只有採集果實、製作陷阱或者守株待兔,即在一天之中他們不會改變他們的位置。在下一天他們會根據自己的策略變更自己的位置。到了某一天他們又聚在了一起,選擇了他們到過的最容易獲取食物的位置定居。
一群原始人=優化演算法中的種群、群體;
一個原始人=優化演算法中的個體;
一個原始人的位置=優化演算法中個體的位置、基因等屬性;
原始人變更位置=優化演算法中總群的更新操作;
該位置獲取食物的難易程度=優化演算法中的適應度函數;
一天=優化演算法中的一個迭代;
這群原始人最終的定居位置=優化演算法所得的解。
優化演算法的流程圖如下:
對優化演算法分類得有個標准,按照不同的標准分類也會得到不一樣的結果。首先說一下我所使用的分類標准(動態更新,有了新的感悟再加):
按由來分類比較好理解,就是該演算法受何種現象啟發而發明,本質是對現象分類。
可以看出演算法根據由來可以大致分為有人類的理論創造而來,向生物學習而來,受物理現象啟發。其中向生物學習而來的演算法最多,其他類別由於舉例有偏差,不是很准確,而且物理現象也經過人類總結,有些與人類現象相交叉,但仍將其獨立出來。
類別分好了,那麼為什麼要這么分類呢?
當然是因為要湊字數啦,啊呸,當然是為了更好的理解學習這些演算法的原理及特點。
向動物生存學習而來的演算法一定是一種行之有效的方法,能夠保證演算法的效率和准確性,因為,如果使用該策略的動物無法存活到我們可以對其進行研究,我們也無法得知其生存策略。(而這也是一種倖存者偏差,我們只能看到行之有效的策略,但並不是我們沒看到的策略都是垃圾,畢竟也發生過小行星撞地球這種小概率毀滅性事件。講個冷笑話開cou心一shu下:一隻小恐龍對他的小夥伴說,好開心,我最喜歡的那顆星星越來越亮了(完)。)但是由於生物的局限性,人們所創造出的演算法也會有局限性:我們所熟知的生物都生存在三維空間,在這些環境中,影響生物生存的條件比較有限,反應到演算法中就是這些演算法在解決較低維度的問題時效果很好,當遇到超高維(維度>500)問題時,結果可能不容樂觀,沒做過實驗,我也不敢亂說。
按更新過程分類相對復雜一點,主要是根據優化演算法流程中更新位置操作的方式來進行分類。更新位置的操作按我的理解可大致分為兩類:1.跟隨最優解;2.不跟隨最優解。
還是上面原始人的例子,每天他有一次去往其他位置狩獵的機會,他們採用何種方式來決定今天自己應該去哪裡呢?
如果他們的策略是「跟隨最優解」,那麼他們選取位置的方式就是按一定的策略向群體已知的最佳狩獵位置(歷史最佳)或者是當前群體中的最佳狩獵位置(今天最佳)靠近,至於是直線跑過去還是蛇皮走位繞過去,這個要看他們群體的策略。當然,他們的目的不是在最佳狩獵位置集合,他們的目的是在過去的途中看是否能發現更加好的狩獵位置,去往已經到過的狩獵地點再次狩獵是沒有意義的,因為每個位置獲取食物的難易程度是固定的。有了目標,大家都會朝著目標前進,總有一日,大家會在謀個位置附近相聚,相聚雖好但不利於後續的覓食容易陷入局部最優。
什麼是局部最優呢?假設在當前環境中有一「桃花源」,擁有上帝視角的我們知道這個地方就是最適合原始人們生存的,但是此地入口隱蔽「山有小口,彷彿若有光」、「初極狹,才通人。」,是一個難以發現的地方。如果沒有任何一個原始人到達了這里,大家向著已知的最優位置靠近時,也難以發現這個「桃源之地」,而當大家越聚越攏之後,「桃源」被發現的可能性越來越低。雖然原始人們得到了他們的解,但這並不是我們所求的「桃源」,他們聚集之後失去了尋求「桃源」的可能,這群原始人便陷入了局部最優。
如果他們的策略是「不跟隨最優解」,那麼他們的策略是什麼呢?我也不知道,這個應該他們自己決定。畢竟「是什麼」比「不是什麼」的范圍要小的多。總之不跟隨最優解時,演算法會有自己特定的步驟來更新個體的位置,有可能是隨機在自己附近找,也有可能是隨機向別人學習。不跟隨最優解時,原始人們應該不會快速聚集到某一處,這樣一來他們的選擇更具多樣性。
按照更新過程對上面的演算法分類結果如下
可以看出上面不跟隨最優解的演算法只有遺傳演算法和差分進化演算法,他們的更新策略是與進化和基因的重組有關。因此這些不跟隨最優解的演算法,他們大多依據進化理論更新位置(基因)我把他們叫做進化演算法,而那些跟隨群體最優解的演算法,他們則大多依賴群體的配合協作,我把這些演算法叫做群智能演算法。
目前我只總結了這兩種,分類方法,如果你有更加優秀的分類方法,我們可以交流一下:
目錄
上一篇 優化演算法筆記(一)優化演算法的介紹
下一篇 優化演算法筆記(三)粒子群演算法(1)
『肆』 優化演算法筆記(十二)煙花演算法
(以下描述,均不是學術用語,僅供大家快樂的閱讀)
煙花演算法(Firework Algorithm,FWA)是一種受煙花爆炸產生火星,並繼續分裂爆炸這一過程啟發而得出的演算法。演算法的思想簡單,但具體實現復雜。演算法提出時間並不長,但是已經有了不少的改進研究和較為全面的應用。
煙花演算法中,每一個煙花的位置都代表了一個可行解。煙花的爆炸產生的火星有兩種,正常的火星與特別的火星。每個火星都會爆炸產生數個正常火星,某些火星有一定的概率產生一個特別的火星。正常的火星根據當前火星的振幅隨機均勻分布在該火星的周圍,而特別的火星將在當前火星附近以正態分布方式產生。每次迭代產生的火星數量多於每一代應有的火星數,演算法將參照火星位置的優劣,隨機留下指定數量的火星,已保持火星數目的穩定。
煙花演算法的主角毫無疑問就是煙花了。
式(1)為適應度值越小越優的情況,而式(2)則是適應度值越大越優的情況。 為一個極小的值,以保證分母不為0。
每個火星產生的正常火星數量也由其適應度值來決定。
其中 表示第i個火星將要產生的正常火星數, 是產生正常火星的總數為一個常數,從式(3),(4)可以看出適應度值越好的火星能夠產生更多的正常火星,反之,火星適應度越差,能夠產生的火星數越少。
由於式(3),(4)計算出的值為小數,煙花演算法中使用式(5)將其轉化為整數。
從式(3)和式(4)中可以看出,在每一代中將會產生出 個正常火星。產生的正常火星的位置與當前火星的振幅有關,可以從式(1),(2)看出,適應度越優的火星的振幅越小,那麼它產生的正常火星將在它自己周圍,而適應度越差的火星的振幅越大,它產生的正常火星將會出現在離自己較遠的位置。
當前火星每次爆炸會從D維搜索空間內隨機選擇z維進行更新從而產生新的火星。正常火星的位置由如下公式產生。
其中z為取值1-D的均勻隨機正整數,rand(-1,1)表示-1到1內的均勻隨機數。從式(6)中可以看出,正常火星的位置與其振幅有直接關系,振幅越大產生的新火星距當前火星的距離約遠。
每次迭代過程中,會產生m個特別的火星,即在這N個火星中隨機選擇m個火星,每個火星產生一個特別的火星。特別的火星的由下面的公式產生:
由上面的過程可知,在每一代中,有N個火星,將會產生出 個正常火星以及m個特別的火星。但是每一代中只能從這 個火星中選擇N個火星保留至下一代。
每次會先從 個火星中選擇最優的火星保留至下一代,然後再從中選擇N-1個火星。選擇某個火星的概率如下:
其中R(X)表示該火星距其他所有火星的距離之和,即距其它火星越遠的火星,被選擇保留至下一代的概率較大。
個火星,而且
,所有煙花演算法每次迭代的計算復雜度要大於其他演算法,這簡直就是一個作弊行為。別的演算法每次只搜索了N個位置,而煙花演算法卻搜索了 個位置。與其他優化演算法對比時,其他演算法的種群數量應該取 ,否則這將是一場不公正的對決。
適應度函數還是這個簡單的小白鼠
實驗一 :標准煙花演算法
以上數據來自原論文,現在看一看實驗的圖像以及實驗結果。
從圖像可以看出每次只選擇保留了5個火星,它們的收斂速度很慢,實驗結束時距離目標點還有一段距離。
看看實驗結果
從實驗結果可以看出,演算法的性能很不穩定,而造成這一點的原因很可能是其收斂速度較慢,演算法仍在收斂過程中,所以結果看上去很差。將最大迭代次數修改為100代,重新試驗,其結果如下:
結果好了一些但還是難以接受,為什麼煙花演算法的結果不理想呢?
原因可能是保留機制(2.3節)的問題,煙花演算法中保留火星的概率是根據該火星與其他火星的距離和,距離群體越大的個體被保留下的概率越大。這樣做有什麼好處呢?好處是火星相對分散,這是一個對抗局部最優的策略,但是,距離群體較遠的個體是一個較差的個體的概率非常大,壞處就是,集中於當前最優位置的火星被保留的概率較小,演算法的局部搜索能力將較弱。
實驗二 . 隨機選擇的方式保留火星
為了加快煙花演算法的收斂速度,增強局部搜索能力,我移除了標准煙花演算法的選擇過程,使用隨機選擇的方式保留火星,當然,最優個體依然會被保留至下一代。其他參數保持不變。
可以看出這次的圖像相比實驗一收斂速度快了不少,在迭代結束時已經相對在一個較小的區域。這次的結果也明顯優於實驗一。將選擇過程改為隨機選擇後,由於較優的火星產生的較多且分布在自己周圍,因此選擇到這些較優的火星的概率也相對較大,演算法的收斂速度相對較快。與此同時,演算法跳出局部最優的能力比修改前要弱。
對於較簡單的問題來說當然是隨機選擇收斂較快結果較好,而復雜的問題則需要更強的跳出局部最優能力。問題的關鍵仍然是,我們無法在一開始就知道問題的復雜程度。
實驗三 .增加火星的種群數量,減少每代產生的正常火星總數
為什麼要減少產生的正常火星數,這樣演算法搜索的次數減少了,效果不會更差嗎?其實與直覺相反,減少正常火星總數,增加火星總群數,實際上是讓較優的火星產生的正常火星被保留下來的概率變大了,這樣也可以解決實驗一中的問題,加快演算法的收斂速度。
從圖像中可以看出,演算法在50代之前已經收斂,但是之後只在小范圍內進行搜索。實驗圖像與之前的描述相符,收斂速度加快但是跳出局部最優能力減弱。看看實驗結果,實驗結果好了不少且結果更加穩定。
其實實驗二與實驗三,使用了不同的策略,但都達到了同樣的目的——保留更多的優質火星到下一代,它們促進了局部搜索但是擠佔了較劣火星的位置,削弱了種群的多樣性。
每代留下的火星多了,圖像看上去是不是更像煙花?
煙花演算法的探究遠不止如此,幾年前作為一個較新的演算法來學習時卻已經有了大量的論文和書籍,可見大家對煙花演算法已經有了較為深入的研究,而我能做的只是應用演算法解決問題以及稍作改進讓演算法與問題的適應性更高。
煙花演算法產生正常火星的過程為演算法提供了搜索能力,產生特殊火星的過程和選擇過程為演算法提供了跳出局部最優的能力。但是個人認為選擇過程與其他過程的適應性不是很好。標準的選擇過程會丟失掉許多較優的個體,使之前產生的正常火星得到的成果沒有保留。
煙花演算法其實還有比較多的改進點,對演算法產生最大的參數應該就是正常火星的總數以及振幅了。簡單粗暴的改進:在每一代可以對這兩個參數進行變化或者隨機化,讓演算法的搜索能力與跳出局部最優能力在整個流程中動態變化,以均衡兩種能力。
以下指標純屬個人yy,僅供參考
參考文獻
Tan Y , Zhu Y . Fireworks Algorithm for Optimization[C]// Advances in Swarm Intelligence, First International Conference, ICSI 2010, Beijing, China, June 12-15, 2010, Proceedings, Part I. Springer-Verlag, 2010. 提取碼:yaj0
目錄
上一篇 優化演算法筆記(十一)群搜索演算法
下一篇 優化演算法筆記(十三)鯨魚演算法
優化演算法matlab實現(十二)煙花演算法matlab實現
『伍』 鯨魚優化演算法為什麼每次都不一樣
排查一下數據是否有失誤。
正常情況下 數據一樣的,演算法的結果也是一樣的。鯨魚演算法提出時間並不長,也是一個新興的優化演算法,只能多琢磨琢磨。