簡單遺傳演算法求函式極值

2021-05-24 09:43:56 字數 1582 閱讀 8336

引言:遺傳演算法求函式極值算是遺傳演算法的一種最簡單的應用,這裡就介紹一種簡單的,全文基本翻譯自codeproject的一篇文章,作者為luay al-wesi,軟體工程師。例子中的函式為y = -x2+ 5 ,大家可以將其改為其他複雜一些的函式,比如說f=x+10sin(5x)+7cos(4x)等。本篇文章適合遺傳演算法初學者閱讀,大牛請繞道,呵呵。文後附c語言**,全部**在vc6.0上編譯通過。這是求函式最大值的例子,求最小值時可以將目標函式進行一定的處理,比如說用1除等方法。然後得到的適應度函式就適合遺傳演算法,以及本**了。

一、編碼以及初始種群的產生

編碼採用二進位制編碼,初始種群採用矩陣的形式,每一行表示乙個染色體,每乙個染色體由若干個基因位組成。關於染色體的長度(即基因位的個數)可根據具體情況而定。比如說根據要求極值的函式的情況,本文的染色體長度為6,前5個二進位制構成該染色體的值(十進位制),第6個表示該染色體的適應度值。長度越長,表示解空間搜尋範圍越大。關於如何將二進位制轉換為十進位制,這個應該很簡單,文後的c**中函式x即為轉換函式。

初始種群結構如下圖所示:

該初始種群共有4個染色體,第一列表示各個染色體的編號,第2列表示該染色體值的正負號,0表示正,1表示負。第3列到第7列為二進位制編碼,第8列表示各個染色體的適應度值。第2列到第7列的0-1值都是隨機產生的。

二、適應度函式

一般情況下,染色體(也叫個體,或乙個解)的適應度函式為目標函式的線性組合。本文直接以目標函式作為適應度函式。即每個染色體的適應度值就是它的目標函式值,f(x)=-x2+ 5。

三、選擇運算元

初始種群產生後,要從種群中選出若干個體進行交叉、變異,那麼如何選擇這些個體呢?選擇方法就叫做選擇運算元。一般有輪盤賭選擇法、錦標賽選擇法、排序法等。本文採用排序法來選擇,即每次選擇都選出適應度最高的兩個個體。那麼執行一次選擇操作後,得到的新種群的一部分為下圖所示:

四、交叉運算元

那麼接下來就要對新種群中選出的兩個個體進行交叉操作,一般的交叉方法有單點交叉、兩點交叉、多點交叉、均勻交叉、融合交叉。方法不同,效果不同。本文採用最簡單的單點交叉。交叉點隨機產生。但是交叉操作要在一定的概率下進行,這個概率稱為交叉率,一般設定為0.5到0.95之間。交叉後產生的新個體組成的新種群如下:

黑體字表示子代染色體繼承母代個體的基因情況。

五、變異

變異就是對染色體的結構進行變異,使其改變原來的結構(值也就改變),達到突變進化的目的。變異操作也要遵從一定的概率來進行,一般設定為0到0.5之間。本文的變異方法直接採取基因位反轉變異法,即0變為1,1變為0。要進行變異的基因位的選取也是隨機的。

六、終止規則

遺傳演算法是要一代一代更替的,那麼什麼時候停止迭代呢?這個規則就叫終止規則。一般常用的終止規則有:若干代後終止,得到的解達到一定目標後終止,計算時間達到一定限度後終止等方法。本文採用迭代數來限制。

全文**如下:

python 遺傳演算法求函式極值問題

遺傳演算法實現求函式極大值 zjh import numpy as np import random import matplotlib.pyplot as plt class ga 求出二進位制編碼的長度 def init self self.boundsbegin 2 self.boundsen...

遺傳演算法工具箱求函式極值

這是乙個用ga演算法來求函式極值的例子 clcclear all t 100 optionsorigin gaoptimset generation t 2 x,fval,reason,output,finnal pop ga ch14 2f,2,optionsorigin options1 gao...

遺傳演算法解簡單的函式極值問題

1 import numpy 2import matplotlib.pyplot as plt 3import random 4import operator 56 x label 7 y label 將每一步迭代的結果儲存到列表中,便於畫圖 8class ga object 9def init s...