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):
Другие вопросы по тегам