计算智能-群智能算法-粒子群算法matlab实现

1、函数说明
主函数:
main
辅助函数:
F():接收位置参数,返回对应适应值
Initial_X():初始化粒子起始位置
Private_X():接受粒子上一位置,当前位置以及它们对应的适应值,返回适应值较大的位置
Next_X():接受粒子当前位置,个体最优位置以及群体最优位置,返回粒子下一位置

2、重要变量解释
Learning_Rate:学习率,例子偏向群体最优位置飞行的趋势大小
Information_Array:例子信息矩阵,包含{序号,速度(未用到),当前位置,当前位置适应值,个体最优位置,群体最优位置}这几个属性

3、改进
Initial()的改进:可根据向量定义域对粒子的初始位置做一定的限制,提高搜索出全局解的概率
Next_X()的改进:可尝试对学习率的其他的使用方法,缩短搜索时间;改进粒子只朝向个体最优个群体最优粒子方向飞行的方式,允许多个解的存在

效果如下:
计算智能-群智能算法-粒子群算法matlab实现_第1张图片

主函数:main

Survival_Time=100;%粒子存活时间
nums=100;%粒子数量
x_dim=2;%向量X维度
Learning_Rate=0.8;%学习率
x_range=[-100,100
         -100,100];%向量X分量范围
Information_Array=zeros(nums,3+3*x_dim);%粒子信息矩阵
%编号(1)
Information_Array(:,1)=1:nums;
%速度(2)
Information_Array(:,2)=2;
%当前位置(3 -> 3+x_dim-1)
Information_Array(:,3:3+x_dim-1)=Initial_X(nums,x_dim,x_range);
%适应值(3+x_dim)
Information_Array(:,3+x_dim)=F(nums,x_dim,Information_Array(:,3:3+x_dim-1));
%私有最佳位置(4+x_dim -> 4+2*x_dim-1)
Information_Array(:,4+x_dim:4+2*x_dim-1)=Information_Array(:,3:3+x_dim-1);%当前只有一个向量位置,个体最优与其相同
%公有最佳位置(4+2*x_dim -> 3+3*x_dim)
temp=sortrows(Information_Array,3+x_dim);%根据当前适应值对整个信息矩阵进行行排序
Best_Invidual=temp(nums,:);%群体中最优个体记录
disp("第1代最佳适应值:"+Best_Invidual(1,3+x_dim));
Information_Array(:,4+2*x_dim:3+3*x_dim)=ones(nums,x_dim).*Best_Invidual(:,3:3+x_dim-1);%将群体最优位置赋予每个个体
flag=1;
plot(Information_Array(:,3),Information_Array(:,4),'*');
while flag<Survival_Time
    %记录当前例子当前位置与其适应值,后面计算需要使用
    temp_X=Information_Array(:,3:3+x_dim-1);
    temp_Y=Information_Array(:,3+x_dim);
    %粒子下一位置Next_X()
    Information_Array(:,3:3+x_dim-1)=Next_X(Learning_Rate,Information_Array(:,3:3+x_dim-1),Information_Array(:,4+x_dim:4+2*x_dim-1),Information_Array(:,4+2*x_dim:3+3*x_dim));
    %适应值
    Information_Array(:,3+x_dim)=F(nums,x_dim,Information_Array(:,3:3+x_dim-1));
    %个体最优位置
    Information_Array(:,4+x_dim:4+2*x_dim-1)=Private_X(temp_X,temp_Y,Information_Array(:,3:3+x_dim-1),Information_Array(:,3+x_dim));
    %公有最佳位置(4+2*x_dim -> 3+3*x_dim)
    temp=sortrows(Information_Array,3+x_dim);%根据当前适应值对整个信息矩阵进行行排序
    Best_Invidual=temp(nums,:);%群体中最优个体记录
    disp("第"+(flag+1)+"代最佳适应值:"+Best_Invidual(1,3+x_dim));
    Information_Array(:,4+2*x_dim:3+3*x_dim)=ones(nums,x_dim).*Best_Invidual(:,3:3+x_dim-1);%将群体最优位置赋予每个个体
    pause(0.1);
    plot(Information_Array(:,3),Information_Array(:,4),'*');
    flag=flag+1;
end

辅助函数:F()

function [Y] = F(nums,x_dim,X)
%接收参数:粒子数量,向量维度,粒子向量
%返回对应适应值
%F(X)=x1.^2+x2.^2+...+xn.^2-(x1.*x2+x2.*x3+...+x(n-1).*xn)
Y=zeros(nums,1);
for i=1:nums
    temp=X(i,:);
    Y(i,1)=sum(temp.^2)-sum(temp(1,1:x_dim-1).*temp(1,2:x_dim));
end
end

辅助函数:Initial_X()

function [Ret_X] = Initial_X(nums,x_dim,x_range)
%接收参数:粒子数量,向量维度,向量分量范围
%返回粒子初始位置
Ret_X=rand(nums,x_dim).*(x_range(:,2)-x_range(:,1)-1)'+(x_range(:,1))';
end

辅助函数:Private_X()

function [Ret] = Private_X(Last_X,Last_X_Y,Current_X,Current_X_Y)
%接收参数:粒子上一个位置与其适应值,当前位置与其适应值
%返回粒子私有最优位置
temp=(Last_X_Y>Current_X_Y);
Ret=(temp==1).*Last_X+(temp==0).*Current_X;
end

辅助函数:Next_X()

function [Ret] = Next_X(Learning_Rate,Current_X,Private_Best_X,Public_Best_X)
%接收参数:学习率(向着群体最优移动的趋势),当前位置,个体最优位置,群体最优位置
%返回每一粒子下一位置
temp_1=Private_Best_X-Current_X;
Temp_2=Public_Best_X-Current_X;
Ret=Current_X+(1-Learning_Rate).*temp_1+Learning_Rate.*Temp_2;
end

你可能感兴趣的:(人工智能算法,算法)