文章目录

  • 1. MODA-多目标差分进化算法
  • 2. NSGA2-非支配排序遗传算法
  • 3. MOPSO-多目标粒子群算法
  • 4. 测试算例
  • 4. 测试结果
    • 4.1. 多目标差分进化算法求解结果
    • 4.2. NSGA2算法求解结果
    • 4.3 MOPSO算法求解结果
    • 4.4 结果对比
  • 5. 参考文献

1. MODA-多目标差分进化算法

基于快速非支配排序算法和拥挤度。

算法主程序

def MODE(nIter, nChr, nPop, F, Cr, func, lb, rb):"""多目标差分进化算法主程序 Params:nIter: 迭代次数nPop: 种群规模 F: 缩放因子 Cr: 交叉概率 func:优化函数 lb: 自变量下界 rb:自变量上界 Return:paretoPops: 帕累托解集 paretoFits: 对应的适应度 """# 生成初始种群 parPops = initPop(nChr, nPop, lb, rb) parFits = fitness(parPops, func) # 开始迭代  iter = 1 while iter <= nIter:# 进度条 print("【进度】【{0:20s}】【正在进行{1}代...】【共{2}代】".\format('▋'*int(iter/nIter*20), iter, nIter), end='\r')mutantPops = mutate(parPops, F, lb, rb)  # 产生变异向量 trialPops = crossover(parPops, mutantPops, Cr)  # 产生实验向量 trialFits = fitness(trialPops, func)  # 重新计算适应度 pops = np.concatenate((parPops, trialPops), axis=0)  # 合并成新的种群fits = np.concatenate((parFits, trialFits), axis=0) ranks = nonDominationSort(pops, fits)  # 非支配排序 distances = crowdingDistanceSort(pops, fits, ranks)  # 计算拥挤度 parPops, parFits = select1(nPop, pops, fits, ranks, distances)   iter += 1 print("\n") # 获取等级为0,即实际求解得到的帕累托前沿 paretoPops = pops[ranks==0] paretoFits = fits[ranks==0] return paretoPops, paretoFits

由父代种群和经过差分变异交叉后的实验种群混合成一个新的种群,对新的种群进行非支配排序,利用1对1锦标赛选择算子筛选出新的父代种群。

2. NSGA2-非支配排序遗传算法

采用精英策略,在进行交叉变异操作之后对新产生的种群与父代种群混合成新的种群,对新的种群进行优选。

算法主程序

def NSGA2(nIter, nChr, nPop, pc, pm, etaC, etaM, func, lb, rb): """非支配遗传算法主程序 Params:nIter: 迭代次数 nPop: 种群大小 pc: 交叉概率 pm: 变异概率 func: 优化的函数 lb: 自变量下界rb: 自变量上界Return:paretoPops: 帕累托解集 paretoFits: 对应的适应度  """   # 生成初始种群 pops = initPops(nPop, nChr, lb, rb)  fits = fitness(pops, func) # 开始第1次迭代 iter = 1 while iter <= nIter:print(f"当前正在第{iter}代....")ranks = nonDominationSort(pops, fits)  # 非支配排序 distances = crowdingDistanceSort(pops, fits, ranks)  # 拥挤度pops, fits = select1(nPop, pops, fits, ranks, distances) chrpops = crossover(pops, pc, etaC, lb, rb)  # 交叉产生子种群 chrpops = mutate(chrpops, pm, etaM, lb, rb)  # 变异产生子种群 chrfits = fitness(chrpops, func)  # 从原始种群和子种群中筛选 pops, fits = optSelect(pops, fits, chrpops, chrfits)  iter += 1 # 对最后一代进行非支配排序 ranks = nonDominationSort(pops, fits)  # 非支配排序 distances = crowdingDistanceSort(pops, fits, ranks)  # 拥挤度 paretoPops = pops[ranks==0] paretoFits = fits[ranks==0] return paretoPops, paretoFits

3. MOPSO-多目标粒子群算法

从archive集中更新gBest不仅采用支配解,还利用网格法,统计支配解的密度,选取网格中密度较低的解来更新gBest。

算法主程序

def MOPSO(nIter, nPop, nAr, nChr, func, c1, c2, lb, rb, Vmax, Vmin, M):"""多目标粒子群算法Params:nIter: 迭代次数 nPOp: 粒子群规模 nAr: archive集合的最大规模 nChr: 粒子大小 func: 优化的函数c1、c2: 速度更新参数 lb: 解下界rb:解上界 Vmax: 速度最大值 Vmin:速度最小值 M: 划分的栅格的个数为M*M个Return:paretoPops: 帕累托解集paretoPops:对应的适应度 """# 种群初始化 pops, VPops = initPops(nPop, nChr, lb, rb, Vmax, Vmin) # 获取个体极值和种群极值 fits = fitness(pops, func) pBest = pops pFits = fits gBest = pops# 初始化archive集, 选取pops的帕累托面即可archive, arFits = getNonDominationPops(pops, fits) wStart = 0.9 wEnd = 0.4  # 开始主循环 iter = 1 while iter <= nIter:print("【进度】【{0:20s}】【正在进行{1}代...】【共{2}代】".\format('▋'*int(iter/nIter*20), iter, nIter), end='\r') # 速度更新 w = wStart - (wStart-wEnd) * (iter/nIter)**2 VPops = w*VPops + c1*np.random.rand()*(pBest-pops) + \c2*np.random.rand()*(gBest-pops) VPops[VPops>Vmax] = Vmax VPops[VPops<Vmin] = Vmin # 坐标更新 pops += VPops pops[pops<lb] = lb pops[pops>rb] = rb  # 防止过界 fits = fitness(pops, func) # 更新个体极值 pBest, pFits = updatePBest(pBest, pFits, pops, fits) # 更新archive集 archive, arFits = updateArchive(pops, fits, archive, arFits) # 检查是否超出规模,如果是,那么剔除掉一些个体 archive, arFits = checkArchive(archive, arFits, nAr, M)  # 重新获取全局最优解gBest = getGBest(pops, fits, archive, arFits, M)  iter += 1 print('\n')paretoPops, paretoFits = getNonDominationPops(archive, arFits) return paretoPops, paretoFits

4. 测试算例

FON标准问题:
f1(x1,x2,x3)=1−e−∑i=13(xi−13),f2(x1,x2,x3)=1−e−∑i=13(xi+13)f_1(x_1,x_2,x_3)=1-e^{-\sum_{i=1}^3(x_i-\frac{1}{\sqrt{3}})}, f_2(x_1,x_2,x_3)=1-e^{-\sum_{i=1}^{3}(x_i+\frac{1}{\sqrt{3}})}f1​(x1​,x2​,x3​)=1−e−∑i=13​(xi​−3​1​),f2​(x1​,x2​,x3​)=1−e−∑i=13​(xi​+3​1​)
其中:xi∈[−2,2],i=1,2,3x_i\in[-2,2],i=1,2,3xi​∈[−2,2],i=1,2,3

该问题具有极为简单易于表达的理论最优解集
x1=x2=x3∈[−13,13]x_1=x_2=x_3\in[-\frac{1}{\sqrt3},\frac{1}{\sqrt3}]x1​=x2​=x3​∈[−3​1​,3​1​]

4. 测试结果

4.1. 多目标差分进化算法求解结果

(迭代次数100,种群规模50)

4.2. NSGA2算法求解结果

(迭代次数50,种群规模100)

4.3 MOPSO算法求解结果

(迭代次数100,种群规模100)

4.4 结果对比

  • 求解速度:MOPSO > MODA > NSGA2
  • 求解质量:MOPSO > NSGA2 > MODA

5. 参考文献

参考文献:多目标差分进化在热连轧负荷分配中的应用
参考博客:多目标优化算法(一)NSGA-Ⅱ(NSGA2)
参考文献:MOPSO算法及其在水库优化调度中的应用
详细代码地址:部分多目标启发式算法python实现(github)

多目标启发式算法(NSGA2, MOEA, MOPSO)python实现相关推荐

  1. (python源码,详细注解 )多目标粒子群算法 mopso

    1 本代码功能 用多目标粒子群算法(mopso)寻找pareto最优解集 2 算法介绍 2.1 简单步骤: (1)初始化群体粒子群的位置和速度,计算适应值 (2)根据pareto支配原则,计算得到Ar ...

  2. yolov5在线检测目标检测网页实时识别python目标检测flask

    yolov5在线检测目标检测网页实时识别python目标检测flask #!/usr/bin/env python from importlib import import_module import ...

  3. 多目标粒子群算法(MOPSO)的原理和matlab实现

    算法原理部分参考文献基于改进多目标粒子群算法的配电网储能选址定容 0.前言 初学者面对多目标优化问题可能比较困难,写下这篇博客记录一下自己学习的心得,希望能和大家一起交流学习. 采用粒子群求单目标优化 ...

  4. 目标检测—查全率和查准率Python代码实现

    目标检测查全率和查准率Python代码实现 查准率和查全率计算 一堆照片,其中有12张是狗,其余是猫.算法识别出8只狗.在确定的8只狗中,有5只实际上真的是狗(真阳新TP),其余的是猫(假阳性FP), ...

  5. 多目标进化优化(MOEA)方法

    文章目录 多目标优化概念 一. MOEA流程 1.目标函数: 2.多目标进化个体之间关系 3.基于Pareto的多目标最优解集 二. MOEA算法 1.基于分解的MOEA(MOEA/D) 1.1 三类 ...

  6. 目标检测实战:4种YOLO目标检测的C++和Python两种版本实现

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨nihate 审稿丨邓富城 编辑丨极市平台 导读 本文作者使用C++编写一套基于OpenCV的Y ...

  7. 【深度学习】目标检测实战:4种YOLO目标检测的C++和Python两种版本实现

    作者丨nihate 审稿丨邓富城 编辑丨极市平台 导读 本文作者使用C++编写一套基于OpenCV的YOLO目标检测,包含了经典的YOLOv3,YOLOv4,Yolo-Fastest和YOLObile ...

  8. 【多目标进化优化】 MOEA 测试函数

    声明 本文内容来源于 <多目标进化优化> 郑金华 邹娟著,非常感谢两位老师的知识分享,如有侵权,本人立即删除,同时在此表示,本文内容仅学习使用,禁止侵权,谢谢! 注:本文中提到的参数与(决 ...

  9. python追踪屏幕的移动目标_利用树莓派和Python建立一个简单、便宜的移动目标探测器...

    今天我们将讨论如何建立一个简单.便宜的移动目标探测器. 这项研究的目的是确定在一个便宜的移动设备上的对象检测模型是否可以用于现实世界的任务. 作为一个移动平台,我们使用的是树莓派3B.树莓派是一款售价 ...

  10. 目标跟踪——OTB平台的Python版tracker使用

    注意:由于OTB不像VOT那样有Python代码接口,所以我是用Pysot测试平台实现OTB评测功能. 方法:先安装Pysot在系统上,Windows和Linux(Ubuntu发行版)都可以,我是用W ...

最新文章

  1. 关联规则推荐及Apriori算法
  2. 编译程序加不加 -lpthread 的区别【转】
  3. Python2.7+selenium2自动化测试环境搭建
  4. 7.Mahout菩萨
  5. 如何在SAP的的凭证流浏览器(DRB)中显示客户自定义的凭证
  6. 体验MySQL MMM
  7. P3914-染色计数【树形dp】
  8. JDK8 lambda的会话指南–术语表
  9. 神经网络不收敛的 11 个原因及其解决办法
  10. 支付宝支付-当面付之扫码支付「扫码支付」
  11. 关于遍历字典的二三事
  12. (第二章)mysql创建数据库
  13. js常用的加密/解密方法
  14. AD模块电压采集电路
  15. gcode2pointClound
  16. 自己喜欢的句子总结一
  17. Exception in thread “main“ redis.clients.jedis.exceptions.JedisConnectionException: Failed to create
  18. instagram获取图片地址和视频地址
  19. 石子合并问题java_动态规划求石子合并问题
  20. python批量数据处理脚本——批量删除文件

热门文章

  1. 数独问题流程图_数独-分析、设计、求解思路
  2. unity3d 人物对话_RPG角色对话编辑器系统RPG Conversation/Dialogue Editor 1.2.0
  3. niceScroll的使用方法
  4. CE教程第九关——处理共用代码
  5. 唐宇迪学习笔记12:sklearn构造决策树
  6. webots离线网页无法跳转
  7. Go语言实战的知识图谱
  8. 韩顺平 java 坦克大战_韩顺平坦克大战源代码 韩顺平老师视频里的坦克大战 - 下载 - 搜珍网...
  9. 联想i5无线网无法连接服务器,联想笔记本无线网络连接不上是什么原因
  10. 数域、有限域(伽罗瓦域)