遺傳演算法入門程式例子

2021-06-15 05:05:27 字數 2890 閱讀 2183

參考:《智慧型控制》作者劉金琨,電子工業出版社

利用遺傳演算法求取rosenbrock函式的最大值

該函式有兩個區域性極大值點,分別是f(2.048,-2.048)=3897.7342,  f(-2.048,-2.048)=3905.9262;其中後者為全域性最大點

matlab程式:

%generic algorithm for function f(x1,x2) optimum

clear all;

close all;

%parameters

size=80; % 80個群

g=100;

codel=10;

umax=2.048;

umin=-2.048;

e=round(rand(size,2*codel));    % initial code

%main program

for k=1:1:g

time(k)=k;

for s=1:1:size

m=e(s,:);

y1=0;y2=0;

%uncoding

m1=m(1:1:codel);

for i=1:1:codel

y1=y1+m1(i)*2^(i-1);

endx1=(umax-umin)*y1/1023+umin;

m2=m(codel+1:1:2*codel);

for i=1:1:codel

y2=y2+m2(i)*2^(i-1);

endx2=(umax-umin)*y2/1023+umin;

f(s)=100*(x1^2-x2)^2+(1-x1)^2;

endji=1./f;

%****** step 1 : evaluate bestj ******

bestj(k)=min(ji);

fi=f;                          %fitness function

[oderfi,indexfi]=sort(fi);     %arranging fi small to bigger

bestfi=oderfi(size);           %let bestfi=max(fi)

bests=e(indexfi(size),:);      %let bests=e(m), m is the indexfi belong to max(fi)

bfi(k)=bestfi;

%****** step 2 : select and reproduct operation****** 選擇運算元

fi_sum=sum(fi);

fi_size=(oderfi/fi_sum)*size;

fi_s=floor(fi_size);        %selecting bigger fi value

kk=1;                       %選擇貢獻比較大的

for i=1:1:size

for j=1:1:fi_s(i)        %select and reproduce

tempe(kk,:)=e(indexfi(i),:);

kk=kk+1;              %kk is used to reproduce

endend

%************ step 3 : crossover operation ************ 交叉運算元

pc=0.60;

n=ceil(20*rand);% rand,隨時變化的單個資料

for i=1:2:(size-1)

temp=rand;

if pc>temp                  % crossover condition

for j=n:1:20

tempe(i,j)=e(i+1,j); %對沒有交叉的某個群體,matlab語法設定該行資料為0

tempe(i+1,j)=e(i,j);

endend

endtempe(size,:)=bests; %保留最好的乙個

e=tempe;

%************ step 4: mutation operation **************

%pm=0.001;

%pm=0.001-[1:1:size]*(0.001)/size; %bigger fi, smaller pm

%pm=0.0;    % no mutation

pm=0.1;     % big mutation

for i=1:1:size

for j=1:1:2*codel

temp=rand;

if pm>temp                %mutation condition

if tempe(i,j)==0

tempe(i,j)=1;

else

tempe(i,j)=0;

endend

endend

%guarantee temppop(30,:) is the code belong to the best individual(max(fi))

tempe(size,:)=bests; % 保留最好的

e=tempe;

endmax_value=bestfi

bests

x1x2

figure(1);

plot(time,bestj);

xlabel('times');ylabel('best j');

figure(2);

plot(time,bfi);

xlabel('times');ylabel('best f');

遺傳演算法優化例子

遺傳演算法的手工模擬計算示例 為更好地理解遺傳演算法的運算過程,下面用手工計算來簡單地模擬遺傳演算法的各個主要執行步驟。例 求下述二元函式的最大值 1 個體編碼 遺傳演算法的運算物件是表示個體的符號串,所以必須把變數 x1,x2 編碼為一種 符號串。本題中,用無符號二進位制整數來表示。因 x1,x2...

遺傳演算法入門

術語 1.基因 gene 是串中的元素 2.染色體 chromosome 是基因的集合,為乙個解 3.基因組 genome 也稱為個體 4.群體 population 是基因組的集合 5.適應度 fitness 表示個體對環境的適應程式 6.雜交率 crossover rate 用來確定兩個染色體進...

遺傳演算法入門(一)

一 遺傳演算法簡介 遺傳演算法的概念最早是由 bagley j.d 於1967年提出,後來michigan大學的 j.h.holland 教授於1975年開始對遺傳演算法的機理進行系統化的研究。遺傳演算法是受達爾文演化論啟發,借鑑生物進化過程而提出的一種啟發式搜尋演算法,它是對達爾文生物進化理論的簡...