📄 acrossswarm.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 + -