BBO 实用函数

在这个开源 Python 模块中,我们为 BBO 提供了一些常用的实用函数,如下所示。这些函数的主要目的是简化 BBO 的典型开发实验流程。

绘制二维适应度地形图

pypop7.benchmarks.utils.generate_xyz(func, x, y, num=200)[源代码]

在绘制适应度地形的二维等高线图之前,生成必要的数据。

参数:
  • func (func) – 基准测试函数。

  • x (list) – x 轴范围。

  • y (list) – y 轴范围。

  • num (int) – x 轴和 y 轴范围内的采样点数量(默认为 200)。

返回:

一个 (x, y, z) 元组,其中 x、y 和 z 分别是 x 轴、y 轴的数据点和函数值。

返回类型:

tuple

示例

1>>> from pypop7.benchmarks import base_functions
2>>> from pypop7.benchmarks.utils import generate_xyz
3>>> x_, y_, z_ = generate_xyz(base_functions.sphere, [0.0, 1.0], [0.0, 1.0], num=2)
4>>> print(x_.shape, y_.shape, z_.shape)
pypop7.benchmarks.utils.plot_contour(func, x, y, levels=None, num=200, is_save=False)[源代码]

绘制适应度地形的二维等高线图。

参数:
  • func (func) – 基准测试函数。

  • x (list) – x 轴范围。

  • y (list) – y 轴范围。

  • levels (int or list) – 等高线的数量或等高线列表。

  • num (int) – x 轴和 y 轴范围内的采样点数量(默认为 200)。

  • is_save (bool) – 是否将生成的图像保存在本地文件夹中(默认为 False)。

返回类型:

一个在线图像。

示例

1>>> from pypop7.benchmarks.utils import plot_contour
2>>> from pypop7.benchmarks.rotated_functions import generate_rotation_matrix
3>>> from pypop7.benchmarks.rotated_functions import ellipsoid
4>>> # plot ill-condition and non-separability
5>>> generate_rotation_matrix(ellipsoid, 2, 72)
6>>> contour_levels = [0, 5e5, 8e6, 4e7, 8e7, 1.15e8, 1.42e8, 1.62e8, 1.78e8, 1.85e8, 2e8]
7>>> plot_contour(ellipsoid, [-10.0, 10.0], [-10.0, 10.0], contour_levels)

上述示例中生成的在线图像如下所示

_images/contour_ellipsoid.png

绘制三维适应度地形图

pypop7.benchmarks.utils.plot_surface(func, x, y, num=200, is_save=False)[源代码]

绘制适应度地形的三维曲面图。

参数:
  • func (func) – 基准测试函数。

  • x (list) – x 轴范围。

  • y (list) – y 轴范围。

  • num (int) – x 轴和 y 轴范围内的采样点数量(默认为 200)。

  • is_save (bool) – 是否将生成的图像保存在本地文件夹中(默认为 False)。

返回类型:

一个在线图像。

示例

1>>> from pypop7.benchmarks.utils import plot_surface
2>>> from pypop7.benchmarks.rotated_functions import ellipsoid
3>>> from pypop7.benchmarks.rotated_functions import generate_rotation_matrix
4>>> # plot ill-condition and non-separability
5>>> generate_rotation_matrix(ellipsoid, 2, 72)
6>>> plot_surface(ellipsoid, [-10.0, 10.0], [-10.0, 10.0], 7)

上述示例中生成的在线图像如下所示

_images/surface_ellipsoid.png

通过对象序列化保存优化结果

对于复杂对象的序列化,我们使用 Python 的标准库(pickle)。有关介绍,请参阅 Python wiki

pypop7.benchmarks.utils.save_optimization(results, algo, func, dim, exp, folder='pypop7_benchmarks_lso')[源代码]

通过对象序列化保存优化结果(以 pickle 格式)。

注意

默认情况下,要保存的本地文件名格式如下:Algo-{}_Func-{}_Dim-{}_Exp-{}.pickle,保存在本地文件夹 pypop7_benchmarks_lso 中。

参数:
  • results (dict) – 任何优化器返回的优化结果。

  • algo (str) – 要使用的算法名称。

  • func (str) – 要最小化的适应度函数名称。

  • dim (str or int) – 要最小化的适应度函数的维度。

  • exp (str or int) – 每次独立运行的实验索引。

  • folder (str) – 工作空间下的本地文件夹,可通过 pwd() 命令获取(默认为 pypop7_benchmarks_lso)。

返回类型:

一个存储在工作空间中的本地文件(可通过 pwd() 命令获取)。

示例

 1>>> import numpy  # engine for numerical computing
 2>>> from pypop7.benchmarks.base_functions import rosenbrock  # function to be minimized
 3>>> from pypop7.optimizers.rs.prs import PRS
 4>>> from pypop7.benchmarks.utils import save_optimization
 5>>> ndim = 2  # number of dimensionality
 6>>> problem = {'fitness_function': rosenbrock,  # to define problem arguments
 7...            'ndim_problem': ndim,
 8...            'lower_boundary': -5.0 * numpy.ones((ndim,)),
 9...            'upper_boundary': 5.0 * numpy.ones((ndim,))}
10>>> options = {'max_function_evaluations': 5000,  # to set optimizer options
11...            'seed_rng': 2022}  # global step-size may need to be tuned for optimality
12>>> prs = PRS(problem, options)  # to initialize the black-box optimizer class
13>>> res = prs.optimize()  # to run its optimization/evolution process
14>>> save_optimization(res, PRS.__name__, rosenbrock.__name__, ndim, 1)

请在通过 pwd() 命令获取的工作空间中检查以下本地文件

  • pypop7_benchmarks_lso/Algo-PRS_Func-rosenbrock_Dim-2_Exp-1.pickle

pypop7.benchmarks.utils.read_optimization(folder, algo, func, dim, exp)[源代码]

在对象序列化后读取优化结果(以 pickle 格式)。

注意

默认情况下,要保存的本地文件名格式如下:Algo-{}_Func-{}_Dim-{}_Exp-{}.pickle,保存在本地文件夹中。

参数:
  • folder (str) – 工作空间下的本地文件夹,可通过 pwd() 命令获取。

  • algo (str) – 要使用的算法名称。

  • func (str) – 要最小化的适应度函数名称。

  • dim (str or int) – 要最小化的适应度函数的维度。

  • exp (str or int) – 每次独立运行的实验索引。

返回:

results – 任何优化器返回的优化结果。

返回类型:

dict

示例

 1>>> import numpy  # engine for numerical computing
 2>>> from pypop7.benchmarks.base_functions import rosenbrock  # function to be minimized
 3>>> from pypop7.optimizers.rs.prs import PRS
 4>>> from pypop7.benchmarks.utils import save_optimization, read_optimization
 5>>> ndim = 2  # number of dimensionality
 6>>> problem = {'fitness_function': rosenbrock,  # to define problem arguments
 7...            'ndim_problem': ndim,
 8...            'lower_boundary': -5.0 * numpy.ones((ndim,)),
 9...            'upper_boundary': 5.0 * numpy.ones((ndim,))}
10>>> options = {'max_function_evaluations': 5000,  # to set optimizer options
11...            'seed_rng': 2022}  # global step-size may need to be tuned for optimality
12>>> prs = PRS(problem, options)  # to initialize the black-box optimizer class
13>>> res = prs.optimize()  # to run its optimization/evolution process
14>>> save_optimization(res, PRS.__name__, rosenbrock.__name__, ndim, 1)
15>>> res = read_optimization('pypop7_benchmarks_lso', PRS.__name__, rosenbrock.__name__, ndim, 1)
16>>> print(res)

检查优化结果

pypop7.benchmarks.utils.check_optimization(problem, options, results)[源代码]

根据问题参数和优化器选项检查优化结果。

参数:
  • problem (dict) – 问题参数。

  • options (dict) – 优化器选项。

  • results (dict) – 任何黑盒优化器生成的优化结果。

返回类型:

一份详细的检查报告。

示例

1>>> import numpy  # engine for numerical computing
2>>> from pypop7.benchmarks.utils import check_optimization
3>>> pro = {'lower_boundary': [-5.0, -7.0, -3.0],
4...        'upper_boundary': [5.0, 7.0, 3.0]}
5>>> opt = {'max_function_evaluations': 7777777}
6>>> res = {'n_function_evaluations': 7777777,
7...        'best_so_far_x': numpy.zeros((3,))}
8>>> check_optimization(pro, opt, res)

通过 Matplotlib 绘制收敛曲线

这里我们使用 Matplotlib 为(仅)一个黑盒优化器绘制收敛曲线图。有关介绍,请参阅其官方网站

pypop7.benchmarks.utils.plot_convergence_curve(algo, func, dim, exp=1, results=None, folder='pypop7_benchmarks_lso')[源代码]

绘制一个优化器获得的最终优化结果的收敛曲线。

注意

默认情况下,要保存的本地文件名格式如下:Algo-{}_Func-{}_Dim-{}_Exp-{}.pickle,保存在本地文件夹 pypop7_benchmarks_lso 中。

参数:
  • algo (str) – 要使用的算法名称。

  • func (str) – 要最小化的适应度函数名称。

  • dim (str or int) – 要最小化的适应度函数的维度。

  • exp (str or int) – 要运行的实验索引。

  • results (dict) – 任何优化器返回的优化结果。

  • folder (str) – 工作空间下的本地文件夹(默认为 pypop7_benchmarks_lso)。

示例

 1>>> import numpy  # engine for numerical computing
 2>>> from pypop7.benchmarks.base_functions import rosenbrock  # function to be minimized
 3>>> from pypop7.optimizers.pso.spso import SPSO
 4>>> from pypop7.benchmarks.utils import plot_convergence_curve
 5>>> problem = {'fitness_function': rosenbrock,  # to define problem arguments
 6...            'ndim_problem': 2,
 7...            'lower_boundary': -5.0*numpy.ones((2,)),
 8...            'upper_boundary': 5.0*numpy.ones((2,))}
 9>>> options = {'max_function_evaluations': 5000,  # to set optimizer options
10...            'saving_fitness': 1,
11...            'seed_rng': 2022}
12>>> spso = SPSO(problem, options)  # to initialize the black-box optimizer class
13>>> res = spso.optimize()  # to run the optimization process
14>>> plot_convergence_curve('SPSO', rosenbrock.__name__, 2, results=res)

上述示例生成的在线图像如下所示

_images/rosenbrock.png

比较多个黑盒优化器

这里我们使用 Matplotlib 为多个黑盒优化器绘制收敛曲线图。

pypop7.benchmarks.utils.plot_convergence_curves(algos, func, dim, exp=1, results=None, folder='pypop7_benchmarks_lso')[源代码]

绘制多个优化器获得的最终优化结果的收敛曲线。

注意

默认情况下,要保存的本地文件名格式如下:Algo-{}_Func-{}_Dim-{}_Exp-{}.pickle,保存在本地文件夹 pypop7_benchmarks_lso 中。

参数:
  • algos (list of class) – 要使用的优化器类列表。

  • func (str) – 要最小化的适应度函数名称。

  • dim (str or int) – 要最小化的适应度函数的维度。

  • exp (str or int) – 要运行的实验索引。

  • results (list of dict) – 任何优化器返回的优化结果。

  • folder (str) – 工作空间下的本地文件夹(默认为 pypop7_benchmarks_lso)。

示例

 1>>> import numpy  # engine for numerical computing
 2>>> from pypop7.benchmarks.base_functions import rosenbrock  # function to be minimized
 3>>> from pypop7.optimizers.rs.prs import PRS
 4>>> from pypop7.optimizers.pso.spso import SPSO
 5>>> from pypop7.optimizers.de.cde import CDE
 6>>> from pypop7.optimizers.eda.umda import UMDA
 7>>> from pypop7.optimizers.es.cmaes import CMAES
 8>>> from pypop7.benchmarks.utils import plot_convergence_curves
 9>>> problem = {'fitness_function': rosenbrock,  # to define problem arguments
10>>>            'ndim_problem': 2,
11>>>            'lower_boundary': -5.0*numpy.ones((2,)),
12>>>            'upper_boundary': 5.0*numpy.ones((2,))}
13>>> options = {'max_function_evaluations': 5000,  # to set optimizer options
14>>>            'saving_fitness': 1,
15>>>            'sigma': 3.0,
16>>>            'seed_rng': 2022}
17>>> res = []
18>>> for Optimizer in [PRS, SPSO, CDE, UMDA, CMAES]:
19>>>     optimizer = Optimizer(problem, options)  # to initialize the black-box optimizer class
20>>>     res.append(optimizer.optimize())  # to run the optimization process
21>>> plot_convergence_curves([PRS, SPSO, CDE, UMDA, CMAES], rosenbrock.__name__, 2, results=res)

上述示例生成的在线图像如下所示

_images/rosenbrock-optimizers.png

通过 Numba 加速计算

对于一些计算密集型操作,我们尽可能使用 Numba 来加速计算

pypop7.benchmarks.utils.cholesky_update(rm, z, downdate)[源代码]

秩一矩阵的 Cholesky 更新。

参数:
  • rm ((N, N) ndarray) – 二维输入数据,将使用其三角部分读取 Cholesky 因子。

  • z ((N,) ndarray) – 一维更新/降级向量。

  • downdate (bool) – False 表示更新,而 True 表示降级(默认为 False)。

返回:

D – Cholesky 因子。

返回类型:

(N, N) ndarray

例如,对于秩一更新,使用与不使用 Numba 的运行时间比较如下所示

_images/runtime.png