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