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

📄 patternmove.m

📁 粒子群算法
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%对每一个粒子以初始步长为a进行模式移动
%%Swarm:粒子
%%a    :步长
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function SwarmReturn = PatternMove(Swarm,a,psoOptions)
[rows cols] = size(Swarm);
SwarmT = Swarm;%临时变量的SwarmT
change_flag = 0;
[cao1  cao2] = sort(feval(psoOptions.Obj.f2eval,Swarm));
randx = rand();
for ii = 1:rows %对每一个粒子进行模式移动
    i = ii;
    change_flag =0;
    aa = a; 
    if (randx > 0.5)
        while(  aa > 0.01 )%&& change_flag < 1)
        change_flag =0;
            for j = 1:cols
                    fResultOld = feval(psoOptions.Obj.f2eval,Swarm(i,:));
                    SwarmT(i,j) = Swarm(i,j) + aa;%正向移动
                    fResultNew=feval(psoOptions.Obj.f2eval,SwarmT(i,:));
                    if(fResultNew < fResultOld)
                        Swarm(i,j) =  SwarmT(i,j) ;
                        change_flag =1 ;
                    else
                        SwarmT(i,j) = Swarm(i,j) - aa;%反向移动
                        fResultNew= feval(psoOptions.Obj.f2eval,SwarmT(i,:));
                        if(fResultNew < fResultOld)
                        Swarm(i,j) =  SwarmT(i,j) ;
                        change_flag =1 ;
                        else
                             SwarmT(i,j)  = Swarm(i,j);
                        end
                    end
               
                end %end for
                if change_flag>0
                    Swarm(i,:) = 2*SwarmT(i,:) - Swarm(i,:) ;
                end
                aa =  aa/2;
            end%end while 
    else
         while(  aa > 0.01 )%&& change_flag < 1)
        change_flag =0;
            for j = cols:-1:1
                    fResultOld = feval(psoOptions.Obj.f2eval,Swarm(i,:));
                    SwarmT(i,j) = Swarm(i,j) + aa;%正向移动
                    fResultNew=feval(psoOptions.Obj.f2eval,SwarmT(i,:));
                    if(fResultNew < fResultOld)
                        Swarm(i,j) =  SwarmT(i,j) ;
                        change_flag =1 ;
                    else
                        SwarmT(i,j) = Swarm(i,j) - aa;%反向移动
                        fResultNew= feval(psoOptions.Obj.f2eval,SwarmT(i,:));
                        if(fResultNew < fResultOld)
                        Swarm(i,j) =  SwarmT(i,j) ;
                        change_flag =1 ;
                        else
                             SwarmT(i,j)  = Swarm(i,j);
                        end
                    end
               
                end %end for
                if change_flag>0
                    Swarm(i,:) = 2*SwarmT(i,:) - Swarm(i,:) ;
                end
                aa =  aa/2;
            end%end while 
    end
 
  if change_flag>0
    Swarm(i,:) = 2*SwarmT(i,:) - Swarm(i,:) ;
  end
end
SwarmReturn = Swarm;

⌨️ 快捷键说明

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