cvxpy противоречивые уравнения нормализации (абс)
Я работаю в задаче оптимизации (A*v = b), где я хотел бы оценить набор альтернатив X = {x1,x2,x3,x4}. Однако у меня есть следующее ограничение нормализации: |v[i] - v[j]| <= 1, который может иметь вид -1 <= v[i] - v[j] <= 1. Мой код выглядит следующим образом:
import cvxpy as cp
n = len(X) #set of alternatives
v = cp.Variable(n)
objective = cp.Minimize(cp.sum_squares(A*v - b))
constraints = [0 <= v]
#Normalization condition -1 <= v[i] - v[j] <= 1
for i in range(n):
for j in range(n):
constraints = [-1 <= v[i]-v[j], 1 >= v[i]-v[j]]
prob = cp.Problem(objective, constraints)
# The optimal objective value is returned by `prob.solve()`.
result = prob.solve()
# The optimal value for v is stored in `v.value`.
va2 = v.value
Какие выводы:
[-0.15 0.45 -0.35 0.05]
Результат, который не близок к тому, что должно быть и даже иметь отрицательные значения. Я думаю, что мой код для нормализации скорее всего неверен.
1 ответ
Решение
Вы не добавляете свои ограничения, вместо этого вы перезаписываете их каждый раз. Вместо этой строки
constraints = [-1 <= v[i]-v[j], 1 >= v[i]-v[j]]
У тебя должно быть
constraints += [-1 <= v[i]-v[j], 1 >= v[i]-v[j]]
Для чистоты вы можете изменить это
for i in range(n):
for j in range(n):
Чтобы рассмотреть каждую пару только один раз:
for i in range(n):
for j in range(i+1, n):