Численная оптимизация

Численная оптимизация

Этот ноутбук предлагает пошаговое руководство по использованию EvoX для оптимизации функции Экли с помощью алгоритма оптимизации роем частиц (PSO). Как алгоритм PSO, так и задача оптимизации Экли интегрированы как встроенные компоненты фреймворка EvoX.

Сначала нужно импортировать все необходимые модули, включая PSO (алгоритм), Ackley (задача) и StdWorkflow & EvalMonitor (рабочий процесс).

import torch

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

Здесь мы создаём экземпляр алгоритма PSO. Мы указываем следующие настройки:

  • pop_size: Размер роя частиц (популяции).
  • lb и ub: Нижняя и верхняя границы для каждого измерения в пространстве поиска.
  • Остальные параметры — по умолчанию. Подробности см. в API.
# Определение алгоритма
algorithm = PSO(pop_size=100, lb=-32 * torch.ones(10), ub=32 * torch.ones(10))

Далее выбираем функцию Ackley из численных задач EvoX.

# Определение задачи
problem = Ackley()

Создаём экземпляр EvalMonitor для отслеживания необходимой информации в процессе оптимизации.

# Определение монитора
monitor = EvalMonitor()

Класс StdWorkflow предоставляет стандартизированный процесс для интеграции алгоритма, задачи и монитора.

# Определение рабочего процесса
workflow = StdWorkflow(algorithm=algorithm, problem=problem, monitor=monitor)

Вызов setup() инициализирует компоненты, чтобы рабочий процесс был готов к выполнению шагов оптимизации.

Мы запускаем оптимизацию на определённое количество итераций (100 в этом примере). На каждой итерации метод step() обновляет алгоритм PSO, оценивает новые решения-кандидаты на функции Экли и отслеживает их приспособленность через монитор.

# Выполнение процедуры оптимизации функции Экли
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()