Ограничение равенства CVXPY в наборе - PullRequest
0 голосов
/ 14 марта 2019

У меня проблема с ILP, когда мне нужно ограничить значения переменной матрицы значением {0, 1}. Я попытался сделать это с помощью следующего (упрощенного) кода, но он не позволяет мне использовать '|' оператор. Как бы я это сделал?

def test_ILP(scores):
    N = scores.shape[0]
    eye_bool = np.eye(N)
    zero_when_equal = np.abs(np.eye(N) - 1)


    opt = cp.Variable(scores.shape)
    objective = cp.Maximize(
        cp.sum(cp.multiply(scores, opt * zero_when_equal))
    )


    constraints = [(opt == 0) | (opt == 1) | eye_bool]

    prob = cp.Problem(objective, constraints)
    prob.solve()
    return opt.value

1 Ответ

0 голосов
/ 14 марта 2019

Исходя из комментария @ sascha, для логического (или целочисленного) ограничения можно использовать аргумент в конструкторе Variable.Для этого случая:

def test_ILP(scores):
    N = scores.shape[0]
    eye_bool = np.eye(N)
    zero_when_equal = np.abs(np.eye(N) - 1)
    boolean_constraint = [(x, y) for x in range(N) for y in range(N) if x != y]

    opt = cp.Variable(scores.shape, boolean=boolean_constraint)
    objective = cp.Maximize(
        cp.sum(cp.multiply(scores, opt * zero_when_equal))
    )


    constraints = [#Rest of the constraints]

    prob = cp.Problem(objective, constraints)
    prob.solve()
    return opt.value
...