我研究的方向是智能算法,目前研究差分演化算法、遗传算法,对于差分演化算法有很好的全局最优性,所以也是许多人研究的方向。今天分享一下自己写的程序,对于解决一元函数求解最值问题,怎样利用差分演化算法来解决。如果感兴趣,自己可以在此代码的基础上改进做多元函数的最值问题、甚至可以做多目标问题的最优化问题等,都可以在此代码上改进。
有些人会说了,智能算法能解决的事,数学也可以,针对一元函数的最值问题,直接利用函数求导即可。是的,这样是可以的。但是如果你遇到隐函数问题你该怎样解决?比如此算法解决的函数f(x)=x.*sin(10*x.*pi)+2最值问题,直接求导,显然不好处理,也不好求出结果。所以才提出智能算法解决诸类问题。
同时在这些的基础上,我们的智能算法可以应用到许多的实际问题当中,能很好的解决问题。对于差分演化算法的研究问题有非常多,就不一一阐述,感兴趣的可以推荐如下这本书:《差分进化算法》
这本书是翻译版,但是整体上还是翻译不错的!如果你是从事差分演化算法或者即将想研究差分演化算法的推荐看这本书,里面对于此算法的原理以及研究是写的非常好的,但是此书需要一点数学功底的人在能看懂,很多东西讲的很深入,看完此书你一定对差分算法有一个全新的认识!如果需要此书电子版的留言私信我!
程序及案例:
% DE算法的应用----针对一元函数
% 求解函数的最大值/最小值
% 解决问题:求解函数f(x)=x.*sin(10*x.*pi)+2
% 时间:2020.12.23
% 工具:matlab2018a
% 注意点:对于循环最好采用分步循环,最好做一个大循环,原因在于多次子循环将导致部分精度丢失
clc
clear
% 定义初始值
D=50;
Np=1;
Ft=0.5; %后期对其进行改进
Cr=0.8;
xmax=2;
xmin=-1;
K=100; %迭代次数
%种群初始化
x=xmin+(xmax-xmin)*rand(D,1);
F=Ft+0.001*(rand(D,1)-0.5); %改进后的变异因子
best=x(1,:); %选取其中一个最为最优值,为后面选取最优值做准备
tx=[xmin:0.01:xmax];
f=fun_DE(tx);
figure(1)
plot(tx,f,'b')
hold on
f0=fun_DE(best);
plot(best,f0,'ro','linewidth',2);
%保存最优子代
for i=2:D
if fun_DE(best)>fun_DE(x(i,:))
best=x(i,:);
end
end
fi=fun_DE(best); %把最优值传递给fi
% 进行变异、交叉、选择
for n=1:K
time(n)=n; %做这一步的原因在于显示在哪个位置进行收敛
% %变异
for i=1:D
r0=0;r1=0;r2=0;
while( r0==i||r1==i||r2==i||r0==r1||r0==r2||r1==r2)
r0=ceil(D*rand(1));
r1=ceil(D*rand(1));
r2=ceil(D*rand(1));
end
v(i,:)=x(r0,:)+F(i,:)*(x(r1,:)-x(r2,:));
for j=1:Np %检查是否越界
if(v(i,j)<xmin(j))
v(i,j)=xmin(j);
elseif(v(i,j)>xmax(j))
v(i,j)=xmax(j);
end
end
%交叉
for j=1:Np
if rand(1)<Cr
u(i,j)=v(i,j);
else
u(i,j)=x(i,j);
end
end
%选择
if fun_DE(u(i,:))<fun_DE(x(i,:))
x(i,:)=u(i,:);
end
if fun_DE(x(i,:))<fi
% fi=fun_DE1(x(i,:));
end
best=x(i,:);
best_f(n)=fun_DE(best);
end
end
plot(best,best_f(n),'ro','linewidth',2)
xlabel('x');ylabel('J');
title('函数最大值');
fprintf('最优解结果为%f,%f',best);
fprintf('最大函数值为%f',best_f(n)); %打印最优
figure(2)
plot(time,best_f(time),'r-');
xlabel('迭代次数');ylabel('最优值');
title('迭代后的最优结果')
输出结果:
最优解结果为1.850547,最大函数值为3.850274>>
输出图形:
从上输出结果与图形对比,结果一致,大概经过30次迭代左右函数就收敛了。这里输出的是最大值,那么输出最小值只需相应的修改即可求其在区间上的最小值!
现在随着机器学习、深度学习很多人开始学习python,这里推荐获取特价python编程的课程!
关注知乎,留言你的问题!