遺傳演算法及matlab簡單實現

2021-10-03 05:51:59 字數 4500 閱讀 5635

遺傳演算法的實現

遺傳演算法的一次迭代稱為一代,每一代都有一組解。新的一組解不但可以有選擇的保留一些適度值高的舊的解,而且可以包括一些由其它解結合得到的新解。最初的一組解(初始群體)是隨機生成的,之後的每組解由遺傳操作生成。每個解都通過乙個與目標函式相關的適應度函式給予評價,通過遺傳過程不斷重複,達到收斂,而獲得問題的最優解

染色體與基因:在遺傳演算法中,為了與生物遺傳規律對應,每乙個解被稱為乙個個體,它對應的編碼稱為染色體(或者基因串)。組成染色體每乙個編碼元素稱為基因

hamming 懸崖

初始群體一群豬出現了

適應度函式與適度值每頭豬的生存能力

注:對尋找最大值的優化問題,其適應度函式可以直接選用目標函式;而對尋找最小值的最優化問題,其適應度函式可以是乙個大的正數減去目標函式。總之,適度值必須為正數或零

遺傳操作是模擬自然界生物進化過程中發生的繁殖、染色體之間的交叉和突變現象而生成新的、更優解的過程

遺傳操作之選擇大自然覺得這頭豬老了,收走:按一定規則從原始群體中隨機選取若干對個體作為繁殖後代的群體

選擇操作是從舊的群體中選出優秀者,但並不生成新的個體

遺傳操作之交叉

交叉操作是產生新個體的主要方法之一,因此交叉概率p

cp_c

pc​應取較大值。但p

cp_c

pc​取過大值可能會破壞群體中的優良模式,對進化計算產生不利的影響。若p

cp_c

pc​取值較小,則產生新個體的速度較慢,演算法效率低

遺傳演算法交叉操作概率p

cp_c

pc​的取值範圍一般為0.59~0.99

遺傳操作之變異豬寶寶變異了,有的會飛了,有的天生站不起來:變異增加了遺傳演算法找到接近最優解的能力,可以維持群體的多樣性,防止出現早熟

變異概率p

mp_m

pm​不宜選取過大,過大可能會把群體中較好的個體變異掉,一般取0.0001~0.1,如果變異概率大於0.5,遺傳演算法就退化為隨機搜尋法

終止這個豬種群繁衍到終止的時候的現狀

根據終止進化代數n,一般取值範圍為100~500

根據適度值的最小偏差滿足要求的偏差範圍

根據適度值的變化趨勢,當適度值逐漸趨於緩和或者停止時終止遺傳操作,即群體中的最優個體在連續若干代沒有改進或平均適度值在連續若干代基本沒有改進後即可停止

遺傳演算法流程圖

例項:

主函式

function main()

clear;

clc;

%種群大小

popsize=100;

%二進位制編碼長度

chromlength=10;

%交叉概率

pc=0.6;

%變異概率

pm=0.001;

%初始種群

pop = initpop(popsize,chromlength);

%迭代次數

time=300;

x=ones(time,1);

fitvalue1=ones(time,1);

for i=1:time

%計算適應度值(函式值)

objvalue=cal_objvalue(pop);

fitvalue=objvalue;

%選擇操作

newpop=selection(pop,fitvalue);

%交叉操作

newpop=crossover(newpop,pc);

%變異操作

newpop=mutation(newpop,pm);

%更新種群

pop=newpop;

[bestindividual,bestfit]=best(pop,fitvalue);

x(i)=binary2decimal(bestindividual);

fitvalue1(i)=bestfit;

end%尋找最優解

x1=binary2decimal(newpop);

y1=cal_objvalue(newpop);

%顯示最終種群進化後的優解

figure;

fplot(@(x)10*sin(5*x)+7*abs(x-5)+10,[0 10]);

hold on

plot(x1,y1,'*');

title(['迭代次數為' num2str(time)]);

%顯示每一代的最優解的迭代過程

figure;

y=1:time;

plot(y,x,'.');

figure;

plot(y,fitvalue1,'.');

初始種群大小

%初始化種群大小

%輸入變數:

%popsize:種群大小

%chromlength:染色體長度->轉化的二進位制長度

%輸出變數:

%pop:種群

function pop=initpop(popsize,chromlength)

pop=round(rand(popsize,chromlength));

二進位制轉換為十進位制函式(注意二進位制是用矩陣表示的)

%二進位制轉化為十進位制函式

%輸入變數:

%二進位制種群

%輸出變數:

%十進位制數值

function pop2=binary2decimal(pop)

[px,py]=size(pop);

for i=1:py

pop1(:,i)=2.^(py-i).*pop(:,i);

endtemp=sum(pop1,2);

%精度問題,題目定義域長度為10,而10位二進位制編碼可以表示0~1023

pop2=temp/1023*10;

適應度函式

%適應度函式

%輸入變數:二進位制數值

%輸出變數:目標函式值

function [objvalue]=cal_objvalue(pop)

x=binary2decimal(pop);

objvalue=10*sin(5*x)+7*abs(x-5)+10;

選擇函式

%如何選擇新的個體

%輸入變數:pop二進位制種群,fitvalue:適應度值

%輸出變數:newpop選擇以後的二進位制種群

function [newpop]=selection(pop,fitvalue)

%構造輪盤

[px,py]=size(pop);

totalfit=sum(fitvalue);

p_fitvalue=fitvalue/totalfit;

p_fitvalue=cumsum(p_fitvalue);

ms=sort(rand(px,1));

fitin=1;

newin=1;

while newin<=px

if(ms(newin)

交叉函式

%交叉變換

%輸入變數:pop:二進位制父代種群數,pc:交叉概率

%輸出變數:newpop:交叉後的種群數

function [newpop]=crossover(pop,pc)

[px,py]=size(pop);

newpop=ones(size(pop));

for i=1:2:px-1

if(rand

變異函式

%變異%輸入變數:pop:二進位制種群,pm:變異概率

%輸出變數:newpop變異後的種群

function [newpop]=mutation(pop,pm)

[px,py]=size(pop);

newpop=ones(size(pop));

for i=1:px

newpop(i,:)=pop(i,:);

if(rand

取最優值函式

%求最優適應度函式

%輸入變數:pop:種族,fitvalue:種群適應度

%輸出變數:bestindividual:最佳個體,bestvalue:最佳適應度值

function [bestindividual,bestfit]=best(pop,fitvalue)

[px,py]=size(pop);

bestindividual=pop(1,:);

bestfit=fitvalue(1);

for i=2:px

if bestfit

遺傳演算法的matlab實現

遺傳演算法是一種全域性最優化演算法,是運用了演化論優勝劣汰原理的隨機化搜尋方法。前些日子,在進行畢業設計的相關研究中,我接觸到了遺傳演算法,用其對乙個五元非線性函式進行最優化搜尋。平台使用的是matlab,主要使用的是謝菲爾德大學的matlab遺傳演算法工具箱。具體程式如下 clc clear al...

遺傳演算法簡單介紹與MATLAB實現(一)

第一次聽說遺傳演算法是在高三晚上放學回家的路上,同行的小夥伴問我 你知道遺傳演算法麼?我自然沒聽說過,於是追問細節。聽說遺傳演算法能夠自我迭代,讓他本身系統內的東西進行優勝劣汰的自然選擇,把好的保留下來,次一點的東西就排除掉。是不是特別像人工智慧的那種感覺?這麼高階的麼?那時候我就對這個演算法產生了...

遺傳演算法(GA)的matlab實現

一 task 二 實現過程 1.編碼與解碼 編碼 在編碼之前需要確定求解的精度,設定求解的精度為小數點後六位,即10 6。這樣可以將每個自變數x的解空間劃分為 1 0 10 6 1000000個等分。使n滿足 1 0 10 6 2 n 1,這裡n表示使上式成立的最小整數,即表示自變數x的基因串的長度...