粒子群算法(PSO)

基本概念

D维空间中,有N个粒子;

粒子i位置: Xi=(xi1,xi2,xi3,…,xiD)X_i = (x_{i1},x_{i2},x_{i3},\dots,x_{iD})Xi​=(xi1​,xi2​,xi3​,…,xiD​),将Xi代入适应度函数f(Xi)求适应值;

粒子i速度:Vi=(Vi1,Vi2,Vi3,…,ViD)V_i = (V_{i1},V_{i2},V_{i3},\dots,V_{iD})Vi​=(Vi1​,Vi2​,Vi3​,…,ViD​)

粒子i经历过的最好位置: pbest=(pi1,pi2,…,piD)pbest=(p_{i1},p_{i2},\dots,p_{iD})pbest=(pi1​,pi2​,…,piD​)

种群所经历过的最好位置: gbest=(g1,g2,…,gD)gbest = (g_1,g_2,\dots,g_D)gbest=(g1​,g2​,…,gD​)

注意:速度变化范围需要被限制在[−Vmax,d,Vmax,d-V_{max,d},V_{max,d}−Vmax,d​,Vmax,d​]内,若VidV_{id}Vid​超过了最大边界值,则该维的速度被限制为该维的最大速度。

(从ppt后面的例子,在解四维空间最小值的问题中貌似不会强行拉回解空间)

粒子i的第d维速度和位置更新公式:
Vidk=wVidk−1+c1r1(pbestid−xidk−1)+c2r2(gbestd−xidk−1)xidk=xidk−1+VidkV_{id}^k = w V_{id}^{k-1} + c_1r_1(pbest_{id}-x_{id}^{k-1}) + c_2r_2(gbest_d-x_{id}^{k-1}) \\ x_{id}^{k} = x_{id}^{k-1} + V_{id} ^k Vidk​=wVidk−1​+c1​r1​(pbestid​−xidk−1​)+c2​r2​(gbestd​−xidk−1​)xidk​=xidk−1​+Vidk​
VidkV_{id}^kVidk​ : 第k次迭代粒子i的速度矢量的第d维分量。

xidkx_{id}^kxidk​:第k次迭代粒子i的位置矢量的第d维分量。

c1,c2c_1,c_2c1​,c2​:加速常数,。

r1,r2r_1,r_2r1​,r2​:[0,1]随机数,增加随机性

w:惯性权重因子,决定当前速度与上一次速度关联的大小(了解过momentum的同学应该非常熟悉)

惯性权重因子w

w较大,全局寻优强,w较小,局部寻优强。启示我们要在迭代开始时让w较大,快结束时让w较小。

线性递减权值
w=wmax−(wmax−wmin)×runrunmaxw = w_{max} - (w_{max}-w_{min}) \times \frac{run}{run_{max}} w=wmax​−(wmax​−wmin​)×runmax​run​
如此设置权重使得开始迭代时w较大,全局寻优强(避免陷入局部最优解),快结束时w较小,局部寻优强(避免震荡不收敛)。

算法过程

  1. 初始化参数和控制参数

    • 粒子群大小,初始位置,初始位置,最大迭代次数,速度范围,位置范围;
    • 惯性因子w,加速度系数,已经迭代的次数(0)。
  2. 根据适应度函数,评价每个粒子的适应度
  3. 对于每个粒子,将其适应度值与其个人历史最佳(pbest)相比较。如果当前适应度值更高,则将用当前位置去更新最佳位置
  4. 对于每个粒子,将其当前适应度值与全局最佳位置(gbest)对应的适应度值比较,如果当前适应度值更高,则将用当前位置去更新最佳位置gbest
  5. 根据公式去更新每个粒子的速度,判断速度是否满足范围要求,若不满足需要纠正,纠正后更新位置。
  6. 判断是否满足退出条件,即算法到达最大迭代次数或者最佳适应度值得增量小于某个给定的阈值,则算法停止,否则返回步骤2.

应用

考试中如何书写?给出具体例子。
求minx2−4x+3求 min \quad x^2-4x+3 求minx2−4x+3

  1. 首先初始化参数,粒子群大小设置为30,粒子维度为1维,适应度函数为x2−4x+3x^2-4x+3x2−4x+3,惯性权重因子w为0.8,加速常数c1为2,c2为2,最大迭代次数为100次。然后去随机初始化种群每个个体的位置和初始速度,并记录下此时每个粒子经历过的最好位置(即当前位置)以及种群最好的位置。

  2. 根据适应度函数去评价每个粒子的适应度

  3. 对于每个粒子,将其适应度值与其个人历史最佳(pbest)相比较。如果当前适应度值更高,则将用当前位置去更新最佳位置

    temp = self.function(self.x[i])
    if temp < self.p_fit[i]:self.p_fit[i] = tempself.pbest[i] = self.x[i]
    
  4. 在该粒子小于其个人历史最佳的基础之上,再将其与全局最佳位置(gbest)对应的适应度值比较,如果当前适应度值更高,则将用当前位置去更新最佳位置gbest

    temp = self.function(self.x[i])
    if temp < self.p_fit[i]:self.p_fit[i] = tempself.pbest[i] = self.x[i]if self.p_fit[i] < self.fit:  # 更新全局最优self.gbest = self.X[i]self.fit = self.p_fit[i]
    
  5. 根据公式去更新每个粒子的速度,判断速度是否满足范围要求,若不满足需要纠正,纠正后更新位置。

  6. 判断是否满足退出条件,即算法到达最大迭代次数或者最佳适应度值得增量小于某个给定的阈值,则算法停止,否则返回步骤2.

最优化——粒子群算法(PSO)相关推荐

  1. C语言实现粒子群算法(PSO)一

    C语言实现粒子群算法(PSO)一 最近在温习C语言,看的书是<C primer Plus>,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法.粒子群算法.蚁群算法等等. ...

  2. 粒子群算法(PSO)的C++实现

    粒子群算法(PSO)的C++实现 粒子群算法(PSO----Particle Swarm Optimization)是常用的智能算法之一,它模拟了 鸟群觅食 行为,是一种具有随机性的 仿生算法 .PS ...

  3. 粒子群算法(PSO)Matlab实现(两种解法)

    粒子群算法(PSO) 用途:可以用于寻求最优解问题 生物机理:鸟群寻找湖泊 在函数中,有很多是无法求出最优解的 在这时,我们会采用软计算方法,而PSO算法,在软计算算法中有重要的地位: 好吧,这个仁者 ...

  4. 粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...

  5. 【老生谈算法】标准粒子群算法(PSO)及其Matlab程序和常见改进算法——粒子群算法

    1.算法详解: 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]标准粒子群算法(PSO)及其Matlab程序和常见改进算法.docx 2 ...

  6. 粒子群算法(PSO)以及Matlab实现

    粒子群算法(PSO)以及Matlab实现 算法背景 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy ...

  7. 粒子群算法(PSO)初识

    粒子群算法PSO是模拟群体智能所建立起来的一种优化算法,用于解决各种优化问题. 抽象问题实例化: 假设一群 鸟在觅食,只有一个地方有 食物,所有鸟儿都看不见食物(不知道食物的具体位置,知道了就不无需觅 ...

  8. Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...

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

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

最新文章

  1. Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
  2. RTCStartupDemo:一款极其简单的 WebRTC 入门项目
  3. Java学习笔记_选择语句
  4. tty,串口,控制台与驱动程序
  5. satd残差_RDO、SAD、SATD、λ相关概念【转】
  6. VC++判断文件或文件夹是否存在(转)
  7. C语言程序设计孙鸿飞PPT,清华大学出版社-图书详情-《C语言程序设计》
  8. SQL Server误区30日谈-Day28-有关大容量事务日志恢复模式的误区
  9. C++语法_深度剖析C++中的inline函数
  10. matlab版本和yalmip兼容,科学网—matlab cvx + yalmip - 吴锐的博文
  11. c语言删除堆栈所有的结点,深入浅出数据结构C语言版(15)——优先队列(堆)(示例代码)...
  12. 服务器 2.5 英寸硬盘托架安装
  13. 【项目实战——emos在线办公系统】:会议申请、请假申请等部分代码理解
  14. 大佬们用代码写的故事
  15. CTF WEB WP杂谈
  16. 差分 线宽 线距_做设计时线宽、线距规则设置多大比较好?
  17. 高可靠性技术之RRPP和VRRP
  18. ubuntu关闭网络防火墙后,外网依然不能连接ubuntu的端口
  19. 港科夜闻|香港科技大学国际管理理学硕士(MIMT)课程连续第二年跻身全球管理教育联盟 (CEMS) 2021年度最佳学院前三甲...
  20. 根据网址搜索类似的网站

热门文章

  1. Python数据分析必知必会——TGI指数
  2. Prometheus监控:rate与irate的区别
  3. 【Prometheus】Node Exporter常用查询PromQL 语句大总结
  4. match在java中_Java中的Patter类和Match类
  5. STM32Duino 下载 https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.jso
  6. Jso对象转化Java对象_Nutz.Json 转为Java对象
  7. 线性时不变系统(LIT )
  8. CodeForces - Insertion Sort(打表找规律)
  9. 利用html编码进行xss攻击
  10. 世界上第一台个人微型计算机,中职计算机基础应用高一年级上学期期末考试试卷含答案...