找回密码
 立即注册
查看: 579|回复: 0

NEORL:一个基于进化算法和机器学习进行最优化计算的 ...

[复制链接]
发表于 2021-12-20 13:28 | 显示全部楼层 |阅读模式
本文使用 Zhihu On VSCode 创作并发布


  • 关键词:进化算法/演化算法;神经网络;强化学习;超参数调整;python;最优化
1 什么是NEORL

NEORL(NeuroEvolution Optimisation with Reinforcement Learning) 包含一系列进化算法、神经网络及其混合算法,用于开展最优化计算。NEORL旨在解决运筹、工程、商业和其他相关学科的大规模优化问题。NEORL可用作独立平台或额外的基准测试工具,以补充或验证其他优化包。我们构建NEORL时的目标是为用户提供一个简单易用的框架,该框架可以访问广泛的独立和混合算法,包括进化、群、监督学习、深度学习和强化学习。我们希望初学者在不涉及太多的理论/实现细节的情况下使用高级的优化和算法。
2 NEORL将会包含什么内容

下表总结了NEORL包含的内容,包括强化学习,进化算法,混合神经进化,并行计算,组合/离散优化,连续问题优化,混合离散/连续优化,详细的说明文档,日志功能,优化算法测试基准。


Image


3 一个例子

我们同一个5-D的球形函数优化来展示如何方便的使用NEORL来实现最优化计算。

  • 问题背景
球形函数的数学表达式为:


该函数是连续且凸的。在d=2时,该函数的图形为


Image


球形函数的全局最小值在零点:



  • 代码实现(使用差分演化-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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 08:50 , Processed in 0.141513 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表