算法函数_matlab实现差分演化算法求解函数的最值

本文介绍了如何运用差分演化算法解决一元函数的最值问题,通过Matlab代码展示了算法过程,并指出对于隐函数等复杂问题,智能算法的优势。此外,还推荐了一本关于差分演化算法的书籍,以及如何在此基础上改进求解多元函数和多目标优化问题。
摘要由CSDN通过智能技术生成

fb6bcd625151c13b9177d593319a30eb.png

我研究的方向是智能算法,目前研究差分演化算法、遗传算法,对于差分演化算法有很好的全局最优性,所以也是许多人研究的方向。今天分享一下自己写的程序,对于解决一元函数求解最值问题,怎样利用差分演化算法来解决。如果感兴趣,自己可以在此代码的基础上改进做多元函数的最值问题、甚至可以做多目标问题的最优化问题等,都可以在此代码上改进。

有些人会说了,智能算法能解决的事,数学也可以,针对一元函数的最值问题,直接利用函数求导即可。是的,这样是可以的。但是如果你遇到隐函数问题你该怎样解决?比如此算法解决的函数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>>

输出图形:

f03e4fa6bf3d258e348c83be5fa155b2.png

142483dcefa9624778b6ca91dd61307c.png

从上输出结果与图形对比,结果一致,大概经过30次迭代左右函数就收敛了。这里输出的是最大值,那么输出最小值只需相应的修改即可求其在区间上的最小值

现在随着机器学习、深度学习很多人开始学习python,这里推荐获取特价python编程的课程!

关注知乎,留言你的问题!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值