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

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

相关知识:

粒子群算法TSP问题python 粒子群算法代码详解_开发语言

 

粒子群算法TSP问题python 粒子群算法代码详解_matlab_02

 

运行结果:

粒子群算法TSP问题python 粒子群算法代码详解_matlab_03