Ограничение CPLEX с абсолютными значениями в Python

#python #variables #optimization #constraints #cplex

Вопрос:

Я пытаюсь создать два ограничения в CPLEX (с использованием python): одно с использованием переменной X, а другое с использованием abs(X). Что-то вроде:

 x > 0
abs(x) > 0
 

Должен ли я создать новое ограничение Y, которое получает значение abs(X), или можно ли включить abs(X) непосредственно в «linear_constraints.add»?

Приведенный ниже код не является функциональным:

 from cplex import Cplex, SparsePair

constraints = [{'abs(X)': 1},{'X': 1}]
exprs = [SparsePair(ind=list(constr.keys()), val=list(constr.values())) for constr in constraints]

model.linear_constraints.add(lin_expr=exprs, names=['constr_1','constr_2'])
 

Есть какие-нибудь идеи? Спасибо.

Ответ №1:

крошечный пример с API python docplex

 from docplex.mp.model import Model

mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40   nbbus30*30 >= 300, 'kids')

#absolute value of nbBus40 - nbBus30
mdl.add_constraint(mdl.abs(nbbus40-nbbus30)<=2)

mdl.minimize(nbbus40*500   nbbus30*400)

mdl.solve(log_output=True,)



for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)