优化算法之粒子群算法

今天为大家分享启发式优化算法的第二种算法——粒子群算法(又称鸟群算法),粒子群算法是依据鸟群在觅食过程中信息在在个体和集体中传递的原理进行优化的,具体原理这里同样不进行详细介绍,大家可以参考其他博客,这里直接贴出相关程序:

function Record = PSOfunction(Population,Dim,Inter,PosLimit,VLimit,C1,C2,C3)
%粒子群算法
%{
输入:
Population:初始种群数
Dim:变量维度
Inter:迭代次数
PosLimit:寻优范围
VLimit:速度范围
C1:惯性权重
C2:自我学习因子
C3:集体学习因子

输出:

日期:
20190905_ZD
%}
%随机初始化种群位置
for i = 1:Dim
    X(:,i) = PosLimit(i,1) + ( PosLimit(i,2) - PosLimit(i,1) ) * rand(Population,1);
end
%初始化种群速度
V = rand(Population,Dim);
XBest = X;%每个个体的历史最佳位置
XAllBest = zeros(1,Dim);%种群的历史最佳位置
FitnessBest = zeros(Population,1);%每个个体的历史最佳适应度
FitnessAllBest = -inf;%种群历史最佳适应度
%寻优
jj = 1;
Record = zeros(Inter,1);
while jj <= Inter
    [Fitness,f] = CalFitness(X);%计算适应度
    for i = 1:Population
        if FitnessBest(i) < Fitness(i)
            FitnessBest(i) = Fitness(i);%更新个体历史最佳适应度
            XBest(i,:) = X(i,:);%更新个体历史最佳位置
        end
    end
    if FitnessAllBest < max(Fitness)
        [FitnessAllBest,label] = max(Fitness);
        XAllBest = X(label,:);
    end
    V = V*C1+C2*rand*(XAllBest-X)+C3*rand*(repmat(XAllBest,Population,1) - X);%更新速度
    %处理速度边界问题
    for i=1:Dim
        for k = 1:Population
            if V(k,i) > VLimit(i,2)
                V(k,i) = VLimit(i,2);
            end
            if V(k,i) < VLimit(i,1)
                V(k,i) = VLimit(i,1);
            end
        end
    end
    X = X + V;%更新位置
    %边界问题处理
    for i = 1:Dim
        for k = 1:Population
            if X(k,i) > PosLimit(i,2)
                X(k,i) = PosLimit(i,2);
            end
            if X(k,i) < PosLimit(i,1)
                X(k,i) = PosLimit(i,1);
            end
        end
    end
    %绘制
    cla
    fsurf(f,[0 20 0 20])
    hold on
    if mod(jj,10) == 0
        plot3(X(:,1),X(:,2),f(X(:,1),X(:,2)),'ro');
        pause(0.1)
    end
    Record(jj) = FitnessAllBest;
    jj = jj+1;
end
function [Fitness,f] = CalFitness(X)
%计算适应度
%{
输入:
X:参数

输出:
Fitness:适应度
f:函数

日期:
20190905_ZD
%}
f= @(a,b)(a .* sin(a) .* cos(2 * a) - 2 * a .* sin(3 * a)).*(b .* sin(b) .* cos(2 * b) - 2 * b .* sin(3 * b));
Fitness = f(X(:,1),X(:,2));

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章