Matlab resuelve el algoritmo de evolución diferencial para resolver el problema del valor óptimo de la función unaria

El algoritmo de evolución diferencial es un algoritmo óptimo global En el algoritmo de evolución diferencial, varios puntos a los que se debe prestar atención son la tasa de mutación F, la tasa de cruce Cr, la elección del vector base r0, r1 y r2 . Hay muchas mejoras en el proceso de estudio del algoritmo de evolución diferencial, como la mejora del vector base, la probabilidad de mutación y la probabilidad de cruce. Lo que se proporciona aquí es el algoritmo de evolución diferencial clásico, que utiliza el algoritmo de evolución diferencial clásico para resolver el problema del valor óptimo de la función unaria.
Los pasos del algoritmo de evolución diferencial clásico:
(1) Inicialización: x [i] [j] = xmin + (xmax-xmin) * rand (D, Np),
xmin: límite superior de la variable, xmax: límite inferior de la variable; D: número de población; Np: número de individuos;
(2) Variación: v [i] [j] = x [r0] [j] + (x [r1] [j] -x [r2] [j]) * F
usualmente toma F 0.5–09; pero también es posible ir a <0.5 para diferentes funciones;
(3) Cruce: u [i] [j] = v [i] [j] ---- Cr <rand ( )
u [i] [j] = x [i] [j] ----- else
(4) Opción: x [i] [j] = u [i] [j] —f (u) <f ( x);
xg [i] [j] = x [i] [j] —else; g se refiere a la subálgebra
----- Aquí está la decisión de elegir el valor máximo o mínimo.
El siguiente es un caso de uso algoritmo de evolución diferencial para resolver el valor mínimo de una función unaria:

% 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>> 

Visualización gráfica de resultados:

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_51631044/article/details/112923612
Recomendado
Clasificación