ввод заданных c ограничений в cvxopt QP - PullRequest
0 голосов
/ 15 апреля 2020

У меня довольно сложная квадратичная c проблема, которую я пытаюсь решить в python, однако, ради этого вопроса - я значительно упрощаю проблему под рукой.

У меня есть следующая квадратичная c функция, которую я пытаюсь минимизировать при выполнении следующих ограничений:

minimize 0.5 * x.T * P * x + q.T * x

where: 

x >= 0
x[0] >= 1.5
x[n] >= 1.5 # n = last element

Я написал эквивалент в scipy.optimize :

def minimize_func(x,y,P):
    return 0.5*np.dot(x.T,np.dot(P,x)) + np.dot(y.T,x)

cons = ({'type':'ineq','fun': lambda x: x},
        {'type':'ineq','fun': lambda x: x[0] - 1.5},
        {'type':'ineq','fun': lambda x: x[n] - 1.5})

Однако у меня вопрос, как мне ввести определенные c ограничения в cvxopt quadrati c solver?

Я посмотрел в cvxopt страница документации и ни один из примеров, которые они приводят, похоже не связаны с моим вопросом. Я ищу вводные ограничения по элементам. Любая помощь очень ценится.

1 Ответ

1 голос
/ 19 апреля 2020

cvxopt фокусируется на естественной матричной форме, которая может выглядеть довольно низко для людей без каких-либо знаний о внутренностях.

Все, что вам нужно, документировано в руководстве пользователя

cvxopt.solvers.qp(P, q[, G, h[, A, b[, solver[, initvals]]]])

решает:

enter image description here

Предполагая n=3 и ваши ограничения (я предполагаю 0-индексирование -> n- 1 - последний элемент):

x >= 0
x[0] >= 1.5
x[n-1] >= 1.5 # n-1 = last element 

это будет выглядеть так:

G = 
-1   0   0
 0  -1   0
 0   0  -1

h = -1.5
        0
    -1,5

Аргументация проста:

     - 1 * x[0] + 0 * x[1] + 0 * x[2] <= -1.5
<->  -     x[0]                       <= -1.5
<->        x[0]                       >=  1.5  

(Мы проигнорировали отрицательные ограничения для x[0] и x[1] здесь, так как >= 1.5 является более строгим)

В numpy / scipy и co существует множество вспомогательных функций. сделать это более легко (например, np.eye(n)).

В общем, я бы рекомендовал использовать cvxpy , который является более высокоуровневым инструментом моделирования, позволяющим также вызывать решатели cvxopt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...