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

📄 ziji_2.m

📁 这是一个极好的粒子群算法的程序,希望大家喜欢
💻 M
字号:
function swarm
warning off MATLAB:divideByZero;
   global vizAxes; %用一个新的轴来画出
    vizAxes = plot(0,0, '.');
    axis([-100 100 -100 100 -100 100]);   %初始轴的范围的设置
    axis square;
    grid on;
    set(vizAxes,'EraseMode','xor','MarkerSize',15); %设置用来显示粒子.
  global numberOfParticles;%粒子的个数
  numberOfParticles = 40;
  global numberOfNeighbors;%邻居的个数
  numberOfNeighbors = 4;
  maxIterations = 3000;%最大叠代次数
  
  %% Limites para cambio de localizaci髇
  global deltaMin;%最小速度
  deltaMin = -4.0;
  global deltaMax;%最大速度
  deltaMax = 4.0;
  
  %% 权值的认知和社会部分individuality and sociality
  iWeight = 2.0;
  iMin = 0.0;%%最大值
  iMax = 1.0;%%最小值
  sWeight = 2.0;
  sMin = 0.0;
  sMax = 1.0;
  %%%%%%%%%%%
  %% Related variables to the problem space solutions
  %%%%%%%%%%%
  initialFitness = -100000;%初始适应度
  targetFitness = 0;%目标适应度
  global dimensions;%维数
  dimensions = 8;
  %%%% Program Start
  global particles;%粒子
  
 %%%%%%对每个粒子都初始化%%%%%%
  for p = 1:numberOfParticles
    for d = 1:dimensions
      particles(p).next(d) = randint(1,10); %%%%%%%%初始化下一个%%%%%%%%%
      particles(p).velocity(d) = randint(deltaMin,deltaMax); %%%%%%初始化速度%%%%%
      particles(p).current(d) = particles(p).next(d);%%%%%%初始化当前位置%%%%%
    end
    
    particles(p).bestSoFar = initialFitness;%%%%%初始化适应度%%%%%
  end
  
  for p = 1:numberOfParticles
    neighborVector = getNeighborIndexVector(p,numberOfNeighbors);
    for n = 1:numberOfNeighbors
      particles(p).neighbor(n) = neighborVector(n);%%%%%邻居%%%%%
    end
  end
  
  iterations = 0;
  tic
  while iterations <= maxIterations
    
    for p = 1:numberOfParticles     
      for d = 1:dimensions
	particles(p).current(d) = particles(p).next(d);%%%%%下一次赋值给当前的%%%%%
      end
      
      fitness = test(p);%%%%%测试p的适应度%%%%%
      
      if fitness > particles(p).bestSoFar;%%%%%评价适应度%%%%%
	particles(p).bestSoFar = fitness;%%%%%交换粒子的位置等%%%%%
	for d = 1:dimensions
	  particles(p).best(d) = particles(p).current(d);%%%%%交换粒子中的所有信息%%%%%
	end
      end
      
      if fitness == targetFitness%%%%%如果适应度达到了理想的适应度%%%%%
	X=particles(p).current(1);
	Y=particles(p).current(2);
	Z=particles(p).current(3);
    W=particles(p).current(4);
    total_time=toc
    targetFitness
    iterations
	disp('成功!!');
        return
      end
      
    end
    
    %%%%更新位置和速度%%%%%%
    for p = 1:numberOfParticles
      n = getNeighborIndexWithBestFitness(p);
      for d = 1:dimensions
	iFactor = iWeight * randint(iMin,iMax); %%%%%%%更新权值的认知部分%%%%%%%
	sFactor = sWeight * randint(sMin,sMax); %%%%%%更新权值的社会部分%%%%%%%
	pDelta(d) = particles(p).best(d) - particles(p).current(d);%%%%%%最好位置减去当前位置,公式中的%%%%%%
	nDelta(d) = particles(n).best(d) - particles(p).current(d);
	
	delta = (iFactor * pDelta(d)) + (sFactor * nDelta(d));%%%%%%对每个粒子代入位置计算公式%%%%%%
	delta = particles(p).velocity(d) + delta;
	
	particles(p).velocity(d) = constrict(delta);%%%%%%对每个粒子代入速度计算公式%%%%%%
	particles(p).next(d) = particles(p).current(d) + particles(p).velocity(d);
	
      end
  end  
  iterations = iterations + 1;
   for p = 1:numberOfParticles        
        X(p)=particles(p).current(1);
        Y(p)=particles(p).current(2);
        Z(p)=particles(p).current(3);
   end
        if dimensions >= 3
             set(vizAxes,'XData',X,'YData', Y, 'ZData', Z);
        elseif dimensions == 2
             set(vizAxes,'XData',X,'YData',Y );%设置
        end
        xlabel('粒子第一维');
        ylabel('粒子第二维');
        zlabel('粒子第三维');
        title({'叠代的代数:' iterations});
            drawnow;     
            
  end
  disp('失败!');
%%%%%%%%%%
%%% Support Functions
%%%%%%%%%%
%%适应度函数-------------
function fitness = test(p)
  global particles;
  x = particles(p).current(1);
  y = particles(p).current(2);
  z = particles(p).current(3);
  w = particles(p).current(4);
  
  f = 5 * (x^2) + 2 * (y^3) - (z/w)^2 + 4;
  
  if ( x * y ) == 0 
    n = 1;
  else
    n = 0;
  end
  
  fitness = 0 - abs(f) - n;
  
%%-------------
function d = constrict(delta)
  global deltaMin;
  global deltaMax;
  if delta < deltaMin
    d = deltaMin;
    return
  end
  if delta > deltaMax
    d = deltaMax;
    return
  end
  d = delta;
  
%%--邻近一次的位置信息------
function p = getNeighborIndex(pindex,n)
  global numberOfParticles;
  global dimensions;
  global particles;
  dista=zeros(1,numberOfParticles);
  for i = 1:numberOfParticles
    suma = 0;
    for d = 1:dimensions
      suma = suma + (particles(pindex).current(d) - particles(i).current(d))^2;
    end
    dista(i)=sqrt(suma);
  end
  [X,I] = sort(dista);
  p = I(n);

%%-邻近一次的速度信息-------
function p = getNeighborIndexVector(pindex,n)
  global numberOfParticles;
  global dimensions;
  global particles;
  dista=zeros(1,numberOfParticles);
  for i = 1:numberOfParticles
    suma = 0;
    for d = 1:dimensions
      suma = suma + (particles(pindex).current(d) - particles(i).current(d))^2;
    end
    dista(i)=sqrt(suma);
  end
  [X,I] = sort(dista);
  p = I(1:n);

%%-邻近一次的适应度信息%%%%%
function p = getNeighborIndexWithBestFitness(pindex)
  global dimensions;
  global particles;
  global numberOfNeighbors;
  fit = zeros(1,4);
  for d = 1:numberOfNeighbors;
    fit(d) = test(particles(pindex).neighbor(d));
  end
  [X,I] = sort(fit);
  p = particles(pindex).neighbor(I(1));
  
  
%%-------------
%
%返回一个在最小值和最大值之间的随机整数return a random integer between min and max
%
function num = randint(min,max)
  array = min:max;
  index = mod(floor(rand(1)*1000),size(array,2))+1;
  num = array(index);

⌨️ 快捷键说明

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