我正在使用cvxpy 0.4.9和Python 2.7.14,并从下面的示例中获得了令人惊讶的unbounded
状态。
轻微变化(例如,删除最后一个约束)可以正确报告infeasible
状态。
在Windows和Linux环境中都会发生这种情况。为什么?
import cvxpy
import numpy
def main():
yld = numpy.array([[12.],[11.],[17.],[13.],[7.]])
wts = cvxpy.Variable(5)
obj = cvxpy.Maximize(yld.T * wts)
cons = []
cons.append(0.0 <= wts)
cons.append(numpy.ones(5).T * wts == 1.0)
cons.append(wts <= 2.5 * numpy.ones(5))
cons.append(wts <= 0.25)
cons.append(numpy.array([[0.],[0.],[1.],[1.],[1.]]).T * wts <= 0.0)
cons.append(numpy.array([[1.],[0.],[0.],[0.],[0.]]).T * wts <= 0.1 )
cons.append(numpy.array([[0.],[1.],[0.],[0.],[0.]]).T * wts <= 0.1 )
cons.append(numpy.array([[0.],[0.],[1.],[0.],[0.]]).T * wts <= 0.1 )
cons.append(numpy.array([[0.],[0.],[0.],[1.],[0.]]).T * wts <= 0.1 )
prob = cvxpy.Problem(obj, cons)
prob.solve()
print(prob.status)
答案 0 :(得分:0)
使用cvxpy == 1.0.10,我得到infeasible
。
可行集显然是空的。为什么?
numpy.array([[0.],[0.],[1.],[1.],[1.]]).T * wts <= 0.0
和0.0 <= wts
暗示着wts[2] == wts[3] == wts[4] == 0
。 numpy.array([[0.],[1.],[0.],[0.],[0.]]).T * wts <= 0.1
,[1.],[0.],[0.],[0.],[0.]]).T * wts <= 0.1
和0.0 <= wts
暗示0 <= wts[0] == 0.1
和0 <= wts[1] == 0.1
因此,不可能满足numpy.ones(5).T * wts == 1.0
(wts
的所有元素之和为1)。