Skip to main content

pypop7(基于 POPulation 的优化的纯 PYthon 库)

项目描述

pypop7(基于 POPulation 的黑盒优化的纯 PYthon 库)

GNU 通用公共许可证 v3.0 用于 pypop 的 gitter pypop7 的 PyPI 文件状态 下载 Python

PyPop7是一个基于 POPulation的优化的Pure-PYthon库,用于单目标、实参数、黑盒问题(目前正在积极开发)。它的主要目标是为黑盒优化(BBO)特别是基于人口的优化器提供统一的接口和优雅的实现,以促进研究的可重复性和实际应用。

绘画

更具体地说,为了减轻臭名昭著的 BBO维数诅咒(几乎基于迭代采样),主要关注的PyPop7是涵盖其用于大规模优化 (LSO) 的最先进的 (SOTA) 实现,尽管许多他们的其他版本和变体也包括在这里(用于基准测试/混合目的,有时甚至用于实际目的)。

如何使用 PyPop7

以下三个简单的步骤足以利用PyPop7的优化能力:

  1. 使用pip通过venvcondapypop7在基于 Python3 的虚拟环境中安装:
$ pip install pypop7

为简单起见,所有必需的依赖项都会根据setup.cfg自动安装。

  1. 为手头的优化问题定义自己的目标函数,

  2. pypop7从给定的优化问题上运行一个或多个黑盒优化器:

import numpy as np  # for numerical computation, which is also the computing engine of pypop7

# 2. Define your own objective function for the optimization problem at hand:
#   the below example is Rosenbrock, the notorious test function in the optimization community
def rosenbrock(x):
    return 100 * np.sum(np.power(x[1:] - np.power(x[:-1], 2), 2)) + np.sum(np.power(x[:-1] - 1, 2))

# define the fitness (cost) function and also its settings
ndim_problem = 1000
problem = {'fitness_function': rosenbrock,  # cost function
           'ndim_problem': ndim_problem,  # dimension
           'lower_boundary': -5 * np.ones((ndim_problem,)),  # search boundary
           'upper_boundary': 5 * np.ones((ndim_problem,))}

# 3. Run one or more black-box optimizers from ```pypop7``` on the given optimization problem:
#   here we choose LM-MA-ES owing to its low complexity and metric-learning ability for LSO
from pypop7.optimizers.es.lmmaes import LMMAES
# define all the necessary algorithm options (which differ among different optimizers)
options = {'fitness_threshold': 1e-10,  # terminate when the best-so-far fitness is lower than this threshold
           'max_runtime': 3600,  # 1 hours (terminate when the actual runtime exceeds it)
           'seed_rng': 0,  # seed of random number generation (which must be explicitly set for repeatability)
           'x': 4 * np.ones((ndim_problem,)),  # initial mean of search (mutation/sampling) distribution
           'sigma': 0.3,  # initial global step-size of search distribution
           'verbose_frequency': 500}
lmmaes = LMMAES(problem, options)  # initialize the optimizer
results = lmmaes.optimize()  # run its (time-consuming) search process
print(results)

下面的DEMO给出了一个玩具二维最小化函数,以直观地展示 和 的非常有趣/强大的进化搜索MAES过程LMCMAES

MA-ES LM-CMA-ES
绘画 绘画
胡克-吉夫斯(1961) 内尔德米德(1965)
绘画 绘画

公开可用的黑盒优化器 (BBO) 列表(仍在增长


大规模优化: 表示 LSO 的特定版本(例如,尺寸 >= 1000)。

竞争者: 表示相对低维问题的竞争(或事实上的)版本(尽管它在某些 LSO 情况下也可以很好地工作)。

基线:表示用于基准测试或理论兴趣的基线版本。


设计理念

  • 尊重美(优雅)

    • 解决问题的角度来看,我们凭经验更愿意为手头的黑盒优化问题选择最佳优化器。但是,对于问题,最好的优化器通常是事先未知的(没有先验知识)。根据经验,我们需要比较一组(通常很小的)所有可用/知名优化器,并根据一些预定义的性能标准从中选择最好的一个。然而,从研究的角度来看,我们喜欢漂亮的优化器,尽管始终牢记“没有免费午餐”定理。通常,一个优化器来自以下特征:新颖性(例如,GA/PSO)、在至少一类问题(例如,BO)上的竞争性能、理论见解(例如,CMA-ES/NES)、清晰/简单(例如, CEM/EDA) 和可重复性

      • “如果这里有一个单一的主导主题……那就是数值计算的实用方法可以同时高效、聪明,而且——重要的是——清晰。” (来自 Press, WH, Teukolsky, SA, Vetterling, WT 和 Flannery, BP, 2007。数值食谱:科学计算的艺术。剑桥大学出版社。)
    • 如果您发现任何符合上述标准的 BBO/DFO,欢迎发起issuepulls。我们将考虑将其包含在pypop库中。请注意,将考虑对上述成熟优化器(“新瓶装旧酒” )的任何肤浅 模仿

  • 尊重多样性

    • 鉴于黑盒优化 (BBO) 在科学和工程中的普遍性,不同的研究团体设计了不同的方法并不断增加。一方面,其中一些方法可能或多或少有相似之处。另一方面,它们也可能表现出显着差异(动机/目标/实施/从业者)。因此,我们希望涵盖来自不同研究社区的多样性,例如人工智能(特别是机器学习(进化计算和零阶优化))、数学优化/编程(特别是全局优化)、运筹学/管理科学、自动控制,开源软件,也许还有其他。
  • 尊重原创

    • “直接从创作者那里听到想法既有趣又具有教育意义”。(来自 Hennessy,JL 和 Patterson,DA,2019 年。计算机体系结构:定量方法(第六版)。Elsevier。)

    • 对于此处考虑的每个优化器,我们希望提供其原始/代表性参考(包括其良好的实现/改进)。如果您发现这里遗漏了一些重要的参考资料,请随时与我们联系(如有必要,我们很乐意添加)。

  • 尊重可重复性

    • 对于随机搜索,正确控制随机性对于重复数值实验非常关键。在这里,我们遵循NumPy的随机抽样建议。在其他世界中,您必须为每个优化器显式设置随机种子。

计算效率

对于 LSO 来说,计算效率是后摩尔时代DFO 不可或缺的性能标准。为了尽可能获得高性能计算,该库中大量使用NumPy和SciPy作为数值计算的基础。有时,还会使用Numba,以进一步加快挂钟时间。

开发指南

PEP 257 - 文档字符串约定

由于这个库是建立在出色的数值计算库 NumPy 之上的,我们进一步使用了 NumPy 的 Docstring Conventions:numpydoc

参考