粒子群アルゴリズムのMatlab実装(ソースコードを含む)

思想

個々の鳥の場合、通常、餌を最も早く入手するための最初の選択肢は、他の鳥がどこにいるかを調べることです。彼らは、クラスター効果が存在すると信じており、ほとんどの鳥が最初に行く場所に行きます。そうでない場合は、行きます。他の場所を見てください

核となるアイデアは
、グループ内の個人による情報の共有使用して、グループ全体の動きが問題解決空間で無秩序から秩序への進化過程を生み出し、問題の最適な解決策を得ることです。

粒子群最適化アルゴリズムは、鳥や魚群の捕食行動から導き出され、アルゴリズムに抽象化された後、鳥がどのように捕食するかを粒子群最適化アルゴリズムについて説明します。

たとえば
、ある地域に鳥の群れがいて、この地域の1つ以上の場所に食べ物があることが知られています。鳥は鳥です。彼らは食べ物の特定の場所や食べ物がどこにあるかを知りません。ほとんどの場合、しかし彼らが食べ物に出会ったとき、彼らはそれが食べ物であることを知っています-_-そして彼らは食べ物の量を区別することができます。自然界のすべての生き物は絶えず食べ物を探しています。それが彼らが生き残ることができる理由です。

解決する-最も食べ物の場所を見つける

解決策:このプロセス:条件を把握し、解決します。

では、鳥はどのようにして餌を見つけるのでしょうか?この地域で最も食べ物が多い場所を見つける方法は?

1.鳥の群れの間で情報を共有し、グループが最も食べ物を知っている場所に向かって飛ぶ
2.あなた自身の経験に基づいて、あなたが最も食べ物を知っている場所に向かって飛ぶ

この2つの行動を通じて、鳥の群れは互いに情報を共有し、検索を続けると、最も餌の多い場所を見つけることができます。

上記の分析を通じて、鳥には2つの行動があります:1。社会的行動; 2.個人的行動;
社会的行動:鳥は群れの中で最高の鳥から学びます。つまり、現在最も多くの食物が知られている場所に向かって移動します。
個人の行動:検索に従って、最も食べ物を知っている場所に移動します。
次に、鳥の群れの餌探し方法に基づいて、各鳥が粒子に抽象化され、各粒子は上記の2つの動作を行い、粒子群最適化(PSO)が行われます。

公式

次の速度を解きます:
個人はすべての移動経路にあります-最適値と現在の位置の違い(個人の極値と現在の位置の関係)、
グループはすべての移動経路にあります-違い最適値と現在位置の間値(グループ極値と現在位置の関係)

次の位置を解きます:
2つの隣接する間隔、デフォルトの時間は1であるため、速度と位置を直接追加できます
ここに画像の説明を挿入

プログラム

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


結果

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_43641765/article/details/111414915