遗传算法 / Genetic Algorithm
遗传算法主函数
k1为遗传进化总代数,k2为计算机显示控制数 m为群体规模,n为染色体长度,t为交叉算子选择位 pc为交叉概率,pm为变异概率,[a,b] 为解码取值范围 A为进化结束后群体,xx为对应解码,yy为目标函数值
function [A,xx,yy] = genetic_algorithm(k1,k2,m,n,t,pc,pm,a,b)
%{
k1为遗传进化总代数,k2为计算机显示控制数
m为群体规模,n为染色体长度,t为交叉算子选择位
pc为交叉概率,pm为变异概率,[a,b]为解码取值范围
A为进化结束后群体,xx为对应解码,yy为目标函数值
%}
A = round(rand(m,n)); %生成遗传基因
% round()函数用于取最接近的整数
% rand())函数用于产生由在(0, 1)之间均匀分布的随机数组成的数组。
for k = 1:k1
[g,f] = fun_fitness(A,n,a,b);%计算适应度函数
A = fun_selection(A,g,m,n);%选择算子
A = fun_crossover(A,t,n,pc);%交叉算子
A = fun_mutation(A,pm); %变异算子
if mod(k,k2) == 0
[xx,yy] = fun_value(A,n,a,b); %函数值计算
k
dispx = xx'
dispy = yy'
end
end
[xx,yy] = fun_value(A,n,a,b);
%[A,xx,yy] = genetic_algorithm(500,100,10,17,9,0.8,0.01,0,10)
适应度函数,用于计算A中各染色体的个体适应度
n为染色体长度,**[a,b]**为变量取值范围,g为适应值,f为目标函数值
function [g,f] = fun_fitness(A,n,a,b)
%适应度函数,用于计算A中各染色体的个体适应度
%n为染色体长度,[a,b]为变量取值范围,g为适应值,f为目标函数值
[p,~] = size(A);
f = zeros(p,1);
g = zeros(p,1);
vx = fun_decode(A,n,a,b); % 解码操作
for i = 1:p
x = vx(i);
f(i,1) = 8*sin(5*x)+5*cos(4*x); %目标函数值
end
fmin = min(f);
for i = 1:p
g(i,1) = f(i)-fmin+1; %适应度函数值
end
选择算子
按个体适应度F从种群A中选取m个形成种群B,n为基因编码长度
function B = fun_selection(A,F,m,n)
%选择算子。按个体适应度F从种群A中选取m个形成种群B,n为基因编码长度
[p,~] = size(A);
B = zeros(m,n);
s = sum(F); % 默认对每列进行求和
F = cumsum(F)/s; %cumsum()函数计算元素累加值,默认对每列进行累加
rr = rand(1,m); %
for k=1:m
if rr(k)<F(1)
w = 1;
else
con = 1;
t = 2;
while t <= p && con == 1 %&&与
if rr(k)<F(t) && rr(k)>=F(t-1)
w = t;
con = 0;
end
t = t+1;
end
end
B(k,:) = A(w,:);
%D(k) = w;
end
交叉算子,单点交叉操作。
k表示选择位,n表示总位数,r表示交叉概率
function B = fun_crossover(A,k,n,r)
%交叉算子,单点交叉操作。k表示选择位,n表示总位数,r表示交叉概率
[p,q] = size(A);
B = zeros(p,q);
R = rand(p,1);
for i = 1:2:p
if R(i)<r
a = A(i,:);
b = A(i+1,:);
a1 = a(1:k-1);
a2 = a(k:n);
b1 = b(1:k-1);
b2 = b(k:n);
B(i,:) = [a1,b2];
B(i+1,:) = [b1,a2];
else
B(i,:) = A(i,:);
B(i+1,:) = A(i+1,:);
end
end
变异算子
以变异概率r对种群A中基因进行变异操作
function A = fun_mutation(A,r)
%变异算子,以变异概率r对种群A中基因进行变异操作
[p,q] = size(A);
B = rand(p,q);
for i = 1:p
for j = 1:q
if B(i,j)<r
if A(i,j) == 1
A(i,j)=0;
else
A(i,j) = 1;
end
end
end
end
函数值计算
n为染色体长度,**[a,b]**为变量取值范围,xx为染色体解码,yy为目标函数
function [xx,yy] = fun_value(A,n,a,b)
%函数值计算
%n为染色体长度,[a,b]为变量取值范围,xx为染色体解码,yy为目标函数
[p,q] = size(A);
xx = fun_decode(A,n,a,b);
yy = zeros(p,1);
for i=1:p
x = xx(i);
yy(i,1) = 8*sin(5*x)+5*cos(4*x);
end
解码操作
将二进制基因编码转换为在**[a,b]**内对应的十进制数值,n为染色体长度
function d = fun_decode(A,n,a,b)
% 解码操作,将二进制基因编码转换为在[a,b]内对应的十进制数值,n为染色体长度
[p,~] = size(A); %p为矩阵行数,q为矩阵列数
d = zeros(p,1);
for k = 1:p
x = A(k,:);
ss = 0;
for i = 1:n
ss = ss + x(i)*2^(n-i);
end
d(k,1) = a + ss*(b-a)/(2^n-1);
end