引言
前面几期已分享多期cec测试函数的使用,已初步积累了相关cec测试函数实操技能。那么,这期我们利用推出python版215种优化算法求解11种cec测试函数(有cec2005,cec2008,cec2010,cec2013,cec2014,cec2015,cec2017,cec2019,cec2020,cec2021,cec2022)。助你实现选择自由。
这里,首先不得不提优秀的开源库mealpy,提供了超170种经典和最新发表的优化算法(您想要的它都有!群智能优化算法Python库!!!)。其次,利用另一个开源库opfunu(地址:https://github.com/thieu1995/opfunu) 实现11种cec测试函数的调用。各cec函数具体的信息,需小伙伴们多多阅读文献。这里就不多赘述了,话不多说,直接代码怼脸。Talk is cheap,show you code!
(本期所有代码+数据在文末下载)
02. opfunu的介绍
opfunu是用于前沿数值优化基准函数的最大的python库。包含2005年、2008年、2010年、2013年、2014年、2015年、2017年、2019年、2020年、2021年、2022年的所有CEC竞赛函数。共11种测试函数,实现了500多个不同维度的功能。使用pip安装:
pip install opfunu==1.0.1
03.实操
首先,需要安装两个强大的工具包mealpy、opfunu。当然,也可以直接下载这两个包(已给小伙伴备好了,文末可直接享用)
pip install mealpy==3.0.1
pip install opfunu==1.0.1
其次,加载cec测试函数信息。对于优化而言,时刻把握四项基本量:变量上限ub,变量下限lb,变量维度dim,目标函数fit_fun。利用opfunu调用目标函数,基本格式为:函数+年份。当然,你还需要知道每年的cec函数有几个测试函数,维度有几维。这里已经整理好了,方便使用。
'''
适应度函数及维度dim的选择
cec函数名字格式:函数名+年份,比如要选择2022的F2函数,func_num = 'F2'+'2022'
cec2005:F1-F25, 可选 dim = 10, 30, 50
cec2008:F1-F7, 可选 2 <= dim <= 1000
cec2010:F1-F20, 可选 100 <= dim <= 1000
cec2013:F1-F28, 可选 dim = 2, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
cec2014:F1-F30, 可选 dim = 10, 20, 30, 50, 100
cec2015:F1-F15, 可选 dim = 10, 30
cec2017:F1-F29, 可选 dim = 2, 10, 20, 30, 50, 100
cec2019:F1-F10, 可选 dim: F1=9,F2=16,F3=18,其他=10
cec2020:F1-F10, 可选 dim = 2, 5, 10, 15, 20, 30, 50, 100
cec2021:F1-F10, 可选 dim = 2, 10, 20
cec2022:F1-F12, 可选 dim = 2, 10, 20
比如,我们以cec2021的F2测试函数为例,调用的格式为F22021,变量维数dim选择20。我们用cec_fun定义了cec函数,返回F即为对应维度的cec函数,用以后续迭代优化。随后,根据opfunu的调用格式,构建优化问题problem_dict包括了函数基本信息lb,ub,目标函数fit_fun,minmax 可以选解决最大化 或 最小化问题,cec函数一般都是最小化问题,因此选择min。
据此,你可以随心意任意选择11种cec函数,按需选择维度dim。只需改动fun_name 、year 、dim,代码改动量极少,是不是非常方便,简单。
到此,已经把四项基本量:变量上限ub,变量下限lb,变量维度dim,目标函数fit_fun都已经准备好了,接下来就是调用算法求解了。
fun_name = 'F2' #按需修改
year = '2021' #按需修改
func_num = fun_name + year
dim = 20 # 维度,根据cec函数 选择对应维度
'''定义的 cec函数 '''
def cec_fun(x):
funcs = opfunu.get_functions_by_classname(func_num)
func = funcs[0](ndim = dim)
F = func.evaluate(x)
return F
''' fit_func->目标函数, lb->下限, ub->上限 '''
problem_dict = {
"fit_func": cec_fun,
"lb": opfunu.get_functions_by_classname(func_num)[0](ndim = dim).lb.tolist(),
"ub": opfunu.get_functions_by_classname(func_num)[0](ndim = dim).ub.tolist(),
"minmax": "min",
}
最后,调用算法测试应用。以鲸鱼优化算法(WOA)和灰狼优化算法(GWO)为例。设置了最大迭代次数epoch=100,种群数量pop_size=50。有两种调用方式,import的方式也不一样。当然,还有其他170多种算法供君使用。第一种方式可以从mealpy.swarm_based ,mealpy.human_based ,mealpy.math_based等等中import更多的算法。
第二种,直接在get_optimizer_by_name中输入算法对应的名字。似乎第二种方式更便利一些。随后,利用model.solve(problem_dict)求解优化问题。
注意:有些算法输入并不只有(epoch,pop_size)两个输入,还需要查阅mealpy中具体的优化算法的定义和输入,依照python的格式灵活使用。
''' 调用优化算法 '''
epoch = 100 #最大迭代次数
pop_size = 50 #种群数量
''' 第一种方式,需:from mealpy.swarm_based import WOA,GWO '''
# woa_model = WOA.OriginalWOA(epoch, pop_size)
# gwo_model = GWO.OriginalGWO(epoch, pop_size)
''' 第二种方式,需:from mealpy import get_optimizer_by_name'''
woa_model = get_optimizer_by_name("OriginalWOA")(epoch, pop_size)
gwo_model = get_optimizer_by_name("OriginalGWO")(epoch, pop_size)
'''求解 cec函数 '''
woa_best_x, woa_best_f = woa_model.solve(problem_dict)
gwo_best_x, gwo_best_f = gwo_model.solve(problem_dict)
绘制收敛曲线:提供了加载收敛曲线的方式,调用model.history.list_global_best_fit包即可。
'''
绘制适应度曲线
model.history.list_global_best_fit:适应度曲线
'''
plt.figure
# plt.semilogy(Curve,'r-',linewidth=2)
plt.plot(woa_model.history.list_global_best_fit,'r-',linewidth=2,label = 'WOA')
plt.plot(gwo_model.history.list_global_best_fit,'b-',linewidth=2,label = 'GWO')
plt.xlabel('Iteration')
plt.ylabel('Fitness')
plt.grid()
plt.title('Convergence curve: '+ 'cec' + year + '-' + fun_name + ', Dim=' + str(dim))
plt.legend()
plt.show()
绘制三维函数图:调用自带的opfunu.plot_3d函数,里面参数仅可修改n_space和show的值。绘图时间与n_space值有关,n_space值越大耗费时间越长。show = False时,选择不可视化。
''' 绘制三维函数图 '''
# 仅修改n_space 和 show -> 可视化选择参数
opfunu.plot_3d(opfunu.get_functions_by_classname(func_num)[0](ndim = 2), n_space=500, show = True)
plt.title('cec' + year + '-' + fun_name)
总结:
1.通过选择fun_name 、year 、dim ,调用11种cec测试函数,500多种优化问题。
2. 通过model = get_optimizer_by_name("算法名字")(epoch, pop_size,其他参数)输入对应的算法名字和参数,获取170多种优化算法解决优化问题。
到此,已经结束了。整体的代码如下:
# -*- coding: utf-8 -*-
"""
CEC 测试函数 系列
@author: 优化算法侠,Swarm-Opti
"""
from IPython import get_ipython
get_ipython().magic('reset -sf') #清除所有变量
import numpy as np
from matplotlib import pyplot as plt
# In[]:
import opfunu # 参考文档:https://github.com/thieu1995/opfunu
import mealpy
from mealpy.swarm_based import WOA,GWO
from mealpy import get_optimizer_by_name
'''
适应度函数及维度dim的选择
cec函数名字格式:函数名+年份,比如要选择2022的F1函数,func_num = 'F1'+'2022'
cec2005:F1-F25, 可选 dim = 10, 30, 50
cec2008:F1-F7, 可选 2 <= dim <= 1000
cec2010:F1-F20, 可选 100 <= dim <= 1000
cec2013:F1-F28, 可选 dim = 2, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
cec2014:F1-F30, 可选 dim = 10, 20, 30, 50, 100
cec2015:F1-F15, 可选 dim = 10, 30
cec2017:F1-F29, 可选 dim = 2, 10, 20, 30, 50, 100
cec2019:F1-F10, 可选 dim: F1=9,F2=16,F3=18,其他=10
cec2020:F1-F10, 可选 dim = 2, 5, 10, 15, 20, 30, 50, 100
cec2021:F1-F10, 可选 dim = 2, 10, 20
cec2022:F1-F12, 可选 dim = 2, 10, 20
'''
fun_name = 'F2' #按需修改
year = '2021' #按需修改
func_num = fun_name + year
dim = 20 # 维度,根据cec函数 选择对应维度
'''定义的 cec函数 '''
def cec_fun(x):
funcs = opfunu.get_functions_by_classname(func_num)
func = funcs[0](ndim = dim)
F = func.evaluate(x)
return F
''' fit_func->目标函数, lb->下限, ub->上限 '''
problem_dict = {
"fit_func": cec_fun,
"lb": opfunu.get_functions_by_classname(func_num)[0](ndim = dim).lb.tolist(),
"ub": opfunu.get_functions_by_classname(func_num)[0](ndim = dim).ub.tolist(),
"minmax": "min",
}
''' 调用优化算法 '''
epoch = 100 #最大迭代次数
pop_size = 50 #种群数量
''' 第一种方式,需:from mealpy.swarm_based import WOA,GWO '''
# woa_model = WOA.OriginalWOA(epoch, pop_size)
# gwo_model = GWO.OriginalGWO(epoch, pop_size)
''' 第二种方式,需:from mealpy import get_optimizer_by_name'''
woa_model = get_optimizer_by_name("OriginalWOA")(epoch, pop_size)
gwo_model = get_optimizer_by_name("OriginalGWO")(epoch, pop_size)
'''求解 cec函数 '''
woa_best_x, woa_best_f = woa_model.solve(problem_dict)
gwo_best_x, gwo_best_f = gwo_model.solve(problem_dict)
# In[]:
'''
绘制适应度曲线
model.history.list_global_best_fit:适应度曲线
'''
plt.figure
# plt.semilogy(Curve,'r-',linewidth=2)
plt.plot(woa_model.history.list_global_best_fit,'r-',linewidth=2,label = 'WOA')
plt.plot(gwo_model.history.list_global_best_fit,'b-',linewidth=2,label = 'GWO')
plt.xlabel('Iteration')
plt.ylabel('Fitness')
plt.grid()
plt.title('Convergence curve: '+ 'cec' + year + '-' + fun_name + ', Dim=' + str(dim))
plt.legend()
plt.show()
# In[]:
''' 绘制三维函数图 '''
# 仅修改n_space 和 show -> 可视化选择参数
opfunu.plot_3d(opfunu.get_functions_by_classname(func_num)[0](ndim = 2), n_space=500, show = True)
plt.title('cec' + year + '-' + fun_name)
本推文仅抛砖引玉,相信各位小伙伴可以探索opfunu和mealpy更多高级的用法,使用170多种优化算法一键跑完11种cec测试函数。祝各位成功!!!🌹
Python代码下载
微信搜索并关注-优化算法侠,或扫描下方二维码关注,以算法名字搜索历史文章即可下载。
【选择自由,免费下载】215种优化算法求解11种cec测试函数-python代码
点击链接跳转:
cec2022测试函使用教程及matlab代码免费下载
绘制cec2017/018/2019/2020/2021/2022函数的三维图像教程,SO EASY!
175种群智能优化算法python库
求解cec测试函数-matlab
解决12工程设计优化问题-matlab
求解11种cec测试函数-python
解决12种工程设计优化问题-python
用于改进所有优化算法:21种混沌映射方法-混沌初始化(附matlab代码)
沙场大点兵:24种信号分解方法(附matlab代码)
沙场大点兵:27种一维数据转换成二维图像的方法-matlab代码沙场大点兵:27种一维数据转换成二维图像的方法-matlab代码https://mp.weixin.qq.com/s?__biz=MzkxMDQ5MDk4Ng==&mid=2247486260&idx=1&sn=81b1970cb89364c0289ccdfb403e5388&chksm=c12be731f65c6e273a85456326b503b7f35d9f035405050932ff1926e0b1bfa8076b1bc2d1f2&token=25423484&lang=zh_CN#rd