?? genetic.m
字號:
function [xo,fo] = genetic(f,x0,l,u,Np,Nb,Pc,Pm,eta,kmax)
% 基因算法求f(x)最小值 s.t. l <= x <= u
%f為待求函數,x0初值,l,u上下限,Np群體大小,Nb每一個變量的基因值(二進制數)
%Pc交叉概率,Pm變異概率,eta學習率,kmax最大迭代次數
N = length(x0);
%%%%%確定各變量缺省值
if nargin < 10
kmax = 100; %最大迭代次數缺省為100
end
if nargin < 9|eta > 1|eta <= 0
eta = 1; %學習率eta,(0 < eta < 1)
end
if nargin < 8
Pm = 0.01; %變異概率缺省0.01
end
if nargin < 7
Pc = 0.5; %交叉概率缺省0.5
end
if nargin < 6
Nb = 8*ones(1,N);%每一變量的基因值(二進制數)
end
if nargin < 5
Np = 10; %群體大小(染色體數)
end
%%%%%生成初始群體
NNb = sum(Nb);
xo = x0(:)'; l = l(:)'; u = u(:)';
fo = feval(f,xo);
X(1,:) = xo;
for n = 2:Np
X(n,:) = l + rand(size(x0)).*(u - l); %初始群體隨機數組
end
P = gen_encode(X,Nb,l,u); %編碼為2進制字串
for k = 1:kmax
X = gen_decode(P,Nb,l,u); %解碼為10進制數
for n = 1:Np
fX(n) = feval(f,X(n,:));
end
[fxb,nb] = min(fX); %選擇最適合的,函數值最小的
if fxb < fo
fo = fxb;
xo = X(nb,:);
end
fX1 = max(fxb) - fX; %將函數值轉化為非負的適合度值
fXm = fX1(nb);
if fXm < eps %如果所有的染色體值相同,終止程序
return;
end
%%%%%復制下一代
for n = 1:Np
X(n,:) = X(n,:) + eta*(fXm - fX1(n))/fXm*(X(nb,:) - X(n,:));%復制準則
end
P = gen_encode(X,Nb,l,u); %對下一代染色體編碼
%%%%%%隨機配對/交叉得新的染色體數組
is = shuffle([1:Np]);
for n = 1:2:Np - 1
if rand < Pc
P(is(n:n + 1),:) = crossover(P(is(n:n + 1),:),Nb);
end
end
%%%%%%變異
P = mutation(P,Nb,Pm);
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -