遺傳算法簡介

姓名:張藝倫 ? ?學號:17011210282

轉(zhuǎn)載自:https://www.zhihu.com/question/23293449/answer/120220974块蚌,有刪節(jié)

【嵌牛導讀】:本文簡單的介紹了遺傳算法的思想慈迈,之后進一步介紹了它的具體步驟倦始,最后給出了它的流程以及在matlab中的實現(xiàn)方法敬特。

【嵌牛鼻子】:遺傳算法厘肮,流程转砖,matlab恢筝。

【嵌牛提問】:怎樣理解遺傳算法蔫仙?具體步驟是什么料睛?

【嵌牛正文】:

一個簡單的問題用到了遺傳算法,問題是這樣的:

求解函數(shù) f(x) = x + 10*sin(5*x) + 7*cos(4*x) 在區(qū)間[0,9]的最大值。

這個函數(shù)大概長這樣:

那么如何應用遺傳算法如何來找到這個奇怪的函數(shù)的最大值呢恤煞?

事實上屎勘,不管一個函數(shù)的形狀多么奇怪,遺傳算法都能在很短的時間內(nèi)找到它在一個區(qū)間內(nèi)的(近似)最大值居扒。

相當神奇概漱,不是嗎?

接下來圍繞這個問題喜喂,講講我對遺傳算法的一些理解瓤摧。在Matlab中使用遺傳算法的小教程都附在最后。

1.介紹

遺傳算法(Genetic Algorithm)遵循『適者生存』玉吁、『優(yōu)勝劣汰』的原則照弥,是一類借鑒生物界自然選擇和自然遺傳機制的隨機化搜索算法。

遺傳算法模擬一個人工種群的進化過程进副,通過選擇(Selection)这揣、交叉(Crossover)以及變異(Mutation)等機制,在每次迭代中都保留一組候選個體影斑,重復此過程给赞,種群經(jīng)過若干代進化后,理想情況下其適應度達到***近似最優(yōu)***的狀態(tài)矫户。

自從遺傳算法被提出以來片迅,其得到了廣泛的應用,特別是在函數(shù)優(yōu)化吏垮、生產(chǎn)調(diào)度障涯、模式識別、神經(jīng)網(wǎng)絡膳汪、自適應控制等領域唯蝶,遺傳算法發(fā)揮了很大的作用,提高了一些問題求解的效率遗嗽。

2.遺傳算法組成

1.編碼 -> 創(chuàng)造染色體

2.個體 -> 種群

3.適應度函數(shù)

4.遺傳算子

? ?選擇

? ?交叉

? ?變異

5.運行參數(shù)

? ?是否選擇精英操作

? ?種群大小

? ?染色體長度

? ?最大迭代次數(shù)

? ?交叉概率

? ?變異概率

2.1 編碼與解碼

實現(xiàn)遺傳算法的第一步就是明確對求解問題的編碼和解碼方式粘我。

對于函數(shù)優(yōu)化問題,一般有兩種編碼方式痹换,各具優(yōu)缺點

1.實數(shù)編碼:直接用實數(shù)表示基因征字,容易理解且不需要解碼過程,但容易過早收斂娇豫,從而陷入局部最優(yōu)

2.二進制編碼:穩(wěn)定性高匙姜,種群多樣性大,但需要的存儲空間大冯痢,需要解碼且難以理解

對于求解函數(shù)最大值問題氮昧,我選擇的是二進制編碼框杜。

以我們的目標函數(shù)f(x) = x + 10sin(5x) + 7cos(4x), x∈[0,9]為例。

假如設定求解的精度為小數(shù)點后4位袖肥,可以將x的解空間劃分為 (9-0)×(1e+4)=90000個等分咪辱。

2^16<90000<2^17,需要17位二進制數(shù)來表示這些解椎组。換句話說油狂,一個解的編碼就是一個17位的二進制串。

一開始寸癌,這些二進制串是隨機生成的专筷。

一個這樣的二進制串代表一條染色體串,這里染色體串的長度為17灵份。

對于任何一條這樣的染色體chromosome仁堪,如何將它復原(解碼)到[0,9]這個區(qū)間中的數(shù)值呢?

對于本問題填渠,我們可以采用以下公式來解碼:

x = 0 + decimal(chromosome)×(9-0)/(2^17-1)

decimal( ): 將二進制數(shù)轉(zhuǎn)化為十進制數(shù)

一般化解碼公式:

f(x), x∈[lower_bound, upper_bound]x = lower_bound + decimal(chromosome)×(upper_bound-lower_bound)/(2^chromosome_size-1)

lower_bound: 函數(shù)定義域的下限

upper_bound: 函數(shù)定義域的上限

chromosome_size: 染色體的長度

通過上述公式弦聂,我們就可以成功地將二進制染色體串解碼成[0,9]區(qū)間中的十進制實數(shù)解。

2.2 個體與種群

『染色體』表達了某種特征氛什,這種特征的載體莺葫,稱為『個體』。

對于本次實驗所要解決的一元函數(shù)最大值求解問題枪眉,個體可以用上一節(jié)構(gòu)造的染色體表示捺檬,一個個體里有一條染色體。

許多這樣的個體組成了一個種群贸铜,其含義是一個一維點集(x軸上[0,9]的線段)堡纬。

2.3 適應度函數(shù)

遺傳算法中,一個個體(解)的好壞用適應度函數(shù)值來評價蒿秦,在本問題中烤镐,f(x)就是適應度函數(shù)。

適應度函數(shù)值越大棍鳖,解的質(zhì)量越高炮叶。

適應度函數(shù)是遺傳算法進化的驅(qū)動力,也是進行自然選擇的唯一標準渡处,它的設計應結(jié)合求解問題本身的要求而定镜悉。

2.4 遺傳算子

我們希望有這樣一個種群,它所包含的個體所對應的函數(shù)值都很接近于f(x)在[0,9]上的最大值医瘫,但是這個種群一開始可能不那么優(yōu)秀侣肄,因為個體的染色體串是隨機生成的。

如何讓種群變得優(yōu)秀呢醇份?

不斷的進化茫孔。

每一次進化都盡可能保留種群中的優(yōu)秀個體叮喳,淘汰掉不理想的個體,并且在優(yōu)秀個體之間進行染色體交叉缰贝,有些個體還可能出現(xiàn)變異。

種群的每一次進化畔濒,都會產(chǎn)生一個最優(yōu)個體剩晴。種群所有世代的最優(yōu)個體,可能就是函數(shù)f(x)最大值對應的定義域中的點侵状。

如果種群無休止地進化赞弥,那總能找到最好的解。但實際上趣兄,我們的時間有限绽左,通常在得到一個看上去不錯的解時,便終止了進化艇潭。

對于給定的種群拼窥,如何賦予它進化的能力呢?

1.首先是選擇(selection)

選擇操作是從前代種群中選擇***多對***較優(yōu)個體蹋凝,一對較優(yōu)個體稱之為一對父母鲁纠,讓父母們將它們的基因傳遞到下一代,直到下一代個體數(shù)量達到種群數(shù)量上限

在選擇操作前鳍寂,將種群中個體按照適應度從小到大進行排列

采用輪盤賭選擇方法(當然還有很多別的選擇方法)改含,各個個體被選中的概率與其適應度函數(shù)值大小成正比

輪盤賭選擇方法具有隨機性,在選擇的過程中可能會丟掉較好的個體迄汛,所以可以使用精英機制捍壤,將前代最優(yōu)個體直接選擇

2.其次是交叉(crossover)

兩個待交叉的不同的染色體(父母)根據(jù)交叉概率(cross_rate)按某種方式交換其部分基因

采用單點交叉法,也可以使用其他交叉方法

3.最后是變異(mutation)

染色體按照變異概率(mutate_rate)進行染色體的變異

采用單點變異法鞍爱,也可以使用其他變異方法

一般來說鹃觉,交叉概率(cross_rate)比較大,變異概率(mutate_rate)極低硬霍。像求解函數(shù)最大值這類問題帜慢,我設置的交叉概率(cross_rate)是0.6,變異概率(mutate_rate)是0.01唯卖。

因為遺傳算法相信2條優(yōu)秀的父母染色體交叉更有可能產(chǎn)生優(yōu)秀的后代粱玲,而變異的話產(chǎn)生優(yōu)秀后代的可能性極低,不過也有存在可能一下就變異出非常優(yōu)秀的后代拜轨。這也是符合自然界生物進化的特征的抽减。

3.遺傳算法流程

最后就再介紹一下如何在Matlab中使用遺傳算法。

在MATLAB中使用GA

1. 打開 Optimization 工具橄碾,在 Solver 中選擇 ga - genetic algorithm卵沉,在 Fitness function 中填入@target

2. 在你的工程文件夾中新建 target.m颠锉,注意MATLAB的當前路徑是你的工程文件夾所在路徑

3. 在 target.m 中寫下適應度函數(shù),比如

function [ y ] = target(x)y = -x-10*sin(5*x)-7*cos(4*x);end

*MATLAB中的GA只求解函數(shù)的(近似)最小值史汗,所以先要將目標函數(shù)取反琼掠。

4. 打開 Optimization 工具,輸入 變量個數(shù)(Number of variables) 和 自變量定義域(Bounds) 的值停撞,點擊 Start瓷蛙,遺傳算法就跑起來了。最終在輸出框中可以看到函數(shù)的(近似)最小值戈毒,和達到這一程度的迭代次數(shù)(Current iteration)和最終自變量的值(Final point)

5. 在 Optimization - ga 工具中艰猬,有許多選項。通過這些選項埋市,可以設置下列屬性

種群(Population)

選擇(Selection)

交叉(Crossover)

變異(Mutation)

停止條件(Stopping criteria)

畫圖函數(shù)(Plot functions)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冠桃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子道宅,更是在濱河造成了極大的恐慌食听,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件培己,死亡現(xiàn)場離奇詭異碳蛋,居然都是意外死亡,警方通過查閱死者的電腦和手機省咨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門肃弟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人零蓉,你說我怎么就攤上這事笤受。” “怎么了敌蜂?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵箩兽,是天一觀的道長。 經(jīng)常有香客問我章喉,道長汗贫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任秸脱,我火速辦了婚禮落包,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摊唇。我一直安慰自己咐蝇,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布巷查。 她就那樣靜靜地躺著有序,像睡著了一般抹腿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旭寿,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天警绩,我揣著相機與錄音,去河邊找鬼许师。 笑死房蝉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的微渠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼咧擂,長吁一口氣:“原來是場噩夢啊……” “哼逞盆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起松申,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤云芦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贸桶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舅逸,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年皇筛,在試婚紗的時候發(fā)現(xiàn)自己被綠了琉历。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡水醋,死狀恐怖旗笔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拄踪,我是刑警寧澤蝇恶,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站惶桐,受9級特大地震影響撮弧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姚糊,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一贿衍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叛拷,春花似錦舌厨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躏哩。三九已至,卻和暖如春揉燃,著一層夾襖步出監(jiān)牢的瞬間扫尺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工炊汤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留正驻,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓抢腐,卻偏偏與公主長得像姑曙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迈倍,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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