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

📄 acrossswarm.asv

📁 粒子群算法
💻 ASV
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数功能对粒子进行交叉操作
%%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 > 0.5 %所有大于0.5的进行交叉
    Idx = unidrnd(rows,1,1);
    Childs(1,1:rows) =  Swarm(i,:);
    Childs(1,rows+1) =  feval(psoOptions.Obj.f2eval,Swarm(i,:)) ;
    Childs(2,1:rows) = Swarm(Idx,:)
    Childs(2,rows+1) =  feval(psoOptions.Obj.f2eval,Swarm(Idx,:)) ;
    if (Childs(1,rows+1) >  Childs(2,rows+1))
         Childs(3,:) = Childs(2,:);
         Childs(2,:) = Childs(1,:);
         Childs(1,:) = Childs(2,:);
    end
    Childs(3,1:rows ) = Childs(1) + a1*Swarm(Idx,:);
    Childs(3,rows+1) =  feval(psoOptions.Obj.f2eval,Childs(3,1:rows ) ) ;
    Childs(4,1:rows) = Swarm(i,:) + a2*Swarm(Idx,:);
    Childs(4,rows+1) =  feval(psoOptions.Obj.f2eval,Childs(4,1:rows ) ) ;
    
    Childs = Sort(Childs,rows+1);
    
    SwarmReturn(i,:) = Childs(1,1:rows);
    SwarmReturn(Idx,:) = Childs(2,1:rows);
end
end


⌨️ 快捷键说明

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