首页 > 普通粒子群算法和优化方法

普通粒子群算法和优化方法

粒子群优化(PSO, particle swarm optimization) 是由Kennedy和Eberhart在1995年提出的一 种群智能优化方法。

优点:好理解容易实现,适合解决极值问题

缺点:容易过早收敛,容易陷入局部最优解,(如果初始点选的不好,可能就会被某个粒子带偏了= =/)

(Java实现):

 1 package pso;
 2 
 3 import java.util.Random;
 4 
 5 /**
 6  * 粒子类
 7  * 
 8  * @see dimension
 9  * @author Flyuz
10  */
11 public class Particle {
12     // 维数
13     public int dimension = 2;
14     // 粒子的位置
15     public double[] X = new double[dimension];
16     // 粒子的速度
17     public double[] V = new double[dimension];
18     // 局部最好位置
19     public double[] pbest = new double[dimension];
20     // 最大速度
21     public double Vmax = 2;
22     // 最大位置
23     public double[] Xmax = { 2, 2 };
24     // 最小位置
25     public double[] Xmin = { -2, -2 };
26     // 适应值
27     public double fitness;
28 
29     /**
30      * 根据当前位置计算适应值 本例子求式子最大值
31      * 
32      * @return newFitness
33      */
34     public double calculateFitness() {
35 
36         double newFitness = 0;
37         if (X[0] == 0 && X[1] == 0)
38             newFitness = Math.exp((Math.cos(2 * Math.PI * X[0]) + Math.cos(2 * Math.PI * X[1])) / 2) - 2.71289;
39         else
40             newFitness = Math.sin(Math.sqrt(Math.pow(X[0], 2) + Math.pow(X[1], 2)))
41                     / Math.sqrt(Math.pow(X[0], 2) + Math.pow(X[1], 2))
42                     + Math.exp((Math.cos(2 * Math.PI * X[0]) + Math.cos(2 * Math.PI * X[1])) / 2) - 2.71289;
43         return newFitness;
44     }
45 
46     /**
47      * 初始化自己的位置和pbest
48      */
49     public void initialX() {
50         for (int i = 0; i < dimension; i++) {
51             X[i] = new Random().nextDouble() * (Xmax[i] - Xmin[i]) + Xmin[i];
52             pbest[i] = X[i];
53         }
54     }
55 
56     /**
57      * 初始化自己的速度
58      */
59     public void initialV() {
60         for (int i = 0; i < dimension; i++) {
61             V[i] = new Random().nextDouble() * Vmax * 0.5;
62         }
63     }
64 }
粒子类
算法类
针对缺点,提出了 Multi-start PSO 算法,即每迭代若干次后,都保留历史优粒子,粒子全部初始化,以提高粒子的多样性,扩大搜索 空间。又提出了一种动态惯性权重的粒子群优化算法,惯性权重随着迭代次数的增加而降低,在开始阶段具有较强的全局搜索能力,而在后期以 较小的惯性权重能够收敛到优解。 
  1 package pso;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import java.util.Random;
  6 
  7 public class NormalPSO {
  8 
  9     private static double[] gbest;// 全局最优位置
 10     private static double gbest_fitness = -0x3f3f3f;// 全局最优位置对应的fitness
 11     private static int particle_num = 10;// 粒子数
 12     private static int N = 100;// 迭代次数
 13     private static int c1, c2 = 2;
 14     private static double w = 1.4;// 惯性因子
 15     private static List particles = new ArrayList();// 粒子群
 16 
 17     /**
 18      * 初始化所有粒子
 19      */
 20     public static void initialParticles() {
 21         for (int i = 0; i < particle_num; i++) {
 22             Particle particle = new Particle();
 23             particle.initialX();
 24             particle.initialV();
 25             particle.fitness = particle.calculateFitness();
 26             particles.add(particle);
 27         }
 28     }
 29 
 30     /**
 31      * 更新 gbest
 32      */
 33     public static void updateGbest() {
 34         double fitness = -0x3f3f3f;
 35         int index = 0;
 36         for (int i = 0; i < particle_num; i++) {
 37             if (particles.get(i).fitness > fitness) {
 38                 index = i;
 39                 fitness = particles.get(i).fitness;
 40             }
 41         }
 42         if (fitness > gbest_fitness) {
 43             gbest = particles.get(index).pbest.clone();
 44             gbest_fitness = fitness;
 45         }
 46     }
 47 
 48     /**
 49      * 更新每个粒子的速度
 50      */
 51     public static void updateV() {
 52         for (Particle particle : particles) {
 53             for (int i = 0; i < particle.dimension; i++) {
 54                 double v = w * particle.V[i] + c1 * rand() * (particle.pbest[i] - particle.X[i])
 55                         + c2 * rand() * (gbest[i] - particle.X[i]);
 56                 if (v > particle.Vmax)
 57                     v = particle.Vmax * rand();
 58                 else if (v < -particle.Vmax)
 59                     v = -particle.Vmax * rand();
 60                 particle.V[i] = v;// 更新Vi
 61             }
 62         }
 63     }
 64 
 65     /**
 66      * 更新每个粒子的位置和pbest
 67      */
 68     public static void updateX() {
 69         for (Particle particle : particles) {
 70             for (int i = 0; i < particle.dimension; i++) {
 71                 particle.X[i] = particle.X[i] + particle.V[i];
 72                 if (particle.X[i] > particle.Xmax[i])
 73                     particle.X[i] = new Random().nextDouble() * (particle.Xmax[i] - particle.Xmin[i])
 74                             + particle.Xmin[i];
 75                 if (particle.X[i] < particle.Xmin[i])
 76                     particle.X[i] = new Random().nextDouble() * (particle.Xmax[i] - particle.Xmin[i])
 77                             + particle.Xmin[i];
 78             }
 79             double newFitness = particle.calculateFitness();// 新的适应值
 80             if (newFitness > particle.fitness) {
 81                 particle.pbest = particle.X.clone();
 82                 particle.fitness = newFitness;
 83             }
 84         }
 85     }
 86 
 87     /**
 88      * 算法主要流程
 89      */
 90     public static void process() {
 91         int n = 0;
 92         initialParticles();
 93         updateGbest();
 94         while (n++ < N) {
 95             /*
 96              * Multi-start PSO 算法,即每迭代若干次后,都保留历史优粒子, 粒子全部初始化,以提高粒子的多样性,扩大搜索 空间。
 97              */
 98             if (n == N / 2) {
 99                 initialParticles();
100                 updateGbest();
101             }
102             updateV();
103             updateX();
104             updateGbest();
105             w -= 0.01; // 动态惯性权重
106             System.out.println(n + ". 当前gbest:(" + gbest[0] + "," + gbest[1] + ")  fitness = " + gbest_fitness);
107         }
108     }
109 
110     public static double rand() {
111         return new Random().nextDouble();
112     }
113 
114     public static void main(String[] args) {
115         process();
116     }
117 }
改进后的PSO

改进后,虽然有一定的效果,但是效果不太明显。

后来又提出许多混合粒子群算法,比如遗传粒子群(BPSO)、免疫粒子群(IPSO)、混沌粒子群等(CPSO),针对不同的领域,需选用适合的优化算法。

 

 

 

转载于:https://www.cnblogs.com/flyuz/p/9210777.html

更多相关:

  • 在.Net Framework中,配置文件一般采用的是XML格式的,.NET Framework提供了专门的ConfigurationManager来读取配置文件的内容,.net core中推荐使用json格式的配置文件,那么在.net core中该如何读取json文件呢?1、在Startup类中读取json配置文件1、使用Confi...

  •   1 public class FrameSubject extends JFrame {   2    3   …………..   4    5   //因为无法使用多重继承,这儿就只能使用对象组合的方式来引入一个   6    7   //java.util.Observerable对象了。   8    9   DateSub...

  • 本案例主要说明如何使用NSwag 工具使用桌面工具快速生成c# 客户端代码、快速的访问Web Api。 NSwagStudio 下载地址 比较强大、可以生成TypeScript、WebApi Controller、CSharp Client  1、运行WebApi项目  URL http://yourserver/swagger 然后...

  •   在绑定完Action的所有参数后,WebAPI并不会马上执行该方法,而要对参数进行验证,以保证输入的合法性.   ModelState 在ApiController中一个ModelState属性用来获取参数验证结果.   public abstract class ApiController : IHttpController,...

  • 1# 引用  C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.dll C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.Presentation.dll 2# 引用命名空间, using Aveva.Applicati...

  • Qt默认的QSlider和QSpinbox只能实现整数调整,不能实现浮点的变化,因此设计了如下可实现浮点变化的QFloatSlider和QFloatSpinner: QFloatSlider.h class QFloatSlider : public QSlider {Q_OBJECTpublic:QFloatSlider(QWi...

  • 一、概述 之前的文章介绍过卡尔曼滤波算法进行定位,我们知道kalman算法适合用于线性的高斯分布的状态环境中,我们也介绍了EKF,来解决在非高斯和非线性环境下的机器人定位算法。但是他们在现实应用中存在计算量,内存消耗上不是很高效。这就引出了MCL算法。 粒子滤波很粗浅的说就是一开始在地图空间很均匀的撒一把粒子,然后通过获取机器人的...

  • 1.精度问题 由于是double类型,r=mid 而不是r=mid-12.如果首位两端(f(0)和f(100))同号,证明解不在[1,100]区间内 这是我之所以TE的原因,没有预先判断3.若在这个区间内,则一定可要求出解 所以binarysearch 返回m#include #include ...

  • 代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 类图:...

  • 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=41&page=show_problem&problem=1121 题意:给出两点坐标,用一条最短的线(曲线或者直线)连接起来,坐标系中原点处有一个半径为R的圆,连线不能...

  • jdt可以做语法树分析,并且支持visitor模式对代码进行分析。跟pmd的分析方式一样,我们只要实现 visitor接口即可实现一个插件。 @Service("requestMappingInfoService")public class RequestMappingInfoServiceImpl implements Reques...

  • 1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法。  (2)它们只能访问static数据。 (3)它们不能以任何方式引用this 或super。 class Simple {static v...

  • 类的静态构造函数也叫类型构造器,静态构造器,他调用的时刻由CLR来控制:CLR会选择如下时间之一来调用静态构造函数:      1,在类型的第一个实例创建之前,或类型的非继承字段或成员第一次访问之前。这里的“之前”,代表前后衔接的意思。这里的时刻是精确的!      2,在非继承的静态字段或成员第一次访问之前的某个时刻,具体时刻不定!...

  • 2019独角兽企业重金招聘Python工程师标准>>> django的settings中包含三个static相关设置项: STATIC_ROOT STATIC_URL STATICFILES_DIRS STATIC_URL 好理解,就是映射到静态文件的url,一般为/static/ STATICFILES...