В CVXPY, как создать ограничение ИЛИ, например, x == 1 ИЛИ x == 2?

#python #cvxpy

#питон #cvxpy

Вопрос:

В CVXPY, как сконструировать ограничение «ИЛИ» подобным образом?

Ограничение, которое я ищу, заключается в том, что x может быть 1 или 2. Оптимизатор минимизирует x и получает оптимальное x = 1.

Например, [x == 1 или x == 2] недопустимо, а [x == 1, x == 2] означает x == 1 И x == 2 и не работает.

Я ищу ограничение, которое ограничивает значение x равным 1 или 2: x == 1 ИЛИ x == 2. Возможно ли создать ограничение CVXPY, подобное этому?

 import cvxpy as cp
x = cp.Variable(name='x')
## x is 1 or 2
## constraints = [ x...]  # x is 1 or 2; for example, 'constraints = [x == 1 or x == 2]' does not work

objective = cp.Minimize(x)
problem = cp.Problem(objective, constraints)
problem.solve()
print("x.value = " , x.value)
 

Ответ №1:

Ради общности здесь приведен код, который ограничивает x значения 1,3,5 :

 x = cp.Variable()
z = cp.Variable(3, boolean=True)
constraints = [cp.sum(z)==1, [1,3,5] @ z == x]
 

В вашем случае все можно упростить, например

 x = cp.Variable()
z = cp.Variable(boolean=True)
constraints = [x == 1   z]
 

или даже

 x = cp.Variable(integer=True)
constraints = [1 <= x, x <= 2]
 

Конечно, вам понадобится решатель со смешанным целым числом, иначе это невозможно. См. Поваренную книгу Mosek modeling для некоторой математики.