В этом примере PSO минимизирует двумерную функцию Ackley; мы проверим устройство и построим историю поиска. Используются EvoX 1.4.1 и PyTorch, а не экспериментальный API 2.x. Небольшая задача объясняет процесс, но не служит тестом производительности GPU.

Изолированная среда
Используйте Python 3.10 или новее. Создайте виртуальную среду и активируйте её командой своей оболочки.
python -m venv .venv
В macOS/Linux:
source .venv/bin/activate
В Windows PowerShell:
.\.venv\Scripts\Activate.ps1
Установка подходящих пакетов
Выберите команду для своей ОС и оборудования в официальном установщике PyTorch. CUDA требует поддерживаемого драйвера; одна установка EvoX не гарантирует доступность GPU. Затем установите фиксированную версию:
python -m pip install "evox[vis]==1.4.1"
Полный эксперимент
Сохраните код как сценарий Python. Он выбирает CUDA при наличии, иначе CPU, выводит выбор и размещает состояние и мониторинг на этом устройстве. Фиксированный seed помогает повторению, но результаты могут отличаться между устройствами и версиями.
import torch
from evox.algorithms import PSO
from evox.problems.numerical import Ackley
from evox.workflows import StdWorkflow, EvalMonitor
torch.manual_seed(42)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
torch.set_default_device(device)
algorithm = PSO(
pop_size=50,
lb=-32 * torch.ones(2, device=device),
ub=32 * torch.ones(2, device=device),
device=device,
)
problem = Ackley()
monitor = EvalMonitor(device=device, history_device=device)
workflow = StdWorkflow(algorithm, problem, monitor)
workflow.init_step()
for _ in range(100):
workflow.step()
print("Device:", device)
print("Best fitness:", monitor.get_best_fitness().item())
Интерпретация и визуализация
PSO хранит кандидатов, Ackley оценивает их, StdWorkflow связывает компоненты, EvalMonitor записывает прогресс. Меньшее значение лучше; теоретический оптимум равен нулю в начале координат. Итог случаен, фиксированный результат не гарантируется.
Выполните следующую команду после поиска в том же процессе. Зависимости визуализации уже включены. Изображение взято из исходного руководства и не гарантирует вывод для данного seed.
monitor.plot()

Осмысленное расширение
Меняйте размерность, популяцию или seed по одному. Пользовательская задача должна возвращать значение для каждого кандидата. Многокритериальная оптимизация требует совместимого алгоритма, формы результата и монитора.
Отделяйте компиляцию и прогрев от основного выполнения, синхронизируйте CUDA при измерениях и сравнивайте одинаковые бюджеты оценок. Малые задачи могут быть быстрее на CPU. Изучайте компиляцию после проверки базового запуска.
Материалы и благодарности
Исходное руководство написали Boqing Xu, Xinmeng Yu, Bowen Zheng и Xinyao Li; редактуру и публикацию выполнил Beichen Huang. Ниже сохранена обзорная иллюстрация.

Сверяйтесь с исходным кодом версии и документацией. Проверяйте версию перед использованием API из новых материалов.
Перед расширением примера сохраните вместе версии пакетов, устройство, seed и лучшую приспособленность. Меняйте одну настройку и повторяйте тот же бюджет. Обзор EvoMO объясняет дополнительные решения для конкурирующих целей.