数值优化

数值优化

本教程提供了使用 EvoX 通过粒子群优化(PSO)算法优化 Ackley 函数的分步指南。PSO 算法和 Ackley 优化问题都作为内置组件集成在 EvoX 框架中。

首先,我们需要导入所有必要的模块,包括 PSO(算法)、Ackley(问题)以及 StdWorkflowEvalMonitor(工作流)。

import torch

from evox.algorithms import PSO
from evox.problems.numerical import Ackley
from evox.workflows import StdWorkflow, EvalMonitor

这里,我们实例化 PSO 算法。我们指定以下设置:

  • pop_size:粒子群(种群)的大小。
  • lbub:搜索空间中每个维度的下界和上界。
  • 其他参数均为默认值。请参阅详细的 API 文档。
# 定义算法
algorithm = PSO(pop_size=100, lb=-32 * torch.ones(10), ub=32 * torch.ones(10))

接下来,我们选择 EvoX 数值问题中的 Ackley 函数。

# 定义问题
problem = Ackley()

我们创建一个 EvalMonitor 实例来跟踪优化过程中的必要信息。

# 定义监视器
monitor = EvalMonitor()

StdWorkflow 类提供了一个标准化流程来集成算法、问题和监视器。

# 定义工作流
workflow = StdWorkflow(algorithm=algorithm, problem=problem, monitor=monitor)

调用 setup() 初始化各组件,使工作流准备好执行优化步骤。

我们运行一定次数的迭代优化(本例中为 100 次)。在每次迭代中,step() 方法更新 PSO 算法,在 Ackley 函数上评估新的候选解,并通过监视器跟踪其适应度。

# 执行 Ackley 函数优化过程
for _ in range(100):
    workflow.step()

最后,我们从工作流中获取 monitor 子模块,以访问迄今为止找到的最优解(topk_solutions)及其对应的目标值(topk_fitness)。然后我们打印最佳结果和相关解。

# 获取最佳解及其适应度
population = monitor.topk_solutions
fitness = monitor.topk_fitness
print(f"The best solution is:\n{population},\nwith the minimum value:\n{fitness}")
monitor.plot()