參考:《智慧型控制》作者劉金琨,電子工業出版社
利用遺傳演算法求取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年開始對遺傳演算法的機理進行系統化的研究。遺傳演算法是受達爾文演化論啟發,借鑑生物進化過程而提出的一種啟發式搜尋演算法,它是對達爾文生物進化理論的簡...