遗传算法是一种非常有用的算法,可以用于求解最小值,TSP问题等等
对于算法基本思想,这里就不写了,毕竟到处都有,直接给出一个用遗传算法求解最小值的matlab代码(附有详细注释)
% 罗森布罗克 ( Rosenbrock ) 函数为f(x1, x2) = 100(x1^2 - x2)^2 + (1 - x1)^2 ,试用遗传算法计算此函数在区域 内的最大值。
clear all
clc
format long; %设定数据显示格式
%初始化参数
T=100; %进化代数
N=80; % 群体规模
pm=0.05; pc=0.8; %交叉变异概率
umax=2.048; umin=-2.048; %参数取值范围
L=10; %单个参数字串长度,总码串长度2L
bval=round(rand(N,2*L)); %初始种群
bestv=-inf; %最优适应度初值
%迭代开始
for ii=1:T
%解码,计算适应度
for i=1:N
y1=0;y2=0;
for j=1:1:L
y1=y1+bval(i,L-j+1)*2^(j-1);
end
x1=(umax-umin)*y1/(2^L-1)+umin;
for j=1:1:L
y2=y2+bval(i,2*L-j+1)*2^(j-1);
end
x2=(umax-umin)*y2/(2^L-1)+umin;
obj(i)=100*(x1*x1-x2).^2+(1-x1).^2;
%目标函数值
xx(i,:)=[x1,x2];
end
func=obj; %目标函数转换为适应度函数
p=func./sum(func);
q=cumsum(p); %累加,形成部分和序列
[fmax,indmax]=max(func); %求当代最佳个体
if fmax>=bestv
bestv=fmax; %到目前为止最优适应度值
bvalxx=bval(indmax,:); %到目前为止最佳位串
optxx=xx(indmax,:); %到目前为止最优参数
end
Bfit1(ii)=bestv; % 存储每代的最优适应度
%%%%遗传操作开始,使用赌轮选择
for i=1:(N-1)
r=rand; tmp=find(r<=q); newbval(i,:)=bval(tmp(1),:);
end
newbval(N,:)=bvalxx; %最优保留
bval=newbval;
%%%%单点交叉
for i=1:2:(N-1)
cc=rand;
if cc<pc
point=ceil(rand*(2*L-1)); %取得一个1到2L-1的整数
ch=bval(i,:);
bval(i,point+1:2*L)=bval(i+1,point+1:2*L);
bval(i+1,point+1:2*L)=ch(1,point+1:2*L);
end
end
bval(N,:)=bvalxx; %最优保留
%%%%位点变异
mm=rand(N,2*L)<pm; %N行2L列随机数,小于pm的元素变成逻辑数1,
%大于pm的元素变成逻辑数0
mm(N,:)=zeros(1,2*L); %最后一行不变异,强制赋0
bval(mm)=1-bval(mm); % 矩阵mm中每个逻辑数1指示bval中与其位置相同的
%元素x变为1-x,即0,1互换
end
%输出
plot(Bfit1); % 绘制最优适应度进化曲线
bestv %输出最优适应度值
optxx %输出最优参数