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

📄 matlab&pso.txt

📁 matlab写的pso程序
💻 TXT
字号:
只体现了基本算法,没加什么修改,欢迎指正:
[不是很喜欢matlab,不灵活,慢,不过最大的好处就是编程简单拉]
% function [bestparticle,tarce] = pso(range,swarminit,gen,EVALFCN,c1,c2,w0,w1,vmax,smax)
% PSO优化过程,这是适应度越小越好的情况,对应于误差
% bestparticle-保存历史最佳粒子 S维
% trace-纪录最佳适应度的改变过程 gen维
% range-位移要保持的范围
% swarminit-初始粒子群
% gen-最多迭代代数
% EVALFCN-适应度函数名
% c1,c2,w0,w1-pso相关参数的设置
% vmax-最大限制速度
% smax-最大限制位移

function [bestparticle,trace] = pso(range,swarminit,gen,EVALFCN,c1,c2,w0,w1,vmax,smax)
[popu,S] = size(swarminit);
velocityinit = vmax .* (2 .* rand(popu,S) - 1);   % 速度初始化为-range +range之间

trace = ones(1,gen);
trace(1) = 10000;   % 初始全局最佳适应度设为足够大
for i = 1:popu
  bestfit(i) = 10000; % 初始个体历史最佳适应度设为足够大
end

bestpar = swarminit;   % 个体历史最佳粒子初始化

for step = 1:gen
  fprintf(1,'%d ',step);
  str = [EVALFCN,'(swarminit)'];   
  fitlist = eval(str);   % 计算当前粒子群每个粒子的适应度   
  
  [minval,sub] = min(fitlist);   % 求得这代粒子的适应度最小值及其下标
  if(trace(step) > minval)
    fprintf(1,'%d %f\n',step,minval);
    trace(step) = minval;
    bestparticle = swarminit(sub,:);         
  end
  
  if(step ~= gen)
    trace(step + 1) = trace(step); % 全局最佳适应度及最佳粒子调整
  end
  
  for i = 1:popu
    if(bestfit(i) > fitlist(i))
        bestfit(i) = fitlist(i);
        bestpar(i,:) = swarminit(i,:);
    end
  end % 个体历史最佳粒子及适应度调整
  
  w = w0 - w1 * (step / gen); % 惯性权值的调整 
  
  
  
  for i = 1:popu
    for j = 1:S
        r1 = rand(1,1);
        r2 = rand(1,1);
        velocityinit(i,j) = w * velocityinit(i,j) + c1 * r1 * (bestpar(i,j) - swarminit(i,j)) +...
          c2 * r2 * (bestparticle(j) - swarminit(i,j));
        if(velocityinit(i,j) > vmax)
          velocityinit(i,j) = vmax;
          %'速度+越界'
        end
        if(velocityinit(i,j) < -vmax)
          velocityinit(i,j) = -vmax;
          %'速度-越界'
        end % 如果速度越界,速度取那方面最大值
        
        swarminit(i,j) = swarminit(i,j) + velocityinit(i,j);
  %     if(swarminit(i,j) > smax)
  %       swarminit(i,j) = smax;
  %       '位移+越界'
  %     end % 如果位移越界,位移重新初始化
  %     if(swarminit(i,j) < -smax)
  %       swarminit(i,j) = -smax;
  %       '位移-越界'
  %     end % 如果位移越界,位移重新初始化
    end
  end   
end

⌨️ 快捷键说明

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