粒子群算法案例详细注释解析

粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization),缩写为 PSO, 是近年来由J. Kennedy和R. C. Eberhart等开发的一种新的进化算法(Evolutionary Algorithm - EA)。PSO 算法属于进化算法的一种,和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的“交叉”(Crossover) 和“变异”(Mutation) 操作,它通过追随当前搜索到的最优值来寻找全局最优。这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性。粒子群算法是一种并行算法。

算法策略

粒子群算法的目标是使所有粒子在多维超体(multi-dimensional hyper-volume)中找到最优解。首先给空间中的所有粒子分配初始随机位置和初始随机速度。然后根据每个粒子的速度、问题空间中已知的最优全局位置和粒子已知的最优位置依次推进每个粒子的位置。随着计算的推移,通过探索和利用搜索空间中已知的有利位置,粒子围绕一个或多个最优点聚集或聚合。该算法设计玄妙之处在于它保留了最优全局位置和粒子已知的最优位置两个信息。后续的实验发现,保留这两个信息对于较快收敛速度以及避免过早陷入局部最优解都具有较好的效果。这也奠定了后续粒子群算法改进方向的基础。

下面进行代码分析:

clc;
clear
%初始化参数设置
c1 = 1.49445;
c2 = 1.49445;
w = 1;

% c1 和c2一般经验设置为1.5,r1 and r2 的设置不影响程序运行

maxgen = 200;%最大迭代次数
sizepop = 50;%种群大小
nvar = 2;%目标函数的变量数
Vmax = 10;% 速度的范围,一次搜索的距离
Vmin = -10;
popmax = 100;%变量的取值范围
popmin = -100;
%初始化矩阵参数
for i = 1:sizepop
    pop(i,:) = (popmax - popmin) *rands(1, nvar)+popmin;%种群初始化,生成一个-100到100的随机数的矩阵
    V(i,:) = (Vmax - Vmin ) * rands(1,nvar)+Vmin;%速度初始化
    fitnessa(i) = fun(pop(i,:)); %计算得到适应度
end

[bestfitness,bestindex] = min(fitnessa);%最佳适应值及其在种群中的那一只的编号
gbest = pop(bestindex,:);%全局最优
pbest = pop;%个体最优的第一代就是当前位置
fitnesspbest = fitnessa;%个体最优的适应度就是个体计算的适应度 更新位置
fitnessgbest = bestfitness;%全局最优的适应度就是最佳适应度  更新位置
%对参数进行更新循环
for i = 1:maxgen
    for j = 1:sizepop
        V(j,:) = w .* V(j,:) + c1 *rand * (pbest(j,:) - pop(j,:)) + c2 * rand * (gbest - 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 ;

        fitnessa(j) = fun(pop(j,:));

    end
    %更新全局最优和个体最优值
    for j = 1:sizepop
        if fitnessa(j) < fitnesspbest(j)
            pbest(j,:) = pop(j,:);
           fitnesspbest(j) =  fitnessa(j);
        end
        if fitnessa(j) < fitnessgbest
            gbest = pop(j,:);
            fitnessgbest =  fitnessa(j);
        end
    end
    bf (i) = fitnessgbest;
end

plot(bf,'--')
%title('最优个体适应度值');
%xlabel('迭代次数');
%ylabel('函数适应度值');
disp('函数值       变量');
disp([fitnessgbest,gbest]);
legend('PSO')

相关函数自己可以设置

PSO粒子群算法的代码详细注释-自然语言处理文档类资源-CSDN文库

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流云挽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值