Implementación de Matlab del algoritmo de enjambre de partículas (incluido el código fuente)

pensamiento

Para las aves individuales, la primera opción para el acceso más rápido a la comida suele ser: mirar dónde están otras aves. Creen que existe el efecto de agrupamiento y que irán donde la mayoría de las aves van primero. Si no, irán. Mira a otro lado

La idea central es
utilizar el intercambio de información por parte de los individuos del grupo para que el movimiento de todo el grupo produzca un proceso evolutivo del desorden al orden en el espacio de resolución de problemas, a fin de obtener la solución óptima del problema.

El algoritmo de optimización del enjambre de partículas se deriva del comportamiento de depredación de las aves y los bancos de peces, y luego se abstrae en un algoritmo. Luego, presentaré una partícula de cómo las aves se alimentan para explicar el algoritmo de optimización del enjambre de partículas.

Por ejemplo, se
sabe que hay un grupo de aves en una zona, y hay algo de comida en uno o más lugares de esta zona. Las aves son aves. No conocen la ubicación específica de la comida ni dónde está la comida. La mayoría, pero cuando encuentran comida, saben que es comida -_-, y pueden distinguir la cantidad de comida. Todos los seres vivos de la naturaleza buscan constantemente alimento, por eso pueden sobrevivir.

Resuelve-encuentra el lugar con más comida

Solución: Este proceso: Conoce las condiciones, resuélvelo.

Entonces, ¿cómo encuentran comida las aves? ¿Cómo encontrar el lugar con más comida en esta zona?

1. Comparta información entre bandadas de aves y vuele hacia el lugar donde el grupo sabe más comida
2. Basado en su propia experiencia, vuele hacia el lugar donde sabe más comida

A través de estos dos comportamientos, las bandadas de pájaros comparten información entre sí y, a medida que continúan buscando, pueden encontrar el lugar con más comida.

A través del análisis anterior, las aves tienen dos comportamientos: 1. Comportamiento social 2. Comportamiento individual Comportamiento
social: Las aves aprenderán de las mejores aves de la bandada, es decir, se moverán hacia el lugar donde actualmente se conoce la mayor cantidad de alimento.
Comportamiento individual: muévete al lugar donde conozcas más comida según tu búsqueda.
Luego, según el método de búsqueda de alimento del enjambre de aves, cada ave se extrae en una partícula, y cada partícula tiene los dos comportamientos anteriores, lo que resulta en la optimización del enjambre de partículas (PSO).

oficial

Resuelva la siguiente velocidad: el
individuo está en todas las rutas de viaje - la diferencia entre el valor óptimo y la posición actual (la relación entre el valor extremo individual y la posición actual), y el
grupo está en todas las rutas de viaje - la diferencia entre el valor óptimo y la posición actual Valor (relación entre el valor extremo del grupo y la posición actual)

Resuelva la siguiente posición:
dos intervalos adyacentes, el tiempo predeterminado es 1, por lo que la velocidad y la posición se pueden agregar directamente
Inserte la descripción de la imagen aquí

programa

divertido.m

function y = fun(x)
% 函数用于计算粒子适应度值,也就是公式
%x           input           输入粒子 
%y           output          粒子适应度值 
y = sin(10 * pi * x) / x;

main.m

 %% I. 清空环境
clc
clear all

%% II. 绘制目标函数曲线图
x = 1:0.01:2;  %1-2 
y = sin(10*pi*x) ./ x;%实际要优化的函数  矩阵的对应相除——点除  sin(10*π*x)
figure%单独执行可以出现表格,和前几行一起执行也是表格,必须和第四行一起执行才可以出现表格
plot(x, y)
hold on%添加新绘图时,保存当前figure

%% III.初始化参数
c1 = 1.49445;
c2 = 1.49445;

maxgen = 50;   % 进化次数  
sizepop = 10;   %种群规模

Vmax = 0.5;
Vmin = -0.5;
popmax = 2; %个体变化范围,与pop范围对应相同
popmin = 1;

%加入权重(1)
ws = 0.9;%start
we = 0.4;%end

%% IV. 产生初始粒子(种群) 速度 适应度函数
for i = 1:sizepop%10
    % 随机产生一个种群population=10,同时定义pop()
    %pop(i,:)——10*1double,不是1*10
    %因为右侧没有i,只是左侧的pop(i,:)
    %初始种群 rands(1)函数是随机产生[-1,1],经过运算后,变化范围是{
    
    12},[1,2]中随机10%pop(i,:) = rand + 1;%pop(i,:) = rand(1) + 1;两者都可以
    pop(i,:) = (rands(1) + 1) / 2 + 1;   
    V(i,:) = 0.5 * rands(1);  %初始化速度,[-0.5,0.5]
    % 适应度 把初始化的,10*1的种群,代入到函数中,得到1*10的适应度函数
    %fitness函数只能显示1*n的数据,这是设置的
    fitness(i) = fun(pop(i,:));   %针对每一个个体去调用适应度函数
end
%% V. 个体极值和群体极值 个体最佳和群体最佳
%选择最大或者最小都可以,但是一定要统一,毕竟是随机
%[最大值 对应的位置]
[bestfitness bestindex] = max(fitness);%1-10中最大的适应度函数值就是,fitness不加括号
%g_best = max(pop);输出的群体最佳和群体极值是一样(结果虽然是一样的,是偶然,),    0.9528    1.0490

%这三个里面,只有,p_best与fitness函数无关
%位置——在群体中,适应度函数值最大的对应的位置
g_best = pop(bestindex,:);      %全局最佳,并不是十个数里面最大的gbest = max(pop);,而是群体极值中最大的,对应的位置
p_best = pop;                   %个体最佳,十个个体,此时没有进入循环,在循环中,个体最佳是所有循环中个体最佳的

%值
p_best_fitness = fitness;       %个体最佳适应度值——个体极值
g_best_fitness = bestfitness;   %全局最佳适应度值——群体极值

%% VI. 迭代寻优
for i = 1:maxgen%50
        %加入权重(2)
    w = ws - (ws - we)*(maxgen - i)/maxgen;
    for j = 1:sizepop%10
        % 速度更新           个体最佳*10 每一次都选取最佳               全局最佳(每次循环中的最佳)
        V(j,:) = w*V(j,:) + c1*rand*(p_best(j,:) - pop(j,:)) + c2*rand*(g_best - pop(j,:));
        
        V(j,find(V(j,:)>Vmax)) = Vmax;%边界约束
        V(j,find(V(j,:)<Vmin)) = Vmin;
        
        % 种群更新
        pop(j,:) = pop(j,:) + V(j,:);
        pop(j,find(pop(j,:)>popmax)) = popmax;
        pop(j,find(pop(j,:)<popmin)) = popmin;
        
        % 适应度值更新
        fitness(j) = fun(pop(j,:)); 
    end
    
    for j = 1:sizepop    
        % 个体最优更新
        if fitness(j) > p_best_fitness(j)%当前的适应度函数值大于个体极值,就把当前个体,以及适应度函数值赋给best
            p_best(j,:) = pop(j,:);
            p_best_fitness(j) = fitness(j);
        end
        
        % 群体最优更新
        if fitness(j) > g_best_fitness%当前的适应度函数值大于群体极值,就把当前个体,以及适应度函数值赋给best
            g_best = pop(j,:);
            g_best_fitness = fitness(j);
        end
    end 
    yy(i) = g_best_fitness;          
end

%% VII. 输出结果并绘图
[g_best_fitness g_best]%寻找到的极值点——[值,位置]
plot(g_best, g_best_fitness,'r*')%极值点对应的变量

figure
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);


resultado

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_43641765/article/details/111414915
Recomendado
Clasificación