Я запускаю несколько ограниченных оптимизаций с известным градиентом (от 100 до 300 переменных). Иногда TNC возвращается «не в состоянии прогрессировать».
Для моей целевой функции L-BFGS-B намного медленнее и выдает плохие результаты по сравнению с TNC. (Возможно, потому что TNC лучше, когда число переменных велико) Используя Basinhopping с L-BFGS-B и niter_success до 10, я получаю результаты, близкие к TNC, но со скоростью в 20 раз ниже. Когда TNC возвращает «невозможно выполнить», «L-BFGS-B» возвращает лучшие результаты. Итак, мое текущее решение состоит в том, чтобы запускать Basinhopping, когда TNC выходит из строя со статусом 6 - «невозможно выполнить».
Кажется, что «невозможно прогрессировать» возвращается, когда TNC не может уменьшить целевую функцию за x число итераций. Я немного поиграл с коэффициентом масштабирования и непоследовательно получил лучшие результаты.
Насколько мне известно, масштабирование в задаче оптимизации позволяет оптимизатору узнать, какая переменная более эффективна. У меня есть эта информация, и я считаю, что это уменьшит количество «неспособных к прогрессу», которые я получаю. Согласно документам, https://docs.scipy.org/doc/scipy/reference/optimize.minimize-tnc.html "Масштаб шкалы по умолчанию восходящий-нижний для переменных, ограниченных интервалом, и 1+|x] для остальных"сильный>. Таким образом, это верхняя граница - нижняя граница для переменных, которые ограничены, не в состоянии понять, как обрабатываются неограниченные. что такое 1+|x]?
Кроме того, я вручную рассчитал up-low и установил unbounded равным 1, это возвращает разные результаты каждый раз, когда я запускаю оптимизацию с одним и тем же вводом. (Странно?)
Я также попытался заглянуть в код, как TNC обрабатывает масштаб, обертка spicy отправляет пустой массив или входной массив в код C https://github.com/scipy/scipy/blob/master/scipy/optimize/tnc/moduleTNC.c. В коде C я не могу найти, где создается массив масштаба или как он используется. Также не удалось найти, когда срабатывает «невозможно прогрессировать». Может ли кто-нибудь указать мне, где я должен искать?