粒子群优化算法Matlab实现(待逐步解释)
生活随笔
收集整理的這篇文章主要介紹了
粒子群优化算法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)));%獲取新的XNew_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;endRet=[ret ret==0]; end總結
以上是生活随笔為你收集整理的粒子群优化算法Matlab实现(待逐步解释)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4-希尔排序C实现(递增递减的简单转换)
- 下一篇: 5-简单选择排序C实现(递增递减的简单转