Práctica del algoritmo NSGA-II (con código fuente de MATLAB)

1. Principio del algoritmo NSGA-II

El nombre completo del algoritmo NSGA-II es Algoritmo genético de clasificación no dominado II (Algoritmo genético de clasificación no dominado II, NSGA-II). El algoritmo es una mejora de NSGA y se usa para resolver problemas complejos de optimización de múltiples objetivos. NSGA-II introduce la clasificación no dominada, el grado de aglomeración, el operador de comparación del grado de aglomeración y la estrategia de élite sobre la base de NSGA. Los tres métodos de clasificación no dominada, grado de aglomeración, operador de comparación del grado de aglomeración y estrategia elitista se presentarán en detalle a continuación.

(1) Tipo no dominado

La clasificación no dominada utiliza el concepto de solución óptima de Pareto para clasificar a los individuos de la población. Cuanto mayor sea el estado no dominado, mayor será el nivel del individuo, de modo que se puedan seleccionar los individuos más excelentes, de modo que tengan una mayor posibilidad de entrar en la siguiente iteración.

Suponga que hay parámetros N(i) y S(i) para cada individuo, donde N(i) representa el número de individuos solución que dominan al individuo i en la población, y S(i) puede dominar el conjunto de soluciones para el individuo i .

Su algoritmo es:

(a) Primero busque el individuo con N(i)=0 en la población y guárdelo en el conjunto actual F1;

(b) Luego, para cada individuo j en el conjunto actual F1, examine el conjunto individual S(j) que domina, y reste 1 de n(k) de cada individuo k en el conjunto S(j), es decir, el dominación El número de individuos solución del individuo k se reduce en 1 (porque el individuo j que domina al individuo k se ha almacenado en el conjunto actual F1)

(c) Si n(k)-1=0, almacene k individual en otro conjunto F2. Finalmente, tome F1 como el conjunto de primer nivel de individuos no dominados y asigne el mismo rango i (rango) no dominado a los individuos del conjunto, y luego continúe realizando la operación jerárquica mencionada anteriormente en H y asigne el rango no dominado correspondiente hasta que todos los individuos sean calificados. Repita los pasos (a)-(b) hasta que todos los individuos hayan sido procesados.

El pseudocódigo es el siguiente:

(2) Grado de congestión y operador de comparación de grado de congestión

El grado de hacinamiento solo es aplicable a la comparación entre individuos del mismo nivel de dominancia, calculando el grado de hacinamiento para cada función objetivo de cada individuo se puede obtener el grado de hacinamiento de cada individuo y el grado de excelencia de los individuos. se puede comparar a través del grado de apiñamiento. La distancia de aglomeración id se define de la siguiente manera: la distancia de aglomeración es igual a la suma de las distancias entre las dos soluciones antes y después de la solución en la dirección de cada función objetivo. En dos dimensiones, es igual a la mitad del perímetro del eje rectangular de la imagen.

El pseudocódigo de su cálculo es el siguiente:

operador de comparación de congestión

A partir de la figura, podemos ver que cuando el valor de id de la distancia de aglomeración es pequeño, significa que el entorno del individuo está relativamente abarrotado. Para mantener la diversidad de la población, necesitamos un cálculo más completo para garantizar que el algoritmo pueda converger en una superficie de Pareto uniformemente distribuida. Al seleccionar individuos, es necesario comparar los pros y los contras de los individuos, para individuos con diferentes niveles de dominancia, cuanto menor sea el nivel de dominancia, mejor, para individuos con el mismo nivel de dominancia, se compara la distancia de hacinamiento: cuanto mayor sea la distancia , cuanto mejor cuanto menor sea la densidad, cuanto más uniforme sea la distribución, mejor. Las reglas de comparación son las siguientes:

(3) Estrategia de élite

Para evitar que el individuo óptimo del grupo actual se pierda en la próxima generación, lo que provocaría que el algoritmo genético no pudiera converger a la solución óptima global, se propone una estrategia de élite. En el proceso de evolución, el mejor individuo que ha aparecido hasta ahora en la población se copia directamente a la siguiente generación sin manipulación genética, y generalmente es reemplazado por el peor individuo de la siguiente generación. La estrategia de retención de élite mejora la capacidad de convergencia global del algoritmo genético estándar.

(4) Diagrama de flujo del algoritmo

2. Código de combate

%%主函数
%主程序
function Main()
clc;format short;addpath public;


    %算法名称
    Algorithm = {'NSGA-II'};
    %测试问题
    Problem = {'ZDT1'};
    %问题维数
    Objectives =2;


    %程序运行


    Start(Algorithm,Problem,Objectives,1);
end

%NSGA-II
function MAIN(Problem,M,Run)
clc;format compact;tic;
%-----------------------------------------------------------------------------------------
%参数设定
    [Generations,N] = P_settings('NSGA-II',Problem,M);
%-----------------------------------------------------------------------------------------
%算法开始
    %初始化种群
    [Population,Boundary,Coding] = P_objective('init',Problem,M,N);
     FunctionValue = P_objective('value',Problem,M,Population);
     FrontValue = DSort(FunctionValue);
     CrowdDistance = F_distance(FunctionValue,FrontValue);


    %开始迭代
    for Gene = 1 : Generations    
        %产生子代
        MatingPool = F_mating(Population,FrontValue,CrowdDistance);
        Offspring = P_generator(MatingPool,Boundary,Coding,N);
        Population = [Population;Offspring];
        FunctionValue = P_objective('value',Problem,M,Population);
        [FrontValue,MaxFront] = P_sort(FunctionValue,'half');
        CrowdDistance = F_distance(FunctionValue,FrontValue);


        %选出非支配的个体        
        Next = zeros(1,N);
        NoN = numel(FrontValue,FrontValue1:NoN) = find(FrontValue'descend');
        Next(NoN+1:N) = Last(Rank(1:N-NoN));


        %下一代种群
        Population = Population(Next,:);
        FrontValue = FrontValue(Next);
        CrowdDistance = CrowdDistance(Next);


        clc;fprintf('NSGA-II,第%2s轮,%5s问题,第%2s维,已完成%4s%%,耗时%5s秒\n',num2str(Run),Problem,num2str(M),num2str(roundn(Gene/Generations*100,-1)),num2str(roundn(toc,-2)));
    end
%-----------------------------------------------------------------------------------------     
%生成结果
    P_output(Population,toc,'NSGA-II',Problem,M,Run);
end

 

La pantalla de resultados:

Supongo que te gusta

Origin blog.csdn.net/qq_45013535/article/details/129618160
Recomendado
Clasificación