#python #linear-programming #nonlinear-optimization #scipy-optimize
#python #линейное программирование #нелинейная оптимизация #scipy-оптимизировать
Вопрос:
В настоящее время я работаю над некоторой задачей оптимизации, которая включает нелинейное ограничение. Проблема заключается в следующем :
Мне нужно выполнить любую из двух минимизаций, показанных на изображении в python. Я нашел библиотеку scipy, в которой есть функция optimize.minimize(), но я не могу вписаться в нелинейное ограничение с помощью scipy.NonLinearConstraint. Кто-нибудь может помочь? Как это решить? Есть ли также способ решить эту проблему, используя некоторую гомотопическую функцию, заданную в любой из библиотек? Я попытался (добавив ограничение для альтернативного) как:
con = lambda A,x,y : np.matmul(A,x) - y
nlc = NonlinearConstraint(con, 0, epsilon)
Комментарии:
1. Что вы подразумеваете под нелинейными ограничениями? Я интерпретирую верхний вариант как задачу линейной оптимизации, минимизирующую l1-норму. Это может быть легко преобразовано в простой LP, который позволяет принимать решения, оптимальные в глобальном масштабе по времени. Что-то, что, вероятно, трудно превзойти всеми другими (общими) подходами, особенно общим нелинейным выбором. Используя нелинейный opt, вы должны сначала подумать о дифференцируемости l1-норм, которые не будут совместимы с большинством предположений этих решателей.
2. @sascha: второе уравнение подчиняется нелинейному ограничению, которое упоминается как альтернативный способ решения.
Ответ №1:
Итак, я, наконец, смог решить вышеуказанную оптимизацию, используя решатель spgl1 в python. Его можно использовать, как показано ниже:
from spgl1 import spgl1, spg_bp, spg_bpdn
#x01 = psueodinverse of A multiplied by y
x,resid,grad,info = spgl1(A, y, tau = tau, sigma = epsilon, x0 = x01, iter_lim = 150)
можно обратиться к вышеупомянутому решателю по ссылке github или ссылке pypi