首页 > 编程知识 正文

高中数学最优解问题,差分方程特解形式表

时间:2023-05-03 17:24:25 阅读:147765 作者:1662

差分进化算法求解函数最高值问题声明:

1 .本文源代码来自书目《智能优化算法及其MATLAB实例(第3版)》,旨在为MATLAB初学者提供更简单的代码分析,便于读者理解算法和MATLAB编程的基本原理。 2 .文中代码在每行后都有相应的注释,因此本文是适合所有代码水平学习者阅读的文章。 如果觉得有帮助的话,请夸奖我哦!

以下3.1、3.2、3.3三个例子都是求函数最高值的问题,采用差分进化算法编程实现,由于基本的代码框架相同,集中在一篇文章上,与阅读相比,更容易学习

例3.1计算函数f(x )=x12x22xn2(-20=Xi=20 ) )的最小值,其中个体x的维数n=10。 这是一个简单的平方和函数,在0的地方取0的极小点只有一个。

(在到目前为止的例2.2中,使用遗传算法来解决这样的问题

戳: https://blog.csdn.net/dhdjenrjj/article/details/115534284? spm=1001.2014.3001.5501 )

基于基本差分进化算法的解题代码如下。

差分进化算法求函数的极值。 clearall; %清除所有变量close all; %清图clc; %透明屏幕NP=50; %种群数量D=10; %每个向量的维数G=200; %最大进化代数F0=0.4; %初始变异算子在这个问题上采用自适应变异法(f值发生变化) CR=0.1; %交叉算子Xs=20; %上限Xx=-20; %下限yz=10^-6; %阈值%%%%所需的变量%%%%%%%%x=Zeros(d,NP ); %初始种群v=Zeros(d,NP ); %变异种群u=Zeros(d,NP ); %选择种群x=rand(d,NP ) ) *(Xs-Xx ) Xx; %随机生成初始种群%%%评估第一代种群计算目标函数%%form=1:npob(m )=func1(x ) :m ) ); 调用%代码段末尾的目标函数表达式来计算endtrace(1)=min (ob )。 差分进化周期%%forgen=1:g%%%变异操作%%%自适应变异算子f=f0*2^(lamda ); %变异采用随机方式x=rand,差向量个数y=1% for m=1:NP%依次以编号1-NP的向量为目标向量,分别对应的变异向量r1=PDDHB([1,NP],1,1,1 ) 从1-NP随机地选择编号作为r1while(R1==m ) R1=PDDHB([1,NP],1,1 ) ),并且R1是目标矢量编号值mendR2=PDDHB,NP ) [ 1,1,1,1,1 %r1while(r2==m ) )|(r2==r1 ) R2=PDDHB(1,NP ),1,1 ) %表示R2为目标矢量编号值m和R1endR3=PDDHB,NPHB ),1 1 ) )和保证不相等的1-NP开始随机r1while(r3==m )|(r3==r1 )|)|(r3==r2 ) R3=PDDHB([1,NP],1,1 ) 1-D到随机整数forn=1:dCr=rand(1; %生成【0,1】限定随机实数if(Cr=Cr )|(n==r ) %的条件可以保证至少1位发生变异u(n, )=v ) n, ); 当%满足条件时,用变异序列中对应位置个数elseu(n, )=x(n, )替换原始种群中与各矢量对应的位; endend%%%%%%%处理边界条件% % % % % % forn=1: dform=13360 npif (u (n,m ) Xx )|(u(n,m ) Xs ) ) ) ) %计算当前世代种群的每个向量的目标函数值,并评估endform=1x(x(:NPifob1(m ) ob(m ) x ) :m )=u ) :m ); %上一代的x

(gen-1)与本代选择种群u(gen)中各向量中选择目标函数值较优的,作为本代生成的种群x(gen) end end for m=1:NP Ob(m)=func1(x(:,m));%计算新种群目标函数值 end [minOb,index]=min(Ob); trace(gen+1)=min(Ob);%记录最优个体进化曲线 if min(Ob(m))<yz%若最优个体目标函数值小于阈值,则退出差分进化循环 break endenddisp(['最终最优个体为'])x(:,index)disp(['函数极小值为'])minOb%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%%%%%figureplot(trace);xlabel('迭代次数')ylabel('目标函数值')title('DE目标函数曲线')%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%function result=func1(x)summ=sum(x.^2);result=summ;end

最终,程序运行结果如下:

例3.2

求函数f(x,y)=3cos(xy)+x+y的最小值,其中x的取值范围为[-4,4]。这是一个有多个局部极值的函数。

基于基本差分进化算法的MATLAB程序如下:

%%%%%%%%%%%差分进化算法求二元函数最值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%clear all;%清除所有变量close all;%清图clc;%清屏NP=20;%种群数量D=2;%变量的维数为2,因为目标函数自变量x,y是两个G=100;%最大进化代数F=0.5;%变异算子CR=0.1;%交叉算子Xs=4;%上限Xx=-4;%下限%%%%%%%%%%%%定义所需变量并赋初值%%%%%%%%%%%%%%%%x=zeros(D,NP);%初始种群v=zeros(D,NP);%变异种群u=zeros(D,NP);%选择种群x=rand(D,NP)*(Xs-Xx)+Xx;%随机产生初始种群%%%%%%%%计算初代种群目标函数(适应度值)%%%%%%%%%%%for m=1:NP Ob(m)=func2(x(:,m));endtrace(1)=min(Ob);%%%%%%%%差分进化循环%%%%%%%%%%%%%%%%%%%%%%%%%for gen=1:G %%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%% %变异采取随机方式x=rand,差向量个数y=1% for m=1:NP%依次将序号值为1-NP的向量作为目标向量,分别生成相应变异向量 r1=pddhb([1,NP],1,1);%从1-NP中随机选择一个序号作为r1 while(r1==m) r1=pddhb([1,NP],1,1)%保证r1不等于目标向量序号值m end r2=pddhb([1,NP],1,1);%从1-NP中随机选择一个序号作为r1 while(r2==m)|(r2==r1) r2=pddhb([1,NP],1,1)%保证r2不等于目标向量序号值m与r1 end r3=pddhb([1,NP],1,1);%从1-NP中随机选择一个序号作为r1 while(r3==m)|(r3==r1)|(r3==r2) r3=pddhb([1,NP],1,1)%保证m,r1,r2,r3互不相等 end v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3));%生成第gen代种群中序号为m的向量对应的变异向量 end %%%%%%%%交叉操作%%%%%%%%%%%%%% r=pddhb([1,D],1,1);%从1-D生成随机整数 for n=1:D cr=rand(1);%生成【0,1】随机实数 if(cr<=CR)|(n==r)%限定这个条件,能够保证至少有一位发生变异 u(n,:)=v(n,:);%满足条件则将原种群每个向量相应位替换为变异数组中相应位置的数 else u(n,:)=x(n,:); end end %%%%%%利用边界吸收进行边界条件的处理%%%%%%%%%% for n=1:D for m=1:NP if u(n,m)<Xx u(n,m)=Xx; end if u(n,m)>Xs u(n,m)=Xs;%若超出所给范围,则使得该值改为与之最相近的边界值 end end end %%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%% for m=1:NP Ob1(m)=func2(u(:,m));%计算选择种群的各向量适应度 end for m=1:NP if Ob1(m)<Ob(m) x(:,m)=u(:,m);%选择两矩阵中编号为m的位置处,目标函数值更优的作为下一代 end end for m=1:NP Ob(m)=func2(x(:,m));%更新下一代适应度值 end trace(gen+1)=min(Ob);end [SortOb,Index]=sort(Ob);%按目标函数值升序排列best=x(:,Index);X=best(:,1)%最小值点Y=min(Ob)%最小值%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%%%%%%%figureplot(trace)xlabel('迭代次数')ylabel('目标函数值')title('DE目标函数曲线')%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%%function value=func2(x)value=3*cos(x(1)*x(2))+x(1)+x(2);%该函数的输入参数为x是一个二维向量,x(1)即x,x(2)即yend

最终程序运行效果如下:

例3.3

用离散差分进化算法求函数f(x,y)=-((x2+y-1)2+(x+y2-7)2)/200+10的最大值,其中x和y都是取值为-100到100之间的整数。

MATLAB程序如下:

%%%%%%%%%%%离散差分进化算法求二元函数最值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%clear all;%清除所有变量close all;%清图clc;%清屏NP=20;%种群数量D=2;%变量的维数为2,因为目标函数自变量x,y是两个G=100;%最大进化代数F=0.5;%变异算子CR=0.1;%交叉算子Xs=100;%上限Xx=-100;%下限%%%%%%%%%%%%定义所需变量并赋初值%%%%%%%%%%%%%%%%x=zeros(D,NP);%初始种群v=zeros(D,NP);%变异种群u=zeros(D,NP);%选择种群x=pddhb([Xx,Xs],D,NP);%随机产生初始种群%%%%%%%%计算初代种群目标函数(适应度值)%%%%%%%%%%%for m=1:NP Ob(m)=func3(x(:,m));endtrace(1)=max(Ob);%%%%%%%%差分进化循环%%%%%%%%%%%%%%%%%%%%%%%%%for gen=1:G %%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%% %变异采取随机方式x=rand,差向量个数y=1% for m=1:NP%依次将序号值为1-NP的向量作为目标向量,分别生成相应变异向量 r1=pddhb([1,NP],1,1);%从1-NP中随机选择一个序号作为r1 while(r1==m) r1=pddhb([1,NP],1,1)%保证r1不等于目标向量序号值m end r2=pddhb([1,NP],1,1);%从1-NP中随机选择一个序号作为r1 while(r2==m)|(r2==r1) r2=pddhb([1,NP],1,1)%保证r2不等于目标向量序号值m与r1 end r3=pddhb([1,NP],1,1);%从1-NP中随机选择一个序号作为r1 while(r3==m)|(r3==r1)|(r3==r2) r3=pddhb([1,NP],1,1)%保证m,r1,r2,r3互不相等 end v(:,m)=floor(x(:,r1)+F*(x(:,r2)-x(:,r3)));%离散DE算法要向下取整生成第gen代种群中序号为m的向量对应的变异向量 end %%%%%%%%交叉操作%%%%%%%%%%%%%% r=pddhb([1,D],1,1);%从1-D生成随机整数 for n=1:D cr=rand(1);%生成【0,1】随机实数 if(cr<=CR)|(n==r)%限定这个条件,能够保证至少有一位发生变异 u(n,:)=v(n,:);%满足条件则将原种群每个向量相应位替换为变异数组中相应位置的数 else u(n,:)=x(n,:); end end %%%%%%利用边界吸收进行边界条件的处理%%%%%%%%%% for n=1:D for m=1:NP if u(n,m)<Xx u(n,m)=Xx; end if u(n,m)>Xs u(n,m)=Xs;%若超出所给范围,则使得该值改为与之最相近的边界值 end end end %%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%% for m=1:NP Ob1(m)=func3(u(:,m));%计算选择种群的各向量适应度 end for m=1:NP if Ob1(m)>Ob(m) x(:,m)=u(:,m);%选择两矩阵中编号为m的位置处,目标函数值更优的作为下一代 end end for m=1:NP Ob(m)=func3(x(:,m));%更新下一代适应度值 end trace(gen+1)=max(Ob);end[SortOb,Index]=sort(Ob);%按目标函数值升序排列,Index是一个按照适应度升序排列的序号数组sort_x=x(:,Index);X=sort_x(:,end)%最大值点Y=max(Ob)%最大值%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%%%%%%%figureplot(trace);xlabel('迭代次数')ylabel('目标函数值')title('DE目标函数曲线')%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%%function value=func3(x)value=-((x(1).^2+x(2)-1).^2+(x(1)+x(2).^2-7).^2)/200+10;%该函数的输入参数为x是一个二维向量,x(1)即x,x(2)即yend

最终程序运行结果如下:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。