NEORL:一个基于进化算法和机器学习进行最优化计算的 ...
本文使用 Zhihu On VSCode 创作并发布[*]关键词:进化算法/演化算法;神经网络;强化学习;超参数调整;python;最优化
1 什么是NEORL
NEORL(NeuroEvolution Optimisation with Reinforcement Learning) 包含一系列进化算法、神经网络及其混合算法,用于开展最优化计算。NEORL旨在解决运筹、工程、商业和其他相关学科的大规模优化问题。NEORL可用作独立平台或额外的基准测试工具,以补充或验证其他优化包。我们构建NEORL时的目标是为用户提供一个简单易用的框架,该框架可以访问广泛的独立和混合算法,包括进化、群、监督学习、深度学习和强化学习。我们希望初学者在不涉及太多的理论/实现细节的情况下使用高级的优化和算法。
2 NEORL将会包含什么内容
下表总结了NEORL包含的内容,包括强化学习,进化算法,混合神经进化,并行计算,组合/离散优化,连续问题优化,混合离散/连续优化,详细的说明文档,日志功能,优化算法测试基准。
Image
3 一个例子
我们同一个5-D的球形函数优化来展示如何方便的使用NEORL来实现最优化计算。
[*]问题背景
球形函数的数学表达式为:
https://www.zhihu.com/equation?tex=f%28%5Cvec%7Bx%7D%29+%3D+%5Csum_%7Bi%3D1%7D%5Ed+x_i%5E2
该函数是连续且凸的。在d=2时,该函数的图形为
Image
球形函数的全局最小值在零点:
https://www.zhihu.com/equation?tex=f%28%5Cvec%7Bx%7D%5E%2A%29%3D0%2C+%5Ctext%7B+at+%7D+%5Cvec%7Bx%7D%5E%2A%3D%5B0%2C0%2C...%2C0%5D
[*]代码实现(使用差分演化-DE以及XNES两种优化算法快速实现)
#---------------------------------
# Import packages
#---------------------------------
import numpy as np
import matplotlib.pyplot as plt
from neorl import DE, XNES
#---------------------------------
# Fitness
#---------------------------------
#Define the fitness function
def FIT(individual):
"""Sphere test objective function.
F(x) = sum_{i=1}^d xi^2
d=1,2,3,...
Range: [-100,100]
Minima: 0
"""
return sum(x**2 for x in individual)
#---------------------------------
# Parameter Space
#---------------------------------
#Setup the parameter space (d=5)
nx=5
BOUNDS={}
for i in range(1,nx+1):
BOUNDS['x'+str(i)]=['float', -100, 100]
#---------------------------------
# DE
#---------------------------------
de=DE(mode='min', bounds=BOUNDS, fit=FIT, npop=50, CR=0.5, F=0.7, ncores=1, seed=1)
x_best, y_best, de_hist=de.evolute(ngen=120, verbose=0)
print('---DE Results---', )
print('x:', x_best)
print('y:', y_best)
#---------------------------------
# NES
#---------------------------------
x0=[-50]*len(BOUNDS)
amat = np.eye(nx)
xnes=XNES(mode='min', bounds=BOUNDS, fit=FIT, npop=50, eta_mu=0.9,
eta_sigma=0.5, adapt_sampling=True, seed=1)
x_best, y_best, nes_hist=xnes.evolute(120, x0=x0, verbose=0)
print('---XNES Results---', )
print('x:', x_best)
print('y:', y_best)
#---------------------------------
# Plot
#---------------------------------
#Plot fitness for both methods
plt.figure()
plt.plot(np.array(de_hist), label='DE')
plt.plot(np.array(nes_hist['fitness']), label='NES')
plt.xlabel('Generation')
plt.ylabel('Fitness')
plt.legend()
plt.show()
可以看到,只需要编辑待优化的函数并定义其取值范围,接着调用已经集成好的DE和XNES两个算法类,即可轻易对目标函数开展最优化计算。
4 欢迎关注
目前改项目已经集成多种进化算法,强化学习,超参调整等内容并且我们仍在持续更新,欢迎有兴趣的朋友关注。
项目github:https://github.com/mradaideh/neorl
项目文档:https://neorl.readthedocs.io/en/latest/guide/quickstart.html
页:
[1]