Matlabは、単項関数の最適値の問題を解決するために差分進化アルゴリズムを解きます

差分進化アルゴリズムはグローバルな最適アルゴリズムです。差分進化アルゴリズムでは、注意が必要ないくつかのポイントは、突然変異率F、交差率Cr、基底ベクトルr0、r1、およびr2の選択です。基底ベクトル、突然変異確率、交差確率の改善など、差分進化アルゴリズムの研究プロセスには多くの改善があります。ここで提供されるのは、古典的な差分進化アルゴリズムです。これは、古典的な差分進化アルゴリズムを使用して、単項関数の最適値の問題を解決します。
古典的な差分進化アルゴリズムの手順:
(1)初期化:x [i] [j] = xmin +(xmax-xmin)* rand(D、Np);
xmin-変数の上限; xmax-変数の下限; D-母集団数; Np-個体数;
(2)変動:v [i] [j] = x [r0] [j] +(x [r1] [j] -x [r2] [j])* F
は通常F0.5–09を取りますが、さまざまな関数で<0.5にすることもできます;
(3)クロス:u [i] [j] = v [i] [j] ---- Cr <rand( )
u [i] [j] = x [i] [j] ----- else
(4)選択:x [i] [j] = u [i] [j] —f(u)<f( x);
xg [i] [j] = x [i] [j] —else; gはサブ代数を指します
-----最大値または最小値を選択する決定は次のとおりです
以下を使用する場合単関数の最小値を解くための差分進化アルゴリズム:

% 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.950519,最小函数值为0.049740>> 

結果のグラフィック表示:

ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_51631044/article/details/112923612