近年来,基于启发式的多目标优化技术得到了很大的发展,研究表明该技术比经典方法更实用和高效。有代表性的多目标优化算法主要有NSGA、NSGA-II、SPEA、SPEA2、PAES和PESA等。粒子群优化(PSO)算法是一种模拟社会行为的、基于群体智能的进化技术,以其独特的搜索机理、出色的收敛性能、方便的计算机实现,在工程优化领域得到了广泛的应用,多目标PSO(MOPSO)算法应用到了不同的优化领域[9~11],但存在计算复杂度高、通用性低、收敛性不好等缺点。

多目标粒子群(MOPSO)算法是由CarlosA. Coello Coello等在2004年提出来的,详细参考1。目的是将原来只能用在单目标上的粒子群算法(PSO)应用于多目标上。我们知道原来的单目标PSO流程很简单:

-->初始化粒子位置(一般都是随机生成均匀分布)

-->计算适应度值(一般是目标函数值-优化的对象)

-->初始化历史最优pbest为其本身和找出全局最优gbest

-->根据位置和速度公式进行位置和速度的更新

-->重新计算适应度

-->根据适应度更新历史最优pbest和全局最优gbest

-->收敛或者达到最大迭代次数则退出算法

速度的更新公式如下:

等式右边有三部分组成。第一部分是惯性量,是延续粒子上一次运动的矢量;第二部分是个体认知量,是向个体历史最优位置运动的量;第三部分是社会认知量,是粒子向全局最优位置运动的量。

有了速度,则位置更新自然出来了:

以上是对于多目标PSO算法的介绍。运用到多目标上去的话,出现的问题有以下几点:

  1. 如何选择pbest。我们知道对于单目标优化来说选择pbest,只需要对比一下就可以选择出哪个较优。但是对于多目标来说两个粒子的对比,并不能对比出哪个好一些。如果粒子的每个目标都要好的话,则该粒子更优。若有些更好,有些更差的话,就无法严格的说哪个好些,哪个差一些。
  2. 如何选择gbest。我们知道对于单目标在种群中只有一个最优的个体。而对于多目标来说,最优的个体有很多个。而对PSO来说,每个粒子只能选择一个作为最优的个体(领带者)。该如何选择呢?

MOPSO对于第一个问题的做法是在不能严格对比出哪个好一些时随机选择一个其中一个作为历史最优。对于第二个问题,MOPSO则在最优集里面(存档中)根据拥挤程度选择一个领导者。尽量选择不那么密集位置的粒子(在这里用到了网格法)。MOPSO在选择领导者和对存档(也可以说是pareto临时最优断面)进行更新的时候应用了自适应网格法,详细参考4。

下面是MOPSO算法的步骤:

(1)初始化群体和Archive 集

给参数赋初值,生成初始群体P1,并把P1 中的非劣解拷贝到Archive 集中得到A1。设当前进化代数为 t,在t 小于总进化代数时完成(2)~(4)的内容。
(2)进化产生下一代群体
设当前进化的粒子 j,在j 小于群体规模时完成1)~3)的内容。

1)计算Archive 集中粒子的密度信息
把目标空间用网格等分成小区域,以每个区域中包含的粒子数作为粒子的密度信息。粒子所在网格中包含的粒子数越多,其密度值越大,反之越小。以二维目标空间最小化优化问题为例,密度信息估计算法的具体实现过程如下:

其中,G = M ×M 为目标空间要划分的网格数, Int( ⋅)为取整函数, Fi 1 和Fi 2 为粒子i 的目标函数值。

2)为群体中的粒子Pj,t 在At 中选择其gBest 粒子gj,tgj,t 粒子的质量决定了MOPSO 算法的收敛性能和非劣解集的多样性,其选择依据是Archive 集中粒子的密度信息。具体地,对于Archive 中的粒子,其密度值越低,选择的概率就越大,反之越小;用Archive 集中的粒子优于群体中的粒子数来评价其搜索潜力,优于群体中的粒子数越多,其搜索潜力越强,反之越弱。算法的具体实现如下:

其中,|At|表示At 包含的粒子数;Aj 用来存放At 中优于粒子Pj,t 的成员,Aj 中密度最小的粒子存放在Gj 中;Density(Ak)计算粒子Ak 的密度估计值;Rand{Gj,t}表示从Gj,t 中随机选择一个成员。
3)更新群体中粒子的位置和速度群体中的粒子在gBest 和pBest 的引导下搜索最优解,算法的具体实现如下:

其中,Pk,t+1 表示Pt+1 中的第k 个粒子;符号≺

最新文章

  1. Java 关键字、标识符、注释、常量与变量、数据类型,算术、赋值、比较、逻辑、位、三元运算符和流程控制、break、continue【3】
  2. GridView实现一个图片加多个文本框
  3. iOS耳机操作
  4. The Little Redis Book
  5. v$session_wait p1 p1raw p1_16
  6. VS2010 配置 DirectX 开发环境
  7. lincode.41 最大子数组
  8. 数组a和&a区别
  9. Google Cardboard的九轴融合算法——基于李群的扩展卡尔曼滤波
  10. Golang 入门 : 配置代理
  11. 巧用 即刻搜索事件 input propertychange 监听输入框字数
  12. 使用htpasswd及nginx auth模块对指定页面进行登录验证
  13. SpringBoot Druid整合,SpringBoot 集成Druid
  14. Spark学习之路 (四)Spark的广播变量和累加器
  15. Pytorch自定义dataloader以及在迭代过程中返回image的name
  16. 转shell中的awk用法详解
  17. Springboot 配置实现定时任务
  18. DEDECMS网站管理系统Get Shell漏洞
  19. java学习笔记1--开发环境平台总结
  20. Java中final修饰参数的作用

热门文章

  1. 让android webView使用系统默认浏览器内核直接解析,不弹出选择浏览器选项
  2. CSS知识点补充
  3. c#基础,面试前迅速巩固c#最基础知识点
  4. C# 常用日期函数
  5. Task多线程
  6. robot framework数据库操作
  7. kill 命令详解 系统信号
  8. Linux - sort & uniq
  9. Java基础——数组Array
  10. ICP算法使用遇到的问题