首页 > 解决方案 > 为什么 cvxpy 在这里返回无界?

问题描述

我正在使用 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)

标签: linear-programmingcvxpy

解决方案


使用 cvxpy==1.0.10 我得到infeasible.

可行集显然是空的。为什么?

  • numpy.array([[0.],[0.],[1.],[1.],[1.]]).T * wts <= 0.00.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.10.0 <= wts暗示0 <= wts[0] == 0.10 <= wts[1] == 0.1

因此不可能满足numpy.ones(5).T * wts == 1.0(的所有元素之和wts为1)。


推荐阅读