1

我正在研究一个优化问题 (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]

结果,与应有的结果不接近,甚至有负值。我认为,我的规范化约束代码很可能是错误的。

4

1 回答 1

2

您没有附加约束,而是每次都覆盖它们。而不是这条线

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):
于 2018-10-15T16:31:43.687 回答