Дифференциальная эволюция Scipy с 10 переменными требует много итераций - PullRequest
2 голосов
/ 04 июля 2019

Я пытаюсь оптимизировать скалярную функцию с 10 переменными, используя scipy.optimize.differential_evolution .

Скалярное значение фактически вычисляется программным обеспечением моделирования, которое занимает около 7 секундза итерацию.Проблема состоит в том, что даже если я установлю размер всплывающего окна равным 10, алгоритму потребуется> 1000 итераций, что приведет к очень большому времени вычислений.

10 переменных - это 5 углов и 5 длин:

phi_1 to phi_5 (0 to 360 degress)
l_1 to l_5 (0 to 20 micrometer)

На каждой итерации значения (X_1, X_2, X_3, X_4, X_5, Y_1, Y_2, Y_3, Y_4, Y_5) рассчитываются по

X = l*sin(phi) and Y = l*cos(phi)

Программное обеспечение для моделирования вычисляет скаляр на основе этих входных данных.

Я пытался уменьшить всплывающее окно до 3-5, но тогда результат не является глобальным оптимумом.Ранее я также пробовал разные стратегии, такие как «rand1exp» и «best1exp», а также алгоритмы на основе градиента (SLSQP), но проблема в том, что из-за функций синуса и косинуса критически важна отправная точка, которая приводит ко многим различным (локальным) результатам.Я считаю, что DE - лучший алгоритм для этой проблемы, но я не могу себе представить, что для решения проблемы с «всего лишь» 10 переменными требуется> 1000 итераций.

Я называю DE следующим образом:

sol = differential_evolution(objective, popsize=10, strategy="best1bin", bounds=boundList)

Кто-нибудь имеет некоторый опыт работы с DE и может дать мне несколько советов для правильных параметров?

1 Ответ

1 голос
/ 04 июля 2019

Я не знаком с алгоритмами дифференциальной эволюции, но вот некоторые идеи, которые вы можете рассмотреть:

  • 7 сек за итерацию - это много.Я хотел бы попытаться сократить это время вычислений, когда это возможно ...

  • Если ваш критерий является непрерывным и дифференцируемым, использование методов на основе градиента будет вашим первым подходом.С 10 параметрами, градиентные алгоритмы требуют как минимум 10 итераций (если ваш критерий является квадратичным).На практике следует ожидать гораздо большего (сотни) в зависимости от сложности сближения.Другие алгоритмы могут также потребовать такого же количества итераций.

  • Тот факт, что ваша задача вырождена, не зависит от алгоритма.Поскольку phi + 2 * pi даст точно такое же значение критерия, значит, у вас есть бесконечное количество минимумов.Вам нужно начать не слишком далеко от решения.Вы можете попытаться предоставить умные догадки в качестве начальных значений для ваших параметров.

  • Некоторые методы, основанные на градиенте, предоставленные в Scipy, позволяют использовать границы для ваших параметров.

...