Численная оптимизация
Этот ноутбук предлагает пошаговое руководство по использованию 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()