潘峰
演化计算:粒子群优化算法(10)
2024-4-17 09:26
阅读:312

通常,把粒子群优化算法(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,只是一种简化方式而已,针对不同问题参考相关文献进行调整。

转载本文请联系原作者获取授权,同时请注明本文来自潘峰科学网博客。

链接地址:https://wap.sciencenet.cn/blog-260510-1430022.html?mobile=1

收藏

分享到:

下一篇
当前推荐数:0
推荐到博客首页
网友评论0 条评论
确定删除指定的回复吗?
确定删除本博文吗?