粒子群优化(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<Particle> particles = new ArrayList<Particle>();// 粒子群
 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

普通粒子群算法和优化方法相关推荐

  1. MATLAB优化工具箱 粒子群算法 particleswarm优化包

    记录几篇对我应用MATLAB粒子群particleswarm优化包很有帮助的文档. [1] <Tune Particle Swarm Optimization Process>matlab ...

  2. 【ELM预测】基于粒子群算法PSO优化极限学习机预测含Matlab源码

    1 模型 为了提高空气质量预测精度,提出一种基于粒子群算法优化极限学习机的空气质量预测模型.运用粒子群算法优化极限学习机的初始权值和偏置,在保证预测误差最小的情况下实现空气质量最优预测.选择平均绝对百 ...

  3. 【回归预测-ELM预测】基于粒子群算法PSO优化极限学习机预测附matlab代码

    1 内容介绍 风电功率预测为电网规划提供重要的依据,研究风电功率预测方法对确保电网在安全稳定运行下接纳更多的风电具有重要的意义.针对极限学习机(ELM)回归模型预测结果受输入参数影响的问题,现将粒子群 ...

  4. 粒子群算法(PSO)优化最小二乘支持向量机分类预测,PSO-LSSVM分类预测,多输入单输出模型。

    %%  清空环境变量 warning off             % 关闭报警信息 close all               % 关闭开启的图窗 clear                 ...

  5. 粒子群算法(PSO)优化最小二乘支持向量机回归预测,PSO-LSSVM回归预测,多输入单输出模型。

    %%  清空环境变量 warning off             % 关闭报警信息 close all               % 关闭开启的图窗 clear                 ...

  6. 粒子群算法PSO优化最小二乘支持向量机做回归预测,多输入单输出模型。PSO-LSSVM

    %%  清空环境变量 warning off             % 关闭报警信息 close all               % 关闭开启的图窗 clear                 ...

  7. 遗传算法_粒子群算法优化支持向量机分类预测-附代码

    遗传算法/粒子群算法优化支持向量机分类预测-附代码 文章目录 遗传算法/粒子群算法优化支持向量机分类预测-附代码 1. 支持向量机简介与参数优化的原理 1.1 支持向量机SVM简介 1.2 优化参数的 ...

  8. 基于粒子群算法的微电网优化调度应用研究(一、摘要及绪论)

    摘 要 在能源与环境的双重压力下,微电网技术受到了越来越多的关注,由于可再生能源的不确定性,微电网的优化调度是现阶段需要解决的首要问题,微电网的优化调度关系到微电网体系内的能源利用率.承担负荷的可靠性 ...

  9. 粒子群算法优化策略总结

    粒子群算法优化策略总结 前言 1 对于惯性权重w的优化 1.1 引入混沌Sine映射构造非线性随机递增惯性权重 1.2 采用一种指数型的非线性递减惯性权重 1.3 分策略更改惯性权重 2 对于c1.c ...

最新文章

  1. 扩增子文献笔记2拟南芥根微生物组的结构和组成
  2. 【Linux】解决Linux服务器内存不足问题
  3. 电子信息工程水声考研去向_哈工大电子与信息工程专业考研 科研方向汇总
  4. 点击事件为什么会失效_1917年的法蒂玛事件,为什么会被称为最为惊悚的UFO目击事件?...
  5. 优秀Java开发者都在看的书籍
  6. brackets作为html编辑器,为前端而生丨编辑器 Brackets 及配置推荐
  7. c++中计算2得n次方_PLC-上海会通松下PLC中的数据类型有哪些?
  8. 中文命名实体识别,HMM,CRF,BiLSTM,BiLSTM+CRF的具体实现
  9. html 滑动导航效果,jQuery实现的滑块滑动导航效果示例
  10. thinkpad笔记本电脑不按Fn键直接实现F1-F12功能的方法
  11. Implement queue with two stack 用两个堆实现队列
  12. linux 修复 gpt分区表,修复GPT分区表
  13. 单片机LED与蜂鸣器原理与实践
  14. 如何学好高中数学 提高高中数学成绩秒杀技巧(这几点很重要)
  15. 微信怎么关闭微信朋友圈及点赞提醒通知?
  16. fiddler mac教程_Mac os 安装fiddler
  17. 重装系统(GHO)镜像介绍及下载
  18. solr6.3与MySQL结合使用
  19. SKYLAKE平台安装win7步骤(U盘)
  20. 用php求圆柱圆锥的面积,认识圆锥体a href=http://ruiwen.com/friend/list.php(教师中心专稿)/a...

热门文章

  1. [vb+mo] visual baisc 6.0 基于mapobjects 2.4 开发的数字化校园电子地图
  2. ubuntu中常用指令
  3. usaco wormhole(看了官方视频题解)
  4. mysql 4.0.27 下载,CentOS编译Mysql 4.0.27数据库问题解决
  5. python爬取晋江_[Arcpy] 爬取高德地图面状地物(半自动化)—获取任意地区的行政边界...
  6. linux离线安装g 报错,Linux离线安装mysql 5.6详细步骤
  7. 华科计算机优势专业排名,985高校强势热门专业排行榜,浙大川大华科表现较好...
  8. java 流的概念_举例讲解Java中的Stream流概念
  9. mysql配置文件没有spring_spring cloud config使用mysql存储配置文件
  10. java数据和窗口怎么结合_卖jsp编程技巧的那个垃圾的所有实例的答案全部