Implémentation Matlab de l'algorithme d'essaim de particules (y compris le code source)

pensait

Pour les oiseaux individuels, le premier choix pour accéder le plus rapidement à la nourriture est généralement: regardez où se trouvent les autres oiseaux. Ils croient que l'effet de regroupement existe et ils iront là où la plupart des oiseaux vont en premier. Sinon, ils iront. Regardez ailleurs

L'idée centrale est d'
utiliser le partage d'informations par les individus dans le groupe afin que le mouvement de l'ensemble du groupe produise un processus évolutif du désordre à l'ordre dans l'espace de résolution de problèmes, afin d'obtenir la solution optimale du problème.

L'algorithme d'optimisation des essaims de particules est dérivé du comportement de prédation des oiseaux et des bancs de poissons, puis résumé dans un algorithme. Ensuite, je présenterai une particule comment les oiseaux proie pour expliquer l'algorithme d'optimisation des essaims de particules.

Par exemple, on
sait qu'il y a un groupe d'oiseaux dans une zone et qu'il y a de la nourriture dans un ou plusieurs endroits de cette zone. Les oiseaux sont des oiseaux. Ils ne connaissent pas l'emplacement précis de la nourriture ni où la nourriture se trouve La plupart, mais quand ils rencontrent de la nourriture, ils savent que c'est de la nourriture -_-, et ils peuvent distinguer la quantité de nourriture. Tous les êtres vivants de la nature sont constamment à la recherche de nourriture, c'est pourquoi ils peuvent survivre.

Résolvez-trouvez l'endroit le plus gourmand

Solution: Ce processus: Connaissez les conditions, résolvez-les.

Alors, comment les oiseaux trouvent-ils de la nourriture? Comment trouver l'endroit avec le plus de nourriture dans ce quartier?

1. Partagez des informations entre les troupeaux d'oiseaux et volez vers l'endroit où le groupe connaît le plus de nourriture
2. En vous basant sur votre propre expérience, volez vers l'endroit où vous connaissez le plus de nourriture

Grâce à ces deux comportements, les volées d'oiseaux se partagent des informations et, tout en continuant à chercher, elles peuvent trouver l'endroit avec le plus de nourriture.

Grâce à l'analyse ci-dessus, les oiseaux ont deux comportements: 1. Comportement social, 2. Comportement individuel, Comportement
social: Les oiseaux apprendront des meilleurs oiseaux du troupeau, c'est-à-dire se déplacer vers l'endroit où le plus de nourriture est actuellement connue.
Comportement individuel: déplacez-vous vers l'endroit où vous connaissez le plus de nourriture en fonction de votre recherche.
Ensuite, sur la base de la méthode de recherche de nourriture de l'essaim d'oiseaux, chaque oiseau est extrait en une particule, et chaque particule a les deux comportements ci-dessus, ce qui entraîne une optimisation de l'essaim de particules (PSO).

officiel

Résolvez la vitesse suivante: l'
individu est dans tous les chemins de déplacement - la différence entre la valeur optimale et la position actuelle (la relation entre la valeur extrême individuelle et la position actuelle), et le
groupe est dans tous les chemins de déplacement - la différence entre la valeur optimale et la position actuelle Valeur (relation entre la valeur extrême du groupe et la position actuelle)

Résolvez la position suivante:
deux intervalles adjacents, le temps par défaut est 1, donc la vitesse et la position peuvent être ajoutées directement
Insérez la description de l'image ici

programme

amusant.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);


résultat

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/qq_43641765/article/details/111414915
conseillé
Classement