cvxpy как сформулировать выражение, зависящее от знака переменной принятия решения

#python #optimization #cvxpy

Вопрос:

Задача оптимизации Maximize(-obj_Sigma - obj_Cost) состоит из двух слагаемых со списком ограничений:

  • obj_Sigma термин представляет собой квадроформу вектора переменной принятия решения x .
  • obj_Cost термин является линейным термином, который зависит от знака записей в векторе переменной принятия решения x .

В этом примере:

  • если запись в x имеет тот же знак , prev_x что и, затем добавьте 5 к obj_Cost
  • если запись в x имеет противоположный знак как prev_x , то вычтите 5 из obj_Cost

Мой код выглядит следующим образом:

 import cvxpy as cp
import numpy as np

# Generate a random non-trivial quadratic program.
n = 10
np.random.seed(1)
P = np.random.randn(n, n)
Sigma = P.T @ P

# previous result
prev_x = np.random.randn(n)

# Define and solve the CVXPY problem.
x = cp.Variable(n)

# objective function first term
obj_Sigma = 1/2*cp.quad_form(x, Sigma)

# objective function 2nd term.
# if x has same sign as the corresponding entry in prev_x,
#    then add 5.0 to the cost.
#    otherwise substract 5 from the cost
#     ---- This formulation has problem. 
obj_Cost = cp.sum(5*cp.sign(cp.multiply(prev_x, x)))


obj = -obj_Sigma - obj_Cost
prob = cp.Problem(cp.Maximize(obj),
                 [cp.norm(x, 1) <= 1.0,                 
                  cp.abs(x) <= 0.01
                  ])
prob.solve(verbose=True, solver=cp.MOSEK)
 

Я знаю, что это obj_Cost выражение проблематично. Но как я должен сформулировать этот термин затрат? В общем, как мне сформулировать проблему с компонентами, которые зависят от знака переменных решения.

Комментарии:

1. На мой взгляд, нет необходимости формулировать этот термин затрат. Пока вы используете пользовательские функции cvxpy («атомы»), у вас все в порядке (помните, что cvxpy сокращает бэкэнд). Я верю, что ты хорошо справился с этим. Есть ли конкретная причина, по которой вы хотите переформулировать его?