根据差分进化算法编写Matlab程序的过程

 时间:2024-10-12 18:27:16

1、所根据的算法如图1所示

根据差分进化算法编写Matlab程序的过程
根据差分进化算法编写Matlab程序的过程

2、首先定义常量,包括最大迭代次数、搜索范围、个体维度、缩放因子等。程序如下maxIteration=1000;%最大迭代次数Generation=0;%进化代数,或者当前迭代代数Xmax=30;%搜索上界,可以根据需要改为向量形式Xmin=-30;%搜索下界Dim=30;%个体维数NP=50;%population size,种群规模F=0.5;%scaling factor 缩放因子CR=0.3;%crossover rate 交叉概率FunIndex=3;%测试方程索引mutationStrategy=1;%变异策略crossStrategy=1;%交叉策略

3、步骤1:对应算法中Step 1,即初始化X=(Xmax-Xmin)*rand(NP,Dim)+Xmin;%X:行代表个体i,列代表i的维度j

4、步骤2:对应算法中Step 2:%step2 mutation,crosso箪滹埘麽ver,selectionwhile Generation<罪焐芡拂maxIteration%求bestX for i=1:NP fitnessX(i)=testFun(X(i,:),FunIndex);%fitnessX表示X的适应值 end [fitnessbestX,indexbestX]=min(fitnessX);%fitnessbestX最优适应值 bestX=X(indexbestX,:);%bestX表示最优值对应的位置%%%step2.1 mutation%mutationStrategy=1:DE/rand/1,%mutationStrategy=2:DE/best/1,%mutationStrategy=3:DE/rand-to-best/1,%mutationStrategy=4:DE/best/2,%mutationStrategy=5:DE/rand/2,%产生为每一个个体Xi,G 产生一个变异向量Vi,G。 G代表进化代数 V=mutation(X,bestX,F,mutationStrategy);%% %step2.2 crossover%crossStrategy=1:binomial crossover%crossStrategy=2:Exponential crossover%产生为每一个个体Xi,G 产生一个交叉向量Ui,G。 G代表进化代数 U=crossover(X,V,CR,crossStrategy);%% %step2.3 selection for i=1:NP fitnessU(i)=testFun(U(i,:),FunIndex); if fitnessU(i)<=fitnessX(i) X(i,:)=U(i,:); fitnessX(i)=fitnessU(i); if fitnessU(i)<fitnessbestX bestX=U(i,:); fitnessbestX=fitnessU(i); end end end%% Generation=Generation+1; bestfitnessG(Generation)=fitnessbestX;end

5、步骤3:显示结果%画图%plot(bestfitnessG);optValue=num2str(fitnessbestX);Location=num2str(bestX);disp(strcat('the optimal value','=',optValue));disp(strcat('the best location','=',Location));

6、%变异向量用函数mutation(X,bestX,F,mutationStrategy)functi泠贾高框on V=mutation(X,bestX,F,mutationStrategy)NP=length(X);for i=1:NP %在[1 NP]中产生nrandI个互不相等的随机数,且与i皆不相等 nrandI=5; r=randi([1,NP],1,nrandI); for j=1:nrandI equalr(j)=sum(r==r(j)); end equali=sum(r==i); equalval=sum(equalr)+equali; while(equalval>nrandI) r=randi([1,NP],1,nrandI); for j=1:nrandI equalr(j)=sum(r==r(j)); end equali=sum(r==i); equalval=sum(equalr)+equali; end switch mutationStrategy case 1 %mutationStrategy=1:DE/rand/1; V(i,:)=X(r(1),:)+F*(X(r(2),:)-X(r(3),:)); case 2 %mutationStrategy=2:DE/best/1; V(i,:)=bestX+F*(X(r(1),:)-X(r(2),:)); case 3 %mutationStrategy=3:DE/rand-to-best/1; V(i,:)=X(i,:)+F*(bestX-X(i,:))+F*(X(r(1),:)-X(r(2),:)); case 4 %mutationStrategy=4:DE/best/2; V(i,:)=bestX+F*(X(r(1),:)-X(r(2),:))+F*(X(r(3),:)-X(r(4),:)); case 5 %mutationStrategy=5:DE/rand/2; V(i,:)=X(r(1),:)+F*(X(r(2),:)-X(r(3),:))+F*(X(r(4),:)-X(r(5),:)); otherwise error('没有所指定的变异策略,请重新设定mutationStrategy的值'); end end

根据差分进化算法编写Matlab程序的过程
根据差分进化算法编写Matlab程序的过程

7、%交叉函数,根据算法中提供的两种交叉方法编写,即binomial crossover和%Exponential crossoverfunction U=crossover(X,V,CR,crossStrategy)%V为产生的变异向量[NP,Dim]=size(X);switch crossStrategy %crossStrategy=1:binomial crossover case 1 for i=1:NP jRand=floor(rand*Dim);%由于jRand要在[0,1)*Dim中取值,故而用fl%oor for j=1:Dim if rand<CR||j==jRand U(i,j)=V(i,j); else U(i,j)=X(i,j); end end end %crossStrategy=2:Exponential crossover case 2 for i=1:NP j=floor(rand*Dim);%由于j在[0,1)*Dim中取值,故而用floor L=0; U=X; U(i,j)=V(i,j); j=mod(j+1,D); L=L+1; while(rand<CR&&L<Dim) U(i,j)=V(i,j); j=mod(j+1,D); L=L+1; end end otherwise error('没有所指定的交叉策略,请重新设定crossStrategy的值');end

8、%测试函数,可以根据需要添加相应的程序function y=testFun(x,index)%x代表参数,index代表测试的函数的选择%该测试函数为通用测试函数,可以移植%目录% 函数名 位置 最优值%1.Sphere 0 0%2.Camel 多个 %3.Rosenbrockswitch index case 1 %Sphere函数 y=sum(x.^2); case 2 %Camel函数,Dim只能取2 if length(x)>2 error('x的维度超出了2'); end xx=x(1);yy=x(2);y=(4-2.1*xx^2+xx^4/3)*xx^2+xx*yy+(-4+4*yy^2)*yy^2; case 3 %Rosenbrock函数 y=0; for i=2:length(x) y=y+100*(x(i)-x(i-1)^2)^2+(x(i-1)-1)^2; end otherwise disp('no such function, please choose another');end

  • 黑枸杞的作用及食用禁忌
  • 如何增亮大灯 宝马5系车灯升级改装 广州改灯
  • 南瓜的手绘画法
  • 肉松面包制作过程
  • 母婴行业的开店真实经历
  • 热门搜索
    好书伴我行手抄报 孝敬父母手抄报 弘扬法治精神手抄报 抗战手抄报图片 迎中秋庆国庆手抄报简单又漂亮 孝敬父母手抄报内容 环保小报手抄报 畅想未来手抄报 关于创文的手抄报 预防登革热手抄报