Я использую DOCPLEX для создания проблемы смешанного целочисленного линейного программирования (MILP), которая затем решается с помощью CPLEX на Python. Однако при попытке решить проблему MILP с использованием ограничений IF-THEN я получаю следующую ошибку:
DOcplexException: Model.if_then(), nbBus40 >= 3.0 is not discrete
Это происходит потому, что я объявил переменную nbbus40 как непрерывную, как показано в приведенном ниже коде:
from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.continuous_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.add(mdl.if_then((nbbus40>=3),(nbbus30>=7)))
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
Однако, если я сохраню переменную nbbus40 как целое число, я получу решение проблемы MILP, как показано ниже:
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')
mdl.add(mdl.if_then((nbbus40>=3),(nbbus30>=7)))
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
РЕЗУЛЬТАТ:
nbBus40 = 0
nbBus30 = 10.0
Как я могу использовать ограничение IF-THEN в DOCPLEX для непрерывных переменных?