现代优化计算方法-粒子群算法(PSO)简单实现 2017-12-15 粒子群算法(PSO)简单复现用粒子群算法求解一个简单函数的最小值,下附Java代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101package pso;/* *粒子群算法 *求解f=x*x+y*y的最小值,x的范围为[0,4),y的范围为[0,4)*/public class PSO { private double c1; //学习因子c1 private double c2; //学习因子c2 private double w; //惯性权重 private double globalbest; //整个粒子群历史最优解 private double[] presentbest; //单个粒子历史最优解 private int num; //粒子数量 private int n; //迭代次数 private double[] positionx; //粒子群数组 private double[] positiony; //粒子群数组 private double Vmax; //粒子最大速度 private double[] v; //粒子群速度数组 //构造函数 public PSO(double c1, double c2, double w, int num, int n) { this.c1 = c1; this.c2 = c2; this.w = w; this.num = num; this.n = n; } //初始化 public void init(){ positionx = new double[num]; positiony = new double[num]; presentbest = new double[num]; v = new double[num]; for(int i=0;i<num;i++){ positionx[i] = (double) Math.random()*4; positiony[i] = (double) Math.random()*4; v[i] = (double) Math.random(); presentbest[i] = (double) Integer.MAX_VALUE; } globalbest = (double) Integer.MAX_VALUE; Vmax = 4.0; } //适值函数(即所要优化的函数) public double getFitness(double x,double y){ double f = 0; f = x*x + y*y; return f; } //粒子群算法 public void solve(){ System.out.println("start..."); int m = 0; //循环计数变量 double vx = 0; //当前x维度的速度 double vy = 0; //当前y维度的速度 init(); //c初始化 do{ //获取每个粒子的最优解 for(int j=0;j<num;j++){ if(presentbest[j]>getFitness(positionx[j],positiony[j])){ presentbest[j] = getFitness(positionx[j],positiony[j]); } } //h获取整个种群的最优解 double min = presentbest[0]; for(int i=1;i<num;i++){ if(presentbest[i]<min){ min = presentbest[i]; } } globalbest = min; //粒子群算法核心 for(int k=0;k<num;k++){ vx = w*v[k] + c1*Math.random()*(presentbest[k]-positionx[k]) + c2*Math.random()*(globalbest-positionx[k]); vy = w*v[k] + c1*Math.random()*(presentbest[k]-positiony[k]) + c2*Math.random()*(globalbest-positiony[k]); //判断是否超出最大速度 if(vx>Vmax){ vx = Vmax; } if(vy>Vmax){ vy = Vmax; } positionx[k] = positionx[k] + vx; positiony[k] = positiony[k] + vy; } //每次迭代输出一次最优解 System.out.println(globalbest); m++; }while(m<n); //输出最终最优解 System.out.println("最优解为:"+globalbest); } public static void main(String[] args) { PSO pos = new PSO(2,2,0.8,15,50); pos.solve(); }} 赏 谢谢老板 支付宝 微信 PSO 函数优化 扫一扫,分享到微信