Python遗传算法框架使用实例(二)多目标优化问题Geatpy for Python与Matlab的对比学习 您所在的位置:网站首页 python多目标优化算法库 Python遗传算法框架使用实例(二)多目标优化问题Geatpy for Python与Matlab的对比学习

Python遗传算法框架使用实例(二)多目标优化问题Geatpy for Python与Matlab的对比学习

2024-02-04 13:44| 来源: 网络整理| 查看: 265

在前面几篇文章中,我们已经介绍了高性能Python遗传和进化算法框架——Geatpy的使用及一些案例。

https://blog.csdn.net/qq_33353186/article/details/82014986

Python遗传和进化算法框架(二)Geatpy库函数和数据结构_jazzbin的博客-CSDN博客_geatpy库

Python遗传算法框架使用实例(一)使用Geatpy实现句子匹配_jazzbin的博客-CSDN博客_geatpy 遗传算法

详细的Geatpy官方教程文档在官网可以查看:

Geatpy教程 – Geatpy

本篇就一个多目标优化实例进行展开讲述,并且与使用Matlab工具箱进行对比:

回顾一下更新方法:

pip install --upgrade --user geatpy

下面对一个两个目标的最小化问题进行求解:

先用Geatpy尝试求解,先定义问题类MyProblem,然后编写执行代码直接套用内置的moea_nsga2_templet进化算法模板对问题进行求解:

# -*- coding: utf-8 -*- import numpy as np import geatpy as ea """ 问题类定义 """ class MyProblem(ea.Problem): # 继承Problem父类 def __init__(self): name = 'MyProblem' # 初始化name(函数名称,可以随意设置) M = 2 # 初始化M(目标维数) maxormins = [1] * M # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标) Dim = 2 # 初始化Dim(决策变量维数) varTypes = [0] * Dim # 初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的) lb = [-5] * Dim # 决策变量下界 ub = [5] * Dim # 决策变量上界 lbin = [1] * Dim # 决策变量下边界 ubin = [1] * Dim # 决策变量上边界 # 调用父类构造方法完成实例化 ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin) def aimFunc(self, pop): # 目标函数 x1 = pop.Phen[:, [0]] x2 = pop.Phen[:, [1]] pop.ObjV = np.zeros((pop.Phen.shape[0], self.M)) pop.ObjV[:,[0]] = x1**4-10*x1**2+x1*x2+x2**4-x1**2*x2**2 pop.ObjV[:,[1]] = x2**4-x1**2*x2**2+x1**4+x1*x2 """ 执行脚本 """ if __name__ == '__main__': problem = MyProblem() # 生成问题对象 # 构建算法 algorithm = ea.moea_NSGA2_templet(problem, ea.Population(Encoding='RI', NIND=1000), MAXGEN=100, # 最大进化代数。 logTras=0) # 表示每隔多少代记录一次日志信息,0表示不记录。 # 求解 res = ea.optimize(algorithm, verbose=False, drawing=1, outputMsg=True, drawLog=False, saveFlag=False, dirName='result')

执行结果如下:

 

其中moea_nsga2_templet的算法模板源代码可以参见:

https://github.com/geatpy-dev/geatpy/blob/master/geatpy/templates/moeas/nsga2/moea_NSGA2_templet.py

代码有详细注释,可以清晰看到多目标优化NSGAII算法的详细流程。

下面将用Matlab的遗传算法工具箱进行对比实验:

clc,clear % 定义目标函数 fun1 = @(x) x(1)^4-10*x(1)^2+x(1)*x(2)+x(2)^4-x(1)^2*x(2)^2; %min f1(x1,x2) fun2 = @(x) x(2)^4-x(1)^2*x(2)^2+x(1)^4+x(1)*x(2); %min f2(x1,x2) aimfuc = @(x) [fun1(x) fun2(x)]; %获取目标函数句柄 nvars=2; %变量个数 lb=[-5,-5]; %下限 ub=[5,5]; %上限 A=[];b=[]; %线性不等式约束 Aeq=[];beq=[];%线性等式约束 tic %开始计时 options=gaoptimset('paretoFraction',1,'populationsize',1000,'generations',100,'stallGenLimit',1,'TolFun',1e-100); [x,fval] = gamultiobj(aimfuc,nvars,A,b,Aeq,beq,lb,ub,options); time = toc %结束计时 plot(fval(:,1),fval(:,2),'k.') %绘图 fprintf('找到的前沿点数: %d\n', size(fval,1)); fprintf('平均每秒找到的前沿点数: %f\n', size(fval,1)/time);

执行结果如下:

对比发现Geatpy的效率比Matlab高出了一个数量级。尝试增大所需要搜索的帕累托前沿点的数量,Matlab变慢了一个数量级,而Geatpy的耗时基本稳定。如果把上面的1000个个体改为1万,则Python耗时7.33秒,Matlab耗时55.25秒:

除了NSGA-II算法外,Geatpy还支持适应性权法重法(awGA)、随机权重法(rwGA)、NSGA-III、RVEA等。除了多目标优化,Geatpy还支持单目标优化、差分进化、组合优化、复杂约束优化、混合编码优化等。相应的算法均整合在算法模板内,源代码参见:

https://github.com/geatpy-dev/geatpy/tree/master/geatpy/templates

欢迎继续跟进,感谢!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有