Algoritmo de salp multiobjetivo Combate real de MATLAB (con código fuente)

Hoy compartiré con ustedes el algoritmo salp multiobjetivo, principalmente a partir del principio del algoritmo y la práctica del código. Aquellos que necesitan comprender las teorías relacionadas con los algoritmos inteligentes, el aprendizaje automático, el aprendizaje profundo y el procesamiento de señales pueden enviar mensajes privados en segundo plano. El contenido compartido en el próximo número es lo que desea saber.

1. Principio del algoritmo

El algoritmo SSA compartido en el artículo anterior puede acercar las salpas a la fuente de alimento y actualizarla durante el proceso iterativo. Sin embargo, este algoritmo no puede resolver el problema multiobjetivo principalmente por las siguientes dos razones:

1. SSA solo almacena una solución como la mejor solución, por lo que no puede almacenar varias soluciones como la mejor solución para un problema de objetivos múltiples.

2. SSA actualiza la fuente de alimento con la solución óptima obtenida hasta el momento en cada iteración, pero no existe una única solución óptima para problemas de objetivos múltiples.

El algoritmo Multi-objetivo Salp Swarm (SSA) se propone sobre la base del algoritmo SSA para problemas multiobjetivo.

Para conocer el principio del algoritmo SSA, puede consultar el artículo anterior: Algoritmo de grupo Salp Combate real de MATLAB

Para obtener algunas explicaciones relacionadas con problemas de objetivos múltiples, consulte mi artículo anterior: Algoritmo de enjambre de partículas de objetivos múltiples Combate MATLAB

El primer problema se resuelve equipando el algoritmo SSA con una biblioteca de fuentes de alimentos. Este repositorio mantiene las soluciones óptimas obtenidas hasta el momento durante el proceso de optimización, como un archivo en la optimización de enjambres de partículas multiobjetivo (MOPSO) [78]. El repositorio tiene un tamaño máximo para almacenar un número finito de soluciones óptimas. Durante la optimización, cada salp se compara con todas las propuestas originales del repositorio utilizando el operador de dominancia de Pareto . Si una salpa domina el depósito, deben intercambiarse (poner la salpa en el depósito, el plan original fuera). Si una salp es superior a un conjunto de soluciones en el repositorio, entonces el conjunto de soluciones debe eliminarse del repositorio por completo y la salp debe agregarse al repositorio. Si al menos una de las soluciones originales en el repositorio es mejor que la salp, entonces la salp debe descartarse y no agregarse al repositorio.

Si salp es mutuamente excluyente en comparación con todos los residentes del repositorio, entonces salp es la solución óptima y debe agregarse al repositorio.

Estas reglas aseguran que el repositorio siempre obtenga la solución óptima obtenida por el algoritmo hasta el momento. Sin embargo, hay un caso especial, es decir, el repositorio está lleno y la salp no es dominante en comparación con la solución original del repositorio. En este momento, la salp debería haberse agregado al repositorio, pero el repositorio está lleno. . Por supuesto, la forma más fácil es eliminar aleatoriamente una de las soluciones del archivo y reemplazarla con esta salp.

Un enfoque más sensato sería eliminar una solución similar no dominada del repositorio: el mejor candidato para la eliminación del archivo se encuentra en una región densamente poblada. Este enfoque mejora la distribución de propuestas en el repositorio durante la iteración.

Para encontrar una solución no dominada con una población en el vecindario, es necesario calcular el número de soluciones con una cierta distancia máxima en el vecindario. La definición de esta distancia es:

Max y min son dos vectores que almacenan los valores máximo y mínimo de cada función objetivo, respectivamente. Un repositorio con una solución en cada segmento es el mejor de los casos. Después de asignar un nivel a cada residencia de repositorio en función de la cantidad de soluciones adyacentes, se usa una rueda de ruleta para seleccionar una para eliminarla. Cuanto mayor sea el número de soluciones adyacentes a una solución (cuanto mayor sea el número de niveles), es más probable que se elimine del repositorio. La Figura 1 muestra un ejemplo de este mecanismo de actualización del repositorio. Tenga en cuenta que los vecindarios deben definirse para todas las soluciones, pero en este gráfico solo se estudian 4 soluciones no dominadas.

Figura 1 Mecanismo de actualización cuando el repositorio está lleno

Como se muestra en la figura, luego de introducir el mecanismo de actualización del repositorio, el segundo problema de usar SSA para resolver problemas multiobjetivo es la selección de fuentes de alimentos, ya que existe más de una solución óptima en el espacio de búsqueda multiobjetivo. Del mismo modo, las fuentes de alimentos se pueden seleccionar al azar del depósito. Sin embargo, un enfoque más apropiado es elegir la región menos poblada de un conjunto de soluciones óptimas . Esto se puede hacer usando el mismo proceso de clasificación y selección de la rueda de la ruleta que se usa en el operador de mantenimiento del repositorio. La principal diferencia es la probabilidad de elegir la solución óptima. En la eliminación de mantenimiento del repositorio, es más probable que se seleccionen soluciones con un rango más alto (aglomeración de vecinos). Por el contrario, para la solución óptima en el repositorio, cuanto más pequeña es la población (menor número de rango), más probable es que se seleccione como fuente de alimento. (De esta manera, se pueden desarrollar más áreas inexploradas y se puede fortalecer la capacidad de búsqueda global. Si continúa buscando en áreas densas, es fácil caer en el óptimo local, y elegir áreas dispersas como alimento puede reducir la posibilidad de caer en el óptimo local.) Como se muestra en la Figura 2, la solución óptima sin soluciones adyacentes en el medio se selecciona como la fuente de alimento con la probabilidad más alta.

Figura 2 El punto blanco en el cuadro rojo tiene la mayor probabilidad de ser seleccionado como fuente de alimento

El pseudocódigo del algoritmo MSSA se muestra en la Figura 3.

Figura 3 Pseudocódigo del algoritmo MSSA

2. Código de combate

Utilice ZDT1 como función de prueba para llevar a cabo el experimento de simulación

clc;
clear;
close all;

% Change these details with respect to your problem%%%%%%%%%%%%%%
ObjectiveFunction=@ZDT1;
dim=5;
lb=0;
ub=1;
obj_no=2;

if size(ub,2)==1
    ub=ones(1,dim)*ub;
    lb=ones(1,dim)*lb;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

max_iter=100;
N=200;
ArchiveMaxSize=100;

Archive_X=zeros(100,dim);
Archive_F=ones(100,obj_no)*inf;

Archive_member_no=0;

r=(ub-lb)/2;
V_max=(ub(1)-lb(1))/10;

Food_fitness=inf*ones(1,obj_no);
Food_position=zeros(dim,1);

Salps_X=initialization(N,dim,ub,lb);
fitness=zeros(N,2);

V=initialization(N,dim,ub,lb);
iter=0;

position_history=zeros(N,max_iter,dim);

for iter=1:max_iter
    
    c1 = 2*exp(-(4*iter/max_iter)^2); % Eq. (3.2) in the paper
    
    for i=1:N %Calculate all the objective values first
        Salps_fitness(i,:)=ObjectiveFunction(Salps_X(:,i)');
        if dominates(Salps_fitness(i,:),Food_fitness)
            Food_fitness=Salps_fitness(i,:);
            Food_position=Salps_X(:,i);
        end
    end
    
    [Archive_X, Archive_F, Archive_member_no]=UpdateArchive(Archive_X, Archive_F, Salps_X, Salps_fitness, Archive_member_no);
    
    if Archive_member_no>ArchiveMaxSize
        Archive_mem_ranks=RankingProcess(Archive_F, ArchiveMaxSize, obj_no);
        [Archive_X, Archive_F, Archive_mem_ranks, Archive_member_no]=HandleFullArchive(Archive_X, Archive_F, Archive_member_no, Archive_mem_ranks, ArchiveMaxSize);
    else
        Archive_mem_ranks=RankingProcess(Archive_F, ArchiveMaxSize, obj_no);
    end
    
    Archive_mem_ranks=RankingProcess(Archive_F, ArchiveMaxSize, obj_no);
    % Archive_mem_ranks
    % Chose the archive member in the least population area as food`
    % to improve coverage
    index=RouletteWheelSelection(1./Archive_mem_ranks);
    if index==-1
        index=1;
    end
    Food_fitness=Archive_F(index,:);
    Food_position=Archive_X(index,:)';
    
    for i=1:N
        
        index=0;
        neighbours_no=0;
        
        if i<=N/2
            for j=1:1:dim
                c2=rand();
                c3=rand();
                %%%%%%%%%%%%% % Eq. (3.1) in the paper %%%%%%%%%%%%%%
                if c3<0.5
                    Salps_X(j,i)=Food_position(j)+c1*((ub(j)-lb(j))*c2+lb(j));
                else
                    Salps_X(j,i)=Food_position(j)-c1*((ub(j)-lb(j))*c2+lb(j));
                end
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            end
        elseif i>N/2 && i<N+1
            
            point1=Salps_X(:,i-1);
            point2=Salps_X(:,i);
            
            Salps_X(:,i)=(point2+point1)/(2); % Eq. (3.4) in the paper
        end
        
        Flag4ub=Salps_X(:,i)>ub';
        Flag4lb=Salps_X(:,i)<lb';
        Salps_X(:,i)=(Salps_X(:,i).*(~(Flag4ub+Flag4lb)))+ub'.*Flag4ub+lb'.*Flag4lb;
        
    end
    
    display(['At the iteration ', num2str(iter), ' there are ', num2str(Archive_member_no), ' non-dominated solutions in the archive']);
    
end

figure

Draw_ZDT1();

hold on

plot(Archive_F(:,1),Archive_F(:,2),'ro','MarkerSize',8,'markerfacecolor','k');

legend('True PF','Obtained PF');
title('MSSA');

set(gcf, 'pos', [403   466   230   200])

 

 Código completo:

Supongo que te gusta

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