#python #pyomo #nonlinear-optimization #ipopt
#python #pyomo #нелинейная оптимизация #ipopt
Вопрос:
У меня сложная нелинейная проблема, которую я не могу скопировать здесь, где я использовал IPOPT.exe пока (версия 3.9.1) в среде pyomo без проблем. В последнее время я столкнулся с тем, что значение целевой функции сильно варьируется в зависимости от настроек:
- если я уменьшаю допуск, значение сначала становится более точным (для некоторых цифр), но затем оно переходит к другому значению, которое на 10% больше предыдущего
- моя проблема оптимизации одинакова для каждого запуска, за исключением значения одного параметра (час, в который я оцениваю функцию), тем не менее, IPOPT иногда может найти решение за 2 секунды, иногда я получаю невозможный результат или достигнутую максимальную итерацию (изменение параметра находится в диапазоне, который не должен вызывать никаких аномалий в системе)
- поскольку это неприятная проблема, я ожидал, что ipopt случайным образом «переходит» к проблеме, но это не так, он возвращает тот же выход и значение, даже если пытается решить проблему несколько раз (с помощью for attempt: — try: — и т.д.).
- также результат отличается в зависимости от того, использую ли я «точное» или «ограниченное по памяти» приближение Гессе.
- поскольку мне не нравится это поведение, я хотел использовать опцию multistart, но я не могу определить «исполняемый» путь с помощью опции, поэтому я решил перейти от исполняемого файла к установленному решателю.
- Я установил cyipopt и ipopt, чтобы иметь все, и это отлично работает с другим примером, но не с моей проблемой. Он возвращает: ОШИБКА: решатель (ipopt) вернул ненулевой код возврата (3221225501) без какой-либо обратной связи. Я не могу выяснить причину.
Итак, вопросы будут:
- как я узнаю, какие параметры установить и какое их правильное значение?
- почему я всегда получаю один и тот же результат, даже если я запускаю процесс полностью заново?
- могу ли я определить исполняемый файл с параметром multistart? и изменит ли это что-нибудь, или я должен больше сосредоточиться на инициализации переменных с лучшим значением?
- какой самый простой способ способствовать конвергенции?
Я знаю, что это не одна проблема, но они принадлежат друг другу в одном контексте. Заранее спасибо за ответы!
Комментарии:
1. Это звучит очень широко, и я скептически отношусь к тому, что здесь есть большая помощь. 1 2 звучит как числовая проблема. Поскольку pyomo, вероятно, выполняет автоматическое дифференцирование (числовое различие не является виновником), это, вероятно, связано с масштабированием . 3 звучит так, как я ожидал бы от решателя (в целом): детерминизм . Будет процедура начальной точки (как и во всех IPM), и я надеюсь, что это не случайно. В общем, вы могли бы каким-то образом указать начальные точки, хотя это может быть сложно для IPM. 4. Нормальное поведение; усилено числовыми трудностями. 5 Что? 6 Без кода невозможна отладка.
2. Спасибо, Саша, уже большая помощь. Меня устраивает формулировка физической модели, но я теряюсь в такой математической формулировке, которая может быть решена. — действительно, у меня есть несколько переменных в разных масштабах (например, -30 -5: пока я использую SolverFactory (‘ipopt’, исполняемый файл = C:etc .) функция с exe-файлом. Он работает с этим. После установки IPOPT с помощью conda и попытки SolverFactory (‘ipopt’) я получаю сообщение, о котором я упоминал.
3. Проблема может быть невыпуклой. Решатель перейдет к другому локальному оптимуму в зависимости от деталей. Кроме того, Pyomo поддерживает различные решатели NLP. Часто помогает попробовать несколько.
4. Спасибо за подсказку, Эрвин. Не могли бы вы предложить что-нибудь? Я потратил значительное время на поиск решателей NLP с открытым исходным кодом, но я не нашел ничего, кроме IPOPT. Заранее спасибо!