一、算法介绍
1、算法科学定义
遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。
2、算法过程
二、代码实现
% Optimizing a function using Simple Genetic Algorithm with elitist preserved
%Max f(x1,x2)=100*(x1*x1-x2).^2+(1-x1).^2; -2.0480<=x1,x2<=2.0480
%下面为代码。函数最大值为3904.9262,此时两个参数均为-2.0480,有时会出现局部极值,此时一个参数为-2.0480,一个为2.0480。变
%异概率pm=0.05,交叉概率pc=0.8。
clc;clear all;
format long;%设定数据显示格式
%初始化参数
T=500;%仿真代数
N=80;% 群体规模
pm=0.05;pc=0.8;%交叉变异概率
umax=30;umin=-30;%参数取值范围
L=10;%单个参数字串长度,总编码长度Dim*L
Dim=5;%Dim维空间搜索
bval=round(rand(N,Dim*L));%初始种群,round函数为四舍五入
bestv=-inf;%最优适应度初值
funlabel=1; %选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank
Drawfunc(funlabel);%画出待优化的函数,只画出二维情况作为可视化输出
%迭代开始
for ii=1:T
%解码,计算适应度
for i=1:N %对每一代的第i个粒子
for k=1:Dim
y(k)=0;
for j=1:1:L %从1到L,每次加以1
y(k)=y(k)+bval(i,k*L-j+1)*2^(j-1);%把第i个粒子转化为十进制的值,例如y1是第一维
end
x(k)=(umax-umin)*y(k)/(2^L-1)+umin;%转化为实际的x1
end
% obj(i)=100*(x1*x1-x2).^2+(1-x1).^2; %目标函数
obj(i)=fun(x,funlabel);
xx(i,:)=x;
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,Dim*L)<pm;%N行
mm(N,:)=zeros(1,Dim*L);%最后一行是精英不变异,强制赋0
bval(mm)=1-bval(mm);
end
%输出
figure;
plot(-Bfit1);% 绘制最优适应度进化曲线
bestv %输出最优适应度值
optxx %输出最优参数
三、运行结果
1、对Rastrigin函数的优化
函数:
function y = Rastrigin(x)
% Rastrigin函数
ize(x);
if row > 1
error( ' 输入的参数错误 ' );
end
y =sum(x.^2-10*cos(2*pi*x)+10);
%y =-y;
(1)种群数量为80,维度为2下的运行情况:
最优适应度 bestv= -0.340269261768334
曲线如下图所示:
(2)种群数量为80,维度为5下的运行情况:
最优适应度bestv =-70.936998103057434
曲线如下图所示:
(3)种群数量为80,维度为10下的运行情况:
最优适应度bestv = -3.505968366057157e+02
曲线如下图所示:
(4)种群数量为20,维度为2下的运行情况:
最优适应度bestv = -6.387462740070192
曲线如下图所示:
(5)种群数量为20,维度为5下的运行情况:
最优适应度bestv = -1.012998808734930e+02
曲线如下图所示:
(6)种群数量为20,维度为10下的运行情况:
最优适应度bestv = -3.188500137498714e+02
曲线如下图所示:
(7)种群数量为160,维度为2下的运行情况:
最优适应度bestv = -2.638246047721093
曲线如下图所示:
(8)种群数量为160,维度为5下的运行情况:
最优适应度bestv = -77.837625672597838
曲线如下图所示:
(9)种群数量为160,维度为10下的运行情况:
最优适应度bestv = -3.903941011093855e+02
曲线如下图所示:
2、对Schaffer函数的优化
function y=Schaffer(x)
[row,col]=size(x);
if row>1
error('输入的参数错误');
end
y1=x(1,1);
y2=x(1,2);
temp=y1^2+y2^2;
y=0.5-(sin(sqrt(temp))^2-0.5)/(1+0.001*temp)^2;
y=-y;
(1)种群数量为80,维度为2下的运行情况:
最优适应度bestv = 0.998279300372192
曲线如下图所示:
(2)种群数量为80,维度为5下的运行情况:
最优适应度bestv =0.998279300372192
曲线如下图所示:
(3)种群数量为80,维度为10下的运行情况:
最优适应度bestv =0.998279300372192
曲线如下图所示:
(4)种群数量为20,维度为2下的运行情况:
最优适应度bestv =0.990283762014982
曲线如下图所示:
(5)种群数量为20,维度为5下的运行情况:
最优适应度bestv =0.998279300372192
曲线如下图所示:
(6)种群数量为20,维度为10下的运行情况:
最优适应度bestv = 0.990283826870370
曲线如下图所示:
(7)种群数量为160,维度为2下的运行情况:
最优适应度bestv =0.998279300372192
曲线如下图所示:
(8)种群数量为160,维度为5下的运行情况:
最优适应度bestv =0.990283826870370
曲线如下图所示:
(9)种群数量为160,维度为10下的运行情况:
最优适应度bestv =0.998279300372192
曲线如下图所示:
3、对Griewank函数进行优化
函数原型
function y=Griewank(x)
[row,col]=size(x);
if row>1
error('输入的参数错误');
end
y1=1/4000*sum(x.^2);
y2=1;
for h=1:col
y2=y2*cos(x(h)/sqrt(h));
end
y=y1-y2+1;
%y=-y;
(1)种群数量为80,维度为2下的运行情况:
最优适应度bestv =-0.002365624260429
曲线如下图所示:
(2)种群数量为80,维度为5下的运行情况:
最优适应度bestv =-0.175201695728130
曲线如下图所示:
(3)种群数量为80,维度为10下的运行情况:
最优适应度bestv =-0.697222476886891
曲线如下图所示:
(4)种群数量为20,维度为2下的运行情况:
最优适应度bestv =-0.009016654299898
曲线如下图所示:
(5)种群数量为20,维度为5下的运行情况:
最优适应度bestv =-0.190313807872573
曲线如下图所示:
(6)种群数量为20,维度为10下的运行情况:
最优适应度bestv = -0.417540164252828
曲线如下图所示:
(7)种群数量为160,维度为2下的运行情况:
最优适应度bestv = -0.007983636880325
曲线如下图所示:
(8)种群数量为160,维度为5下的运行情况:
最优适应度bestv = -0.212774142623917
曲线如下图所示:
(9)种群数量为160,维度为10下的运行情况:
最优适应度bestv = -0.538710397369499
曲线如下图所示:
四、算法分析
1、从运行的速度上分析:以Rastrigin函数为例来分析
种群数量为80,维度为2下的运行情况:
1)
种群数量为80,维度为5下的运行情况:
种群数量为80,维度为10下的运行情况:
种群数量为80,维度为20下的运行情况:
从这些图中很容易可以得出:种群数量不变的情况下,解空间维度越大,运行时间也不断增加。
2)
种群数量为20,维度为2下的运行情况:
种群数量为80,维度为2下的运行情况:
种群数量为160,维度为2下的运行情况:
从这些图中很容易可以得出:解空间维度不变的情况下,种群数量增多,运行时间也不断增加。
2、从运行的精度分析
1)对于Rastrigin函数,当种群数量不变的情况下在维度2、5、10的情况下,最优适应度进化曲线在达到平稳状态时已迭代的次数随着维度的增加先减少后增加。
2)对于Schaffer函数,已迭代的次数随着维度的增加持续增加,但是其维度的变化对适应度函数的最优解几乎没有影响,其最优解的精度较为准确。
3)对于Griewank()函数,已迭代的次数随着维度的增加先增加后减少,其最优解随维度的增加而变小。