优化算法之粒子群算法

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

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

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
粒子群算法(Particle Swarm Optimization,PSO)是一种优化算法,最初由Eberhart和Kennedy在1995年提出。它模拟了鸟群或鱼群等群体行为的过程,通过不断调整粒子的位置和速度来搜索最优解。 在PSO算法中,解空间被划分为一组粒子,每个粒子代表一个候选解。每个粒子根据自身的经验和群体的经验来更新自己的位置和速度。粒子的位置表示候选解的位置,速度表示搜索的方向和距离。通过不断迭代更新粒子的位置和速度,PSO算法能够逐步收敛到最优解。 PSO算法的核心思想是通过粒子之间的合作和信息共享来实现全局搜索和局部搜索的平衡。每个粒子根据自身的最优位置和全局最优位置来调整自己的速度和位置,从而逐渐靠近最优解。 PSO算法的具体步骤如下: 1. 初始化粒子群,包括粒子的位置和速度。 2. 计算每个粒子的适应度值。 3. 更新每个粒子的个体最优位置和全局最优位置。 4. 根据个体最优位置和全局最优位置,更新每个粒子的速度和位置。 5. 判断终止条件,如果满足条件则输出最优解;否则返回步骤2。 PSO算法具有以下优点: 1. 算法简单,易于理解和实现。 2. 不需要求导和梯度信息,适用于非线性、非凸的优化问题。 3. 具有较好的全局搜索能力和收敛性能。 然而,PSO算法也存在一些不足之处,如对参数的敏感性较高、易陷入局部最优等。针对这些问题,人们提出了很多改进的PSO算法,如自适应权重PSO(Adaptive Weight PSO)、混沌PSO(Chaotic PSO)等,以进一步提高算法的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值