粒子群算法代码超通俗解释(MATLAB)

改进后的粒子群算法,精度提高(寻找全局最优解的能力),同时时间复杂度降低

clc;clear;tic
%粒子群算法(相较于其它粒子群算法,其时间复杂度最低,同时精度提高)
N=100;%粒子群总个数,即产生100组解
D=10;%粒子维度,即一组最优解的自变量个数如x1,x2,x3,x4,x5,得到一个因变量y;这是5维的
G=200;%最大迭代次数
c1=1.5;
%学习因子1,控制与自身最优值的学习速度,或者说是学习多少;大的话更新后的值改变也大
c2=1.5;
%学习因子2,控制与群体最优值的学习速度,同c1
w=0.9;%取值[0.8,1.2]
w_max=0.9;w_min=0.4;%动态调整w,这是一般情况取的最大与最小值
%惯性权重,即受上一次值影响程度,大的化容易寻找全局最优解,太大则会造成值不更新
Xmax=20;%位置最大值即自变量取值的最大值
Xmin=-20;%位置最小值即自变量取值的最小值
Vmax=10;%速度最大值,即粒子可移动的最大步长
Vmin=-10;%速度最小值

%初始化种群个数,每个粒子有2个值,位置和速度
x=rand(N,D)*(Xmax-Xmin)+Xmin;%生成N行D列,一行代表一组解
%如果不同自变量取值范围不同,则针对性设置X1max,x2max等,将取值范围一致的放一起,
%然后在这里设置初值时,rand的D应该按不同取值范围拆开
v=rand(N,D)*(Vmax-Vmin)+Vmin;%生成每个粒子对应的速度

%计算初始的个体位置,即粒子当前的最优值(最开始的最优值就是自己)
p=x;%将x值也赋给p
p_best=ones(N,1);%内存预分配,提高运算速度
for i=1:N
    p_best(i)=func1(x(i,:));%计算每一组自变量的对应目标函数值(适应度值)
end

%计算初始的群体最优位置,即100组粒子里面最优的那个值
[g_best,index]=min(p_best);
%因为这里是求最小值,所有值越小越优,返回最优值g_best
%以及最优值对应自变量所在索引(行数)
g=x(index,:);%根据上面索引返回最优值所对应的自变量
n=10;
%粒子群算法开始迭代
gb=ones(1,G);%用来储存每次迭代的群体最优值
for i =1:G %总迭代次数
    for j =1:N %一组一组的来计算
        x0=func1(x(j,:));
        d_p=x0-p_best(j);%看看当前第j个与p_best最优个体哪个好
        if d_p<0   %小于0 .则说明当前值x0更低,则更优(因为这里是求最小值)
            p_best(j)=x0;%将更好的x0赋值到p_best替换掉之前的
            p(j,:)=x(j,:);%同时将最好的x0对应的自变量提取出来,放到p里面储存
        end
        d_g=p_best(j)-g_best;%看看当前第j个体最优值与群体最优值哪个好
        if d_g<0     %小于0 .则说明当前值p_best更低,则更优
            g_best=p_best(j);
            %将更好的p_best赋值到g_best,替换之前的,作为新的群体最优值
            g=p(j,:);%同时将p_best对应自变量提取出来,放到g里储存
        end
        v(j,:)=w*v(j,:)+c1*rand()*(p(j,:)-x(j,:))+c2*rand()*(g-x(j,:));
        x(j,:)=x(j,:)+v(j,:);
        %蚁群算法核心公式,类似与梯度下降法,但是梯度下降是向个体最优方向走,
        %而蚁群算法还从整体考虑,更容易找到全局最优值
        for ii = 1:D
            if (v(j,ii) > Vmax) || (v(j,ii) < Vmin)
                v(j,ii) = rand * (Vmax-Vmin)+Vmin;
                %判断是否有值超出了边界,超出了则拉回
            end
            if (x(j,ii) > Xmax) || (x(j,ii) < Xmin)
                x(j,ii) = rand * (Xmax-Xmin)+Xmin;
                %判断是否有值超出了边界,超出了则拉回
            end
        end
    end
    gb(1,i)=g_best; %将每次迭代的群体最优值储存起来,体现收敛趋势  
    %w=w_max-(w_max-w_min)*i/G;%随着迭代增加动态调整惯性权重,方法1
    w=(w_max-w_min)*(G-i)/G+w_min;%随着迭代增加动态调整惯性权重,方法2
    %随着迭代次数增加,惯性权重w应不断减小,从而使得粒子群算法在初期具有较强的全局
    %收敛能力,而后期具有较强的局部收敛能力
end
toc

%收敛趋势可视化
figure
plot(gb)
xlabel('迭代次数');
ylabel('适应度值');
title('适应度进化曲线')
g  %最优值(因变量)对应的自变量

function result=func1(x)
summ=sum(x.^2);%类似于遗传算法中的适应度函数,即目标函数
%现在要求这个目标函数最小值
result=summ;
end

相关知识:

88f0bd983a4e44ab834a75220a8ccc5a.jpg

 d641dea61e96435194e4a2bca35240ec.jpg

 

运行结果:

e7c2f77a7ae647adb8728c559133d9cc.bmp​​​

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

PlatinumA

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

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

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

打赏作者

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

抵扣说明:

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

余额充值