粒子群优化算法Matlab实现(待逐步解释)

迭代矩阵建模如下:
粒子空间

入口函数

%下面的粒子群优化适用于最值位于非边界
%当最值位于边界,收敛较慢
%粒子空间
% 1 2---2+(Xs-1) 2+Xs  3+Xs---3+Xs+(Xs-1) 3+2*Xs---3+2*Xs+(Xs-1) 3+3*Xs---3+3*Xs+(Xs-1) 3+4*Xs
%序号  X        X适应值   个体最优X         群体最优X               Next_X           个体最优x适应值

nums=1000;%粒子数量
Xs=30;%自变量分量数量
Xr=zeros(1,2*Xs);%自变量分量范围
Xr(1,1:2:(2*Xs-1))=-500.*ones(1,Xs);
Xr(1,2:2:2*Xs)=500.*ones(1,Xs);
s=1000;%生存时间
Note_Best=zeros(s+1,Xs+2);%每一代最好的粒子
%Over_B;

%粒子空间初始化
%标号位于Space(:,1)
%自变量XSpace(:,2:2+(Xs-1))
Space=Init_Space(nums,4*Xs+3);
Space(:,2:2+(Xs-1))=Init_X(nums,Xs,Xr);

%通过X计算Y
%Y位于Space(:,2+Xs)
Space(:,2+Xs)=Get_Fx(nums,Space(:,2:2+(Xs-1)));

%初始化个体最好位置
%Init_Priv_X=Space(:,(3+Xs):(3+Xs+(Xs-1)))
Space(:,(3+Xs):(3+Xs+(Xs-1)))= Space(:,2:2+(Xs-1));
Space(:,4*Xs+3)=Get_Fx(nums,Space(:,(3+Xs):(3+Xs+(Xs-1))));
Space(:,(3+3*Xs):(3+3*Xs+(Xs-1)))=Space(:,2:2+(Xs-1));

%通过私有适应值对粒子空间进行从小到大排序
Space=sortrows(Space,4*Xs+3);
%最好的一代:Space(nums,(3+Xs):(3+Xs+(Xs-1)))
Note_Best(1,:)= Space(nums,[1 2:(2+(Xs-1)) 4*Xs+3]);

%将最好的一代赋给每一个粒子Init_Publ_X=Space(:,(3+2*Xs):(3+2*Xs+(Xs-1)))
Space(:,(3+2*Xs):(3+2*Xs+(Xs-1)))= Space(nums,(3+Xs):(3+Xs+(Xs-1))).*ones(nums,1);

%通过Priv_X、Publ_X计算New_X并留下合法的粒子,Next_X=Space(:,(3+3*Xs):(3+3*Xs+(Xs-1)))
New_X=Next_X(nums,Xs,Space(:,2:2+(Xs-1)),Space(:,(3+Xs):(3+Xs+(Xs-1))),Space(:,(3+2*Xs):(3+2*Xs+(Xs-1))));
Over_B=Jud_X(New_X,Xr,Xs,nums);
Space(:,(3+3*Xs):(3+3*Xs+(Xs-1)))=Over_B(:,1).*New_X+Over_B(:,2).*Space(:,(3+3*Xs):(3+3*Xs+(Xs-1)));%disp(Space);
%disp(Note_Best(1,:));

New_Y=zeros(nums,1);
temp1=zeros(nums,1);
temp2=zeros(nums,1);
flag=1;
while(flag<=s)
    Space(:,2:2+(Xs-1))=Space(:,(3+3*Xs):(3+3*Xs+(Xs-1)));%获取新的X
    
    New_Y=Get_Fx(nums,Space(:,2:2+(Xs-1)));%计算新的适应值,并提取必要信息有助于新Priv_X的产生
    temp1=New_Y>Space(:,2+Xs);
    temp2=New_Y<=Space(:,2+Xs);
    Space(:,2+Xs)= New_Y;
    
    Space(:,(3+Xs):(3+Xs+(Xs-1)))=temp1.*Space(:,2:2+(Xs-1))+temp2.*Space(:,(3+Xs):(3+Xs+(Xs-1)));%新Priv_X的产生
    Space(:,4*Xs+3)=Get_Fx(nums,Space(:,(3+Xs):(3+Xs+(Xs-1))));%新Priv_X对应的适应值计算
    
    Space=sortrows(Space,4*Xs+3);%根据适应值排序,寻找最优的粒子,使得新Publ_X的产生
    Note_Best(flag+1,:)= Space(nums,[1 2:(2+(Xs-1)) 4*Xs+3]);
    
    Space(:,(3+2*Xs):(3+2*Xs+(Xs-1)))= Space(nums,(3+Xs):(3+Xs+(Xs-1))).*ones(nums,1);%新Publ_X的产生
   
    New_X=Next_X(nums,Xs,Space(:,2:2+(Xs-1)),Space(:,(3+Xs):(3+Xs+(Xs-1))),Space(:,(3+2*Xs):(3+2*Xs+(Xs-1))));
    Over_B=Jud_X(New_X,Xr,Xs,nums);
    Space(:,(3+3*Xs):(3+3*Xs+(Xs-1)))=Over_B(:,1).*New_X+Over_B(:,2).*Space(:,2:2+(Xs-1));
    
    %disp(Space);
    disp("迭代"+mat2str(flag)+"代后最佳适应值:"+mat2str(-Note_Best(flag+1,Xs+2)));
    flag=flag+1;
end

%disp(Note_Best(32,:));

函数:

function [y] = Init_Space(nums,L)%序号初始化
y=zeros(nums,L);
y(:,1)=fix((1:nums)');%
end
function [X] = Init_X(nums,Xs,Xr)%自变量初始化
R=rand(nums,Xs);
X=zeros(nums,Xs);
flag=1;
while(flag<=Xs)
    X(:,flag)=R(:,flag).*Xr(:,2*flag-1)+(1-R(:,flag)).*Xr(:,2*flag);
    flag=flag+1;
end
end
function [Y] = Get_Fx(nums,X)%获取适应值
Y=zeros(nums,1);
flag=1;
while(flag<=nums)
    Y(flag,1)=F(X(flag,:));
    flag=flag+1;
end
end
function [y] = F(x)%返回适应值
y=sum((x').*sin(sqrt(abs(x'))));
end
function [New_X] = Next_X(nums,X,X1,X2)%获取新的自变量
R=rand(nums,2).*[0.1 10];
New_X=X+R(:,1).*(X1-X)+R(:,2).*(X2-X);
end
function [Ret]=Jud_X(New_X,Xr,Xs,nums)%判断自变量是否越界
    ret=ones(nums,1);
    flag=1;
    while(flag<=Xs) 
        ret=ret.*(Xr(2*flag-1)<=New_X(:,flag)).*(New_X(:,flag)<=Xr(2*flag));
        flag=flag+1;
    end
    Ret=[ret ret==0];
end
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值