Как добавить квадратичные c ограничения в модель с помощью DOcplex (python)? - PullRequest
2 голосов
/ 14 марта 2020

Возьмем это квадратичное c ограничение в качестве примера:

(-x1^2 + x2^2 + x3^2 <= 0) 

Обратите внимание, что в API CPLEX Python указанное выше ограничение формируется следующим образом:

m.quadratic_constraints.add(
    quad_expr=[["x1", "x2", "x3"], ["x1", "x2", "x3"], [-1,   1,    1]],
    sense='L', rhs=0, name="q1"
)

Как добавить вышеупомянутое квадратичное c ограничение в модель, используя DOcplex, а не CPLEX Python API?

Ответы [ 2 ]

3 голосов
/ 14 марта 2020

позвольте мне немного изменить пример, которым я поделился в эквиваленте cpleqp в docplex

from docplex.mp.model import Model  

mdl = Model(name='qpex1')

#decision variables
x = {b: mdl.continuous_var(0,40,name="x"+str(b)) for b in range(0,3)}


# Constraint
mdl.add_constraint( - x[0] +     x[1] + x[2] <= 20, 'ct1')
mdl.add_constraint(x[0] - 3 * x[1] + x[2] <= 30,'ct2')

mdl.add_constraint(x[0] * x[0] <= 30,'quad')


# Objective
mdl.maximize(x[0] + 2 * x[1] + 3 * x[2]-\
             0.5 * ( 33*x[0]*x[0] + 22*x[1]*x[1] + 11*x[2]*x[2] -\
                     12*x[0]*x[1] - 23*x[1]*x[2] ))

msol=mdl.solve()

# Dislay solution
for v in mdl.iter_continuous_vars():
   print(v," = ",v.solution_value)

print("objective : ",msol.get_objective_value() ) 

и

mdl.add_constraint(x[0] * x[0] <= 30,'quad')

- это квадратичное c ограничение

1 голос
/ 16 марта 2020

Docplex позволяет умножать переменные с помощью стандартного оператора '*' для построения квадратичных c выражений, например:

x * y или x * x

, но также принимать квадрат переменной, используя оператор «**» (power), как в

m.add (x ** 2 + y ** 2 <= 1) </p>

...