私は DOCPLEX を使用して混合整数線形計画法 (MILP) 問題を構築しています。この問題は、Python で CPLEX を介して解決されます。ただし、IF-THEN 制約を使用して MILP 問題を解決しようとすると、次のエラーが表示されます。
DOcplexException: Model.if_then(), nbBus40 >= 3.0 is not discrete
これは、次のコードに示すように、nbbus40変数がContinuousであると宣言したために発生しています。
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
連続変数に対して DOCPLEX で IF-THEN 制約を使用するにはどうすればよいですか?