||
通常,把粒子群优化算法(Particle Swarm Optimization, PSO)划分为群体智能。但它仍然可以看做是演化计算的分支。
PSO是模拟鸟群等的活动而抽象出来的一个智能算法,与前面的遗传算法相比,总体上软件设计仍然可以按照四大模块依次进行:即个体类、工具箱类、种群类和测试类。
一个粒子可看作一个可能解,它包含位置X(x1,x2,...,xn)和速度V(v1,v2,...,vn)两个属性,若是多元函数求最优,则位置与速度都可以设为两个向量,在高级语言中可以用数组表示。使用速度这个名称容易产生误解,应该称为位置的增量更好一些。
两个核心迭代公式为:
(1)
(2)
下面以计算maxF(X),F(X)=100-,-5.12<=xi<-5.12
个体类:
class Point { double[] x; double[] v; double fitness; static int dim=10; static double xmax=5.12; static double xmin=-5.12; static double vmax=10.28; static double vmin=-10.28; public Point() { x=new double[dim]; v=new double[dim]; init(); } void init() { for(int i=0;i<x.length;i++) x[i]=xmin+Math.random()*(xmax-xmin); for(int i=0;i<v.length;i++) v[i]=vmin+Math.random()*(vmax-vmin); } public double getFitness() { double sum=0; for(int i=0;i<x.length;i++) sum=sum+x[i]*x[i]; fitness=100-sum; return fitness; } }
工具箱类:
class Tools { public static void copy(Point a,Point b) { for(int i=0;i<a.x.length;i++) { b.x[i]=a.x[i]; b.v[i]=a.v[i]; } b.fitness=a.fitness; } public static int getBestPos(Point[] arr) { int pos=0; double max=arr[pos].fitness; for(int i=1;i<arr.length;i++) { if(max<arr[i].fitness) { max=arr[i].fitness; pos=i; } } return pos; } }
种群类:
class PSOSet { Point[] obj; Point[] pbest; Point gbest; public PSOSet(int size) { obj=new Point[size]; pbest=new Point[size]; for(int i=0;i<obj.length;i++) { obj[i]=new Point(); obj[i].getFitness(); pbest[i]=new Point(); Tools.copy(obj[i],pbest[i]); } int bestpos=Tools.getBestPos(pbest); gbest=new Point(); Tools.copy(pbest[bestpos],gbest); } public void update() { for(int j=0;j<obj.length;j++) { for(int i=0;i<Point.dim;i++) { double r1,r2; r1=Math.random(); r2=Math.random(); obj[j].v[i]=(0.9)*obj[j].v[i]+r1*(pbest[j].x[i]-obj[j].x[i])+r2*(gbest.x[i]-obj[j].x[i]); if(obj[j].v[i]>Point.vmax) obj[j].v[i]=Point.vmax; if(obj[j].v[i]<Point.vmin) obj[j].v[i]=Point.vmin; obj[j].x[i]= obj[j].x[i]+obj[j].v[i]; if(obj[j].x[i]>Point.xmax) obj[j].x[i]=Point.xmax; if(obj[j].x[i]<Point.xmin) obj[j].x[i]=Point.xmin; } } //更新每个个体历史最优 for(int i=0;i<obj.length;i++) { obj[i].getFitness(); if(obj[i].fitness>pbest[i].fitness) Tools.copy(obj[i],pbest[i]); } //更新全局最优 int allbest=Tools.getBestPos(pbest); if(pbest[allbest].fitness>gbest.fitness) Tools.copy(pbest[allbest],gbest); } }
测试类
public class TestPSO { public static void main(String[] arg) { PSOSet s=new PSOSet(40); int n=0; while(n<1000) { s.update(); n++; } System.out.println("dim="+Point.dim+",Max="+s.gbest.getFitness()); } }
代码中,惯性因子直接取值为0.9,c1、c2取值为1,只是一种简化方式而已,针对不同问题参考相关文献进行调整。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 09:06
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社