BBO的实用函数

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

绘制二维适应度景观

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

在绘制适应度景观的二维等高线之前生成必要的数据。

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

  • x (列表) – x轴范围。

  • y (列表) – y轴范围。

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

Returns:

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

Return type:

元组

示例

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)[source]

绘制适应度景观的二维等高线图。

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

  • x (列表) – x轴范围。

  • y (列表) – y轴范围。

  • levels (intlist) – 等高线的数量或等高线列表。

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

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

Return type:

一个在线图表。

示例

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

绘制3D适应度景观

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

绘制适应度景观的3D表面图。

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

  • x (列表) – x轴范围。

  • y (列表) – y轴范围。

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

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

Return type:

一个在线图表。

示例

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')[source]

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

注意

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

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

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

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

  • dim (strint) – 需要最小化的适应度函数的维度。

  • exp (strint) – 每个要运行的独立实验的索引。

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

Return type:

一个存储在本地工作空间中的文件(可以通过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)[source]

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

注意

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

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

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

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

  • dim (strint) – 需要最小化的适应度函数的维度。

  • exp (strint) – 每个要运行的独立实验的索引。

Returns:

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

Return type:

字典

示例

 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)[source]

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

Parameters:
  • 问题 (字典) – 问题参数。

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

  • 结果 (字典) – 由任何黑箱优化器生成的优化结果。

Return type:

一份详细的检查报告。

示例

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')[source]

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

注意

默认情况下,要保存的本地文件名以下列形式给出: Algo-{}_Func-{}_Dim-{}_Exp-{}.pickle,位于本地文件夹pypop7_benchmarks_lso中。

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

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

  • dim (strint) – 需要最小化的适应度函数的维度。

  • exp (strint) – 要运行的实验的索引。

  • 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')[source]

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

注意

默认情况下,要保存的本地文件名以下列形式给出: Algo-{}_Func-{}_Dim-{}_Exp-{}.pickle,位于本地文件夹pypop7_benchmarks_lso中。

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

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

  • dim (strint) – 需要最小化的适应度函数的维度。

  • exp (strint) – 要运行的实验的索引。

  • 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)[source]

秩一的Cholesky更新。

Parameters:
  • rm ((N, N) ndarray) – 从2D输入数据中,将使用三角形部分来读取Cholesky因子。

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

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

Returns:

D – Cholesky因子。

Return type:

(N, N) 多维数组

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

_images/runtime.png