智能优化算法-遗传算法以及Matlab实现
文章目录
一、什么是遗传算法GA
遗传算法是进化类算法的一种,模拟生物遗传行为的自适应全局优化搜索算法。学习遗传算法首先应了解一定的生物基础(染色体、基因、变异、染色体变异)。
二、基本概念
1.种群和个体
算法实现在矩阵上,一般把矩阵当作整个群体,矩阵的行向量代表一个个体。个体表示可行解,种群表示可行解集合。
2.基因和染色体
染色体表示可行的编码,基因表示可行的编码的分量。
3.编码
编码的目的是进行交叉、变异操作。以二进制编码为例,假设求[0,4]上f(x)最大值,我们用长度为6的编码表示x,从 [0 0 0 0 0 0]到[1 1 1 1 1 1],将编码映射到实数内为0-63,所以编码精度就是4/63≈0.0635。一般来说编码精度高,计算复杂度高,结果就精确。
4.适应度函数
适应度函数代表个体的适应能力,一般使用目标函数作为适应函数,使用函数唯一的要求是:对于输入能够计算出可比较的结果。
二、步骤
1.初始化,设置最大进化代数G,随机生成矩阵NP*L作为初始种群;
2.使用适应度函数进行个体评价,计算适应度;
3.选择操作,根据适用度排序,选择适应度大的个体遗传到下一代;
4.交叉操作,选中群体中的个体,按照一定概率交换他们的染色体编码;
5.变异操作,作用与整个群体,以一定概率改变其基因(编码)
6.循环2345,判断终止条件是否满足。
三、示例
1.求函数f(x)=x+10sin(5x)+7cos(4x)在[0,10]上的最大值
代码如下(示例):
clear all;
close all;
clc;
NP = 50;
L=20;
G=100;
Pc= 0.6;
Pm= 0.1;
Xs= 10;
Xx=0;
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; %m 二进制的0 1编码-->十进制数字,用于计算X(i)
end
x(i)=Xx+m*(Xs-Xx)/(2^j-1); %(Xs-Xx)/(2^j-1)是编码精度
Fit(i)=func1(x(i));
end
maxFit = max(Fit);
minFit = min(Fit);%max min 在返回向量的个体值,不返回索引
rr = find(maxFit == Fit); %记录Fit中的最大,find函数返回索引值
fBest = f(rr(1,1),:);%fBest ----1*20,double
xBest = x(rr(1,1)); %fBest ----int
Fit = (Fit-minFit)/(maxFit-minFit);
%--轮盘赌选择操作--%
sum_fit = sum(Fit);
fit_value = Fit./sum_fit; %计算Fit中每个个体适应能力的比 1*50 double
fit_value = cumsum(fit_value);
ms = sort(rand(NP,1)); % ms -- 1*50 double
fiti = 1;
new =1;
while new<=NP
if (ms(new)<fit_value(fiti))
nf(new,:)=f(fiti,:);
new = new+1;
else
fiti = fiti+1;
end
end
%--交叉操作--%
for i=1:2:NP
p=rand;
if p<Pc
q=randi([0,1],L);
for j=1:L
if q(j)==1 %要符合条件=1(=0就不会交叉)
temp=nf(i+1,j); %选择第i个染色体的第j个点进行交叉
nf(i+1,j)=nf(i,j);
nf(i,j)=temp;
end
end
end
end
%--变异操作--%
i =1;
while i<round(NP*Pm)
h =randi(NP,1,1);%随机生成一个1-NP的整数
for j =1:round(L*Pm)
g =randi(L,1,1);
nf(h,g)=~nf(h,g);
end
i=i+1;
end
f = nf;
f(1,:)=fBest;
trace(k)= maxFit;
end
xBest;
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
function result=func1(x)
fit= x+10*sin(5*x)+7*cos(47*x);
result=fit;
end