進化演算法優化演算法-ag真人国际官网
㈠ 進化演算法入門讀書筆記(一)
這里我參考學習的書籍是:
《進化計算的理論和方法》,王宇平,科學出版社
《進化優化演算法:基於仿生和種群的計算機智能方法》,[美]丹·西蒙,清華大學出版社。
進化演算法是 求解優化問題 的一種演算法,它是 模仿生物進化與遺傳原理 而設計的一類隨機搜索的優化演算法。
不同的作者稱進化演算法有不同的術語,以下。註:這里僅列舉出了我自己比較容易混淆的一些,並未全部列出。
進化計算: 這樣能強調演算法需要在 計算機上 實施,但進化計算也可能指不用於優化的演算法(最初的遺傳演算法並不是用於優化本身,而是想用來研究自然選擇的過程)。因此,進化優化演算法比進化計算更具體。
基於種群的優化: 它強調進化演算法一般是讓問題的候選解 種群 隨著時間的進化以得到問題的更好的解。然而許多進化演算法每次迭代只有單個候選解。因此,進化演算法比基於種群的優化更一般化。
計算機智能/計算智能: 這樣做常常是為了區分進化演算法與專家系統,在傳統上專家系統一直被稱為人工智慧。專家系統模仿演繹推理,進化演算法則模仿歸納推理。進化演算法有時候也被看成是人工智慧的一種。計算機智能是比進化演算法更一般的詞,它包括神經計算、模糊系統、人工生命這樣的一些技術,這些技術可應用於優化之外的問題。因此,進化計算可能比計算機智能更一般化或更具體。
由自然啟發的計算/仿生計算: 像差分進化和分布估計演算法這些進化演算法可能並非源於自然,像進化策略和反向學習這些進化演算法與自然過程聯系甚微。因此,進化演算法比由自然啟發的演算法更一般化,因為進化演算法包括非仿生演算法。
機器學習: 機器學習研究由經驗學到的計算機演算法,它還包括很多不是進化計算的演算法,如強化學習、神經網路、分簇、svm等等。因此,機器學習比進化演算法更廣。
群智能演算法: 一些人認為群智能演算法應與進化演算法區分開,一些人認為群智能演算法是進化演算法的一個子集。因為群智能演算法與進化演算法有相同的執行方式,即,每次迭代都改進問題的候選解的性能從而讓解的種群進化。因此,我們認為群智能演算法是一種進化演算法。
進化演算法的簡單定義可能並不完美。在進化演算法領域術語的不統一會讓人困惑,一個演算法是進化演算法如果它通常被認為是進化演算法,這個戲謔的、循環的定義一開始有些麻煩,但是一段時間後,這個領域工作的人就會習慣了。
優化幾乎適用於生活中的所有領域。除了對如計算器做加法運算這種過於簡單的問題,不必用進化演算法的軟體,因為有更簡單有效的演算法。此外對於每個復雜的問題,至少應該考慮採用進化演算法。
一個優化野兆問題可以寫成最小化問題或最大化問題,這兩個問題在形式上很容易互相轉化:
函數 被稱為目標函數,向量 被稱為獨立變數,或決策變數。我們稱 中元素的個數為問題的維數。
優化問題常常帶有約束。即在最小化某個函數 時,對 可取的值加上約束。不舉例。
實際的優化問題不僅帶有約束,還有多個目標。這意味著我們想要同時最小化不止一個量。
例子:
這里評估這個問題的一種方式是繪制 作為函數 的函數的圖:
如圖,對在實線上的 的值,找不到能同時使 和 減小的 的其他值,此實線被稱為 帕累托前沿 ,而相應的 的值的集合被稱為帕累托集。(此處的帕累托最優問題十分重要,可以參考這個鏈接來學習和理解: 多目標優化之帕累托最優 - 知乎 ,非常清晰易懂。)
該例子是一個非常簡單的多目標優化問題,它只有兩個目標。實際的優化問題通常涉及兩個以上的模目標,因此很難得到它的帕累托前沿,由於它是高維的,我們也無法將它可視化。後面的章節將會仔細討論多目標進化優化。
多峰優化問題是指問題不止一個局部最小值。上例中的 就有兩個局部最小值,處理起來很容易,有些問題有很多局部最小值,找出其中的全局最小值就頗具挑戰性。
對於前面的簡單例子,我們能用圖形的方法或微積分的方法求解,但是許豎隱多實際問題除了有更多獨立變數、多目標,以及帶約束之外更像上面的ackley函數這樣,對於這類問題,基於微積分或圖形的方法就不夠用了,而進化演算法卻能給出更好的結果。
到現在為余脊廳止我們考慮的都是連續優化問題,也就是說,允許獨立變數連續地變化。但有許多優化問題中的獨立變數智能在一個離散集合上取值。這類問題被稱為組合優化問題。如旅行商問題。
對於有 個城市的旅行商問題,有 個可能的解。對於一些過大的問題,硬算的方法不可行,像旅行商這樣的組合問題沒有連續的獨立變數,因此不能利用導數求解。除非對每個可能的解都試一遍,不然就無法確定所得到的組合問題的解是否就是最好的解。進化演算法對這類大規模、多維的問題,它至少能幫我們找出一個好的解(不一定是最好的)。
㈡ 優化演算法筆記(二)優化演算法的分類
(以下描述,均不是學術用語,僅供大家快樂的閱讀)
在分類之前,我們先列舉一下常見的優化演算法(不然我們拿什麼分類呢?)。
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)
㈢ 優化演算法筆記(七)差分進化演算法
(以下描述,均不是學術用語,僅供大家快樂的閱讀)
差分進化演算法(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實現
㈣ 人工智慧之進化演算法
進化計算的三大分支包括:遺傳演算法(genetic algorithm ,簡稱ga)、進化規劃(evolu-tionary programming,簡稱ep)和進化策略(evolution strategies ,簡稱es)。這三個分支在演算法實現方面具有一些細微的差別,但它們具有一個共同的特點,即都是藉助生物進化的思想和原理來解決實際問題。
遺傳演算法是一類通過模擬生物界自然選擇和自然遺傳機制的隨機化搜索演算法,由美國holand j教授於1975年首次提出。它是利用某種編碼技術作用於稱為染色體的二進制數串,其基本思想是模擬由這些串組成的種群的進化過程,通過有組織的、然而是隨機的信息交換來重新組合那些適應性好的串。遺傳演算法對求解問題的本身一無所知,它所需要的僅是對演算法所產生的每個染色體進行評價,並根據適應性來選擇染色體,使適應性好的染色體比適應性差的染色體有更多的繁殖機會。遺傳演算法尤其適用於處理傳統搜索方法難於解決的復雜的非線性問題,可廣泛用於組合優化、機器學習、自適應控制、規劃設計和人工生命等領域,是21世紀有關智能計算中的關鍵技術之一。
1964年,由德國柏林工業大學的rechenbergi等人提出。在求解流體動力學柔性彎曲管的形狀優化問題時,用傳統的方法很難在優化設計中描述物體形狀的參數,然而利用生物變異的思想來隨機地改變參數值並獲得了較好效果。隨後,他們便對這種方法進行了深入的研究和發展,形成了進化計算的另一個分支——進化策略。
進化策略與遺傳演算法的不同之處在於:進化策略直接在解空間上進行操作,強調進化過程中從父體到後代行為的自適應性和多樣性,強調進化過程中搜索步長的自適應性調節;而遺傳演算法是將原問題的解空間映射到位串空間之中,然後再施行遺傳操作,它強調個體基因結構的變化對其適應度的影響。
進化策略主要用於求解數值優化問題。
進化規劃的方法最初是由美國人fogel lj等人在20世紀60年代提出的。他們在人工智慧的研究中發現,智能行為要具有能預測其所處環境的狀態,並按照給定的目標做出適當的響應的能力。在研究中,他們將模擬環境描述成是由有限字元集中符號組成的序列。
進化演算法與傳統的演算法具有很多不同之處,但其最主要的特點體現在下述兩個方面:
進化計算的智能性包括自組織、自適應和自學習性等。應用進化計算求解問題時,在確定了編碼方案、適應值函數及遺傳運算元以後,演算法將根據「適者生存、不適應者淘汰"的策略,利用進化過程中獲得的信息自行組織搜索,從而不斷地向最佳解方向逼近。自然選擇消除了傳統演算法設計過程中的-一個最大障礙:即需要事先描述問題的全部特點,並說明針對問題的不同特點演算法應採取的措施。於是,利用進化計算的方法可以解決那些結構尚無人能理解的復雜問題。
進化計算的本質並行性表現在兩個方面:
一是進化計算是內在並行的,即進化計算本身非常適合大規模並行。
二是進化計算的內含並行性,由於進化計算採用種群的方式組織搜索,從而它可以同時搜索解空間內的多個區域,並相互交流信息,這種搜索方式使得進化計算能以較少的計算獲得較大的收益。
㈤ 多目標優化演算法
多目標優化演算法如下:
一、多目標進化演算法(moea)
1、moea通過對種群x(t)執行選擇、交叉和變異等操作產生下一代種群x(t 1)。
2、在每一代進化過程中 ,首先將種群x(t)中的所有非劣解個體都復制到外部集a(t)中。
2、智能優化演算法:包括進化演算法(簡稱ea)、粒子群演算法(簡稱pso)等。
兩者的區別:傳統優化技術一般每次能得到pareo解集中的一個,而用智能演算法來求解,可以得到更多的pareto解,這些解構成了一個最優解集,稱為pareto最優解(任一個目標函數值的提高都必須以犧牲其他目標函數值為代價的解集)。