Алгоритм синус-косинуса для решения задач оптимизации с ограничениями в C++

В следующей статье представлен Алгоритм синус-косинуса (SCA) для решения задач оптимизации с ограничениями. Алгоритм был впервые разработан Сейедали Мирджалили.
SCA использует математическую модель, основанную на функциях синуса и косинуса, для генерации множества начальных случайных решений (целевая функция). Затем алгоритм случайным образом изменяет решение либо в большую сторону, либо в сторону оптимального (наилучшего) решения. Применяемый метод включает в себя ряд случайных и адаптивных переменных для облегчения использования и исследования пространства поиска.
Автор считает алгоритм очень мощным, поскольку развертывание в коде (здесь C++) было простым. Алгоритм включает всего два важных регулируемых параметра. Приходится настраивать количество итераций и количество поисковых агентов для решения определенных оптимизационных задач. Алгоритм быстро сходится к оптимальному решению. Автор сравнил SCA с ранее обсуждавшимся Алгоритмом оптимизации кита. Обсуждаемые ниже задачи оптимизации решались одинаково обоими изображенными алгоритмами. Однако SCA решает проблемы быстрее.

Исходный код этой статьи вы найдете на моем GitHub.

Алгоритм синус-косинуса (SCA)

Основной принцип алгоритма состоит в том, чтобы применять только функцию обновления позиции и приближаться к оптимальному решению во время итерации. Итерационный процесс снижает влияние функций синуса и косинуса на обновление (сокращается возможный диапазон обновлений). Циклическая схема синусоидальных и косинусоидальных функций гарантирует, что новое решение будет перемещено вокруг другого решения. Обратите внимание на следующие функции обновления.

где X — позиция агента, случайные числа rand1 и rand4 в диапазоне [0,1]. rand2 — случайное число в диапазоне [0, 2pi]. А = 2,0.

В зависимости от значений синуса или косинуса исследуются различные области пространственного поиска, чтобы найти оптимальное решение.
Если значения синуса или косинуса больше 1 или меньше -1, область расширяется (синий кружок на следующем рисунке расширяется, и происходит процесс исследования).< br /> С другой стороны, если синус или косинус находится в диапазоне от -1 до 1, то область потенциальных решений (процесс эксплуатации) уменьшается (синий кружок сжимается). Алгоритм сходится.
Как мы можем предположить, алгоритм SCA плавно переходит от разведки к эксплуатации, используя адаптивный диапазон (уменьшаем значение r1) в функциях синуса и косинуса.

Псевдокод можно изобразить следующим образом:

Тесты

В этой статье я использовал SCA для решения двух задач оптимизации. Простая — это обычная квадратичная функция, которую я использовал для своей личной отладки.

Вторая проблема связана (проблема эталонной оптимизации) с пружиной растяжения/сжатия, где целью задачи является минимизация веса. Есть три конструктивных параметра: диаметр проволоки (d), средний диаметр катушки (D) и количество активных катушек (N). Это трехмерная задача (каждая переменная рассматривается как измерение).

(а) Схема пружины; (b) распределение напряжения, оцененное при оптимальной конструкции; и c) распределение рабочего объема, оцененное при оптимальной конструкции (упомянутая статья I).

Задачу оптимизации можно сформулировать следующим образом:

Существующие ограничения были включены в целевую функцию как штрафы. Я смоделировал штрафы как квадратичную функцию потерь (см. здесь и здесь).
Реализованный метод решает проблему (вычисляет минимальный вес пружины). Полученное решение совпало (почти) со статьей, которой я вдохновился.

Для построения графика требуется включить заголовочный файл, который должен находиться в той же папке, что и ваш cpp (файл, который вы можете клонировать из моего репозитория).
Ваша программа может быть скомпилирована следующим образом:

//compile
g++ my_prog.cpp -o my_prog -I/usr/include/python3.8 -lpython3.8//

 //run
./my_prog

//folder tree

├── my_prog
├── my_prog.cpp
├── matplotlibcpp.h

Спасибо за чтение.