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