简介
遗传算法(GA)是模拟生物在自然环境中的遗传和精华的过程形成的自适应全局优化搜索算法。通过自然选择,交叉、遗传、变异等步骤来产生新一代种群,并逐步使种群精华到包含近似最优解的状态。
基本概念
种群和个体
种群是生物进化过程中的一个集团,表示可行解的集合。
个体是组成种群的单个生命体,表示可行解。
染色体和基因
染色体是包含生命体的所有遗传信息的集合,表示可行解的编码。
基因是遗传信息的基本的单位,表示可行解编码的分量。
遗传编码
遗传编码将优化变量转为基因组合的表示形式,常见的有 二进制编码、实数编码、整数编码等。
适应度函数
适应度即生命体中个体适应度生存的能力。在遗传算法中用来评价个体的优劣的数学函数,成为个体适应度函数。
遗传操作
遗传操作的优选强势个体的“选择”,个体之间交换基因产生新个体的“交叉”、个体基因信息突变产生新个体的“变异”。
用标准遗传算法求解函数f(x) = x+10*cos(5*x)+7*sin(4*x)的最小值,其中x的取值范围【0,10】,该函数是有多个局部极值的函数,图形如下:
代码如下:
x = 0:0.01:10;
y = x+10*cos(5*x)+7*sin(4*x);
figure
plot(x,y)
grid on
xlabel('x')
ylabel('y')
title('f(x) = x+10*cos(5*x)+7*sin(4*x)');
a = min(y)
使用标准遗传算法仿真如下:
1.初始化种群数目NP=50,染色体二进制编码长度L=20,最大进化次数G=100,Pc=0.8,Pm=0.05
2.产生初始种群,将二进制编码转换为十进制,计算个体适应度值,并归一化;采用轮盘赌方式进行选择操作,按照固定交叉、变异概率操作,把历代最优个体保存在新种群中,进行下一步遗传操作。
3.判断是否满足终止条件;若满足。结束。不满足,继续迭代。
适应度函数进化曲线如图所示:
其中:函数值最小y(Best) = -12.2896;此时X = 4.3712;迭代次数I = 76;
仿真代码如下:
clc ;
clear all;
close all;
%遗传算法仿真
%求函数最小值
NP =50;
L = 20;%二进制编码
Pc = 0.8; %交叉概率
Pm = 0.05;%变异概率
G = 100;
Xs = 10;%x 范围
Xx = 0;
imax = 1;
f = randi([0,1],NP,L); %随机获得初始种群
% 遗传算法循环
for k = 1:G
%将二进制解码为定义域范围内十进制
for i= 1:NP
U = f(i,:);
m = 0;
for j = 1:L
m = U(j)*2^(j-1)+m;
end
x(i) = Xx +m*(Xs - Xx)/(2^L -1);
Fit(i) = -func(x(i));
end
maxFit = max(Fit);
minFit = min(Fit);
rr = find(Fit == maxFit);
fBest = f(rr(1,1),:);
xBest = x(rr(1,1));
Fit = (Fit-minFit)/(maxFit - minFit);
sum_Fit = sum(Fit);
fitvalue = Fit./sum_Fit;
fitvalue = cumsum(fitvalue);
ms = sort(rand(NP,1));
fiti = 1;
newi = 1;
while newi <=NP
if(ms(newi))<fitvalue(fiti)
nf(newi,:) = f(fiti,:);
newi = newi+1;
else
fiti = fiti+1;
end
end
%%%%%%%%%%%%%基于概率的交叉操作%%%%%%%%%%%%
for i = 1:2:NP
p = rand;
if p<Pc
q = randi(1,L);
for j = 1:L
if q(j) == 1; %?
temp = nf(i+1,j);
nf(i+1,j) = nf(i,j);
nf(i,j) = temp;
end
end
end
end
%%%%%%%%%%基于概率的变异操作%%%%%%%%%%%%
for m = 1:NP
for n =1:L
r = rand(1,1);
if r<Pm
nf(m,n) = rand(1,1)*(Xs-Xx)+Xx;
end
end
end
f = nf;
f(1,:) = fBest;%保留最优个体在新种群中
trace(k) = -maxFit;
end
[Best,I] = min(trace)%保存最佳值以及索引
xBest;
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
hold on
h = legend('f(x) = x+10*cos(5*x)+7*sin(4*x)','Location','NorthEast');
set(h,'fontname','Microsft YaHei UI','Fontsize', 12);