多目标启发式算法(NSGA2, MOEA, MOPSO)python实现_mopso python-程序员宅基地

技术标签: 启发式算法  python  

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标准问题:
f 1 ( x 1 , x 2 , x 3 ) = 1 − e − ∑ i = 1 3 ( x i − 1 3 ) , f 2 ( x 1 , x 2 , x 3 ) = 1 − e − ∑ i = 1 3 ( x i + 1 3 ) 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)=1ei=13(xi3 1),f2(x1,x2,x3)=1ei=13(xi+3 1)
其中: x i ∈ [ − 2 , 2 ] , i = 1 , 2 , 3 x_i\in[-2,2],i=1,2,3 xi[2,2],i=1,2,3

该问题具有极为简单易于表达的理论最优解集
x 1 = x 2 = x 3 ∈ [ − 1 3 , 1 3 ] 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)
img

4.2. NSGA2算法求解结果

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

4.3 MOPSO算法求解结果

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

4.4 结果对比

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

5. 参考文献

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42710615/article/details/109512538

智能推荐

HTML5 Web SQL 数据库_方式准则的定义-程序员宅基地

文章浏览阅读1k次。1、HTML5 Web SQL 数据库 Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs。如果你是一个 Web 后端程序员,应该很容易理解 SQL 的操作。Web SQL 数据库可以在最新版的 Safari, Chrome 和 Opera 浏览器中工作。2、核心方法 以下是规范中定义的三个_方式准则的定义

spring Boot 中使用线程池异步执行多个定时任务_springboot启动后自动开启多个线程程序-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏6次。spring Boot 中使用线程池异步执行多个定时任务在启动类中添加注解@EnableScheduling配置自定义线程池在启动类中添加注解@EnableScheduling第一步添加注解,这样才会使定时任务启动配置自定义线程池@Configurationpublic class ScheduleConfiguration implements SchedulingConfigurer..._springboot启动后自动开启多个线程程序

Maven编译打包项目 mvn clean install报错ERROR_mvn clean install有errors-程序员宅基地

文章浏览阅读1.1k次。在项目的target文件夹下把之前"mvn clean package"生成的压缩包(我的是jar包)删掉重新执行"mvn clean package"再执行"mvn clean install"即可_mvn clean install有errors

navacate连接不上mysql_navicat连接mysql失败怎么办-程序员宅基地

文章浏览阅读974次。Navicat连接mysql数据库时,不断报1405错误,下面是针对这个的解决办法:MySQL服务器正在运行,停止它。如果是作为Windows服务运行的服务器,进入计算机管理--->服务和应用程序------>服务。如果服务器不是作为服务而运行的,可能需要使用任务管理器来强制停止它。创建1个文本文件(此处命名为mysql-init.txt),并将下述命令置于单一行中:SET PASSW..._nvarchar链接不上数据库

Python的requests参数及方法_python requests 参数-程序员宅基地

文章浏览阅读2.2k次。Python的requests模块是一个常用的HTTP库,用于发送HTTP请求和处理响应。_python requests 参数

近5年典型的的APT攻击事件_2010谷歌网络被极光黑客攻击-程序员宅基地

文章浏览阅读2.7w次,点赞7次,收藏50次。APT攻击APT攻击是近几年来出现的一种高级攻击,具有难检测、持续时间长和攻击目标明确等特征。本文中,整理了近年来比较典型的几个APT攻击,并其攻击过程做了分析(为了加深自己对APT攻击的理解和学习)Google极光攻击2010年的Google Aurora(极光)攻击是一个十分著名的APT攻击。Google的一名雇员点击即时消息中的一条恶意链接,引发了一系列事件导致这个搜_2010谷歌网络被极光黑客攻击

随便推点

微信小程序api视频课程-定时器-setTimeout的使用_微信小程序 settimeout 向上层传值-程序员宅基地

文章浏览阅读1.1k次。JS代码 /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { setTimeout( function(){ wx.showToast({ title: '黄菊华老师', }) },2000 ) },说明该代码只执行一次..._微信小程序 settimeout 向上层传值

uploadify2.1.4如何能使按钮显示中文-程序员宅基地

文章浏览阅读48次。uploadify2.1.4如何能使按钮显示中文博客分类:uploadify网上关于这段话的搜索恐怕是太多了。方法多也试过了不知怎么,反正不行。最终自己想办法给解决了。当然首先还是要有fla源码。直接去管网就可以下载。[url]http://www.uploadify.com/wp-content/uploads/uploadify-v2.1.4...

戴尔服务器安装VMware ESXI6.7.0教程(U盘安装)_vmware-vcsa-all-6.7.0-8169922.iso-程序员宅基地

文章浏览阅读9.6k次,点赞5次,收藏36次。戴尔服务器安装VMware ESXI6.7.0教程(U盘安装)一、前期准备1、下载镜像下载esxi6.7镜像:VMware-VMvisor-Installer-6.7.0-8169922.x86_64.iso这里推荐到戴尔官网下载,Baidu搜索“戴尔驱动下载”,选择进入官网,根据提示输入服务器型号搜索适用于该型号服务器的所有驱动下一步选择具体类型的驱动选择一项下载即可待下载完成后打开软碟通(UItraISO),在“文件”选项中打开刚才下载好的镜像文件然后选择启动_vmware-vcsa-all-6.7.0-8169922.iso

百度语音技术永久免费的语音自动转字幕介绍 -程序员宅基地

文章浏览阅读2k次。百度语音技术永久免费的语音自动转字幕介绍基于百度语音技术,识别率97%无时长限制,无文件大小限制永久免费,简单,易用,速度快支持中文,英文,粤语永久免费的语音转字幕网站: http://thinktothings.com视频介绍 https://www.bilibili.com/video/av42750807 ...

Dyninst学习笔记-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏9次。Instrumentation是一种直接修改程序二进制文件的方法。其可以用于程序的调试,优化,安全等等。对这个词一般的翻译是“插桩”,但这更多使用于软件测试领域。【找一些相关的例子】Dyninst可以动态或静态的修改程序的二进制代码。动态修改是在目标进程运行时插入代码(dynamic binary instrumentation)。静态修改则是直接向二进制文件插入代码(static b_dyninst

在服务器上部署asp网站,部署asp网站到云服务器-程序员宅基地

文章浏览阅读2.9k次。部署asp网站到云服务器 内容精选换一换通常情况下,需要结合客户的实际业务环境和具体需求进行业务改造评估,建议您进行服务咨询。这里仅描述一些通用的策略供您参考,主要分如下几方面进行考虑:业务迁移不管您的业务是否已经上线华为云,业务迁移的策略是一致的。建议您将时延敏感型,有快速批量就近部署需求的业务迁移至IEC;保留数据量大,且需要长期稳定运行的业务在中心云上。迁移方法请参见如何计算隔离独享计算资源..._nas asp网站