#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 сокращает бэкэнд). Я верю, что ты хорошо справился с этим. Есть ли конкретная причина, по которой вы хотите переформулировать его?