Почему cvxpy возвращает неограниченный здесь? - PullRequest
0 голосов
/ 09 ноября 2018

Я использую 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)

1 Ответ

0 голосов
/ 13 ноября 2018

С помощью 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).

...