⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acrossswarm.m

📁 粒子群算法
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数功能对粒子进行交叉操作
%%Swarm:粒子
%%psoOptions:在get_psoOptions中设定
%%如果粒子距离
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function SwarmReturn = AcrossSwarm(Swarm,psoOptions)
[rows cols] = size(Swarm);
SwarmT = Swarm;%临时变量的SwarmT
[center,U,obj_fcn] = fcm(Swarm,1,[2.0 100 1e-3 0]);
for i=1:rows
    distance(i) =  sum((Swarm(i,:) -center).*(Swarm(i,:) -center));
end
%归一化操作
%minDis = min(distance);
%maxDis = max(distance);
%distance = (distance - minDis)/(maxDis - minDis);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a1 =1.2;%a1的范围 [0 1]
a2 = 0.8;%a2 的范围 [0 2]
Childs = zeros(4,cols+1);
SwarmReturn = Swarm;
for  i = 1:rows
%if distance(i) >0.5 %所有大于0.5的进行交叉
    Idx = unidrnd(rows,1,1);
    Childs(1,1:cols) =  Swarm(i,:);
    Childs(1,cols+1) =  feval(psoOptions.Obj.f2eval,Swarm(i,:)) ;
    Childs(2,1:cols) = Swarm(Idx,:);
    Childs(2,cols+1) =  feval(psoOptions.Obj.f2eval,Swarm(Idx,:)) ;
    if (feval(psoOptions.Obj.f2eval,Childs(1,1:cols)) >  feval(psoOptions.Obj.f2eval,Childs(2,1:cols))) %1比2优秀
         Childs(3,:) = Childs(2,:);
         Childs(2,:) = Childs(1,:);
         Childs(1,:) = Childs(2,:);
    end
    Childs(3,1:cols ) = Childs(2,1:cols) + a1*(Childs(1,1:cols)-Childs(2,1:cols));
    Childs(3,cols+1) =  feval(psoOptions.Obj.f2eval,Childs(3,1:cols ) ) ;
    Childs(4,1:cols ) = Childs(2,1:cols) + a2*(Childs(1,1:cols)-Childs(2,1:cols));
    Childs(4,cols+1) =  feval(psoOptions.Obj.f2eval,Childs(4,1:cols ) ) ;
    
    Childs = sortrows(Childs,cols+1);
    
    SwarmReturn(i,:) = Childs(1,1:cols);
    SwarmReturn(Idx,:) = Childs(2,1:cols);
%end
end


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -