问题描述
在创建模型并通过一些专门的切割解决 LP 后,我想解决问题的 IP 版本但更改某些变量的类型。在 JAVA 中,这使用函数:
IloConversion 转换(IloNumVar var,IloNumVarType 类型) 抛出 IloException
DOCPLEX 中的等价物是什么?
解决方法
DOcplex 中相应的 API 尚未记录,因为它没有经过充分的测试。 说了这么多,你可以试试
myvar.set_vartype('I')
将变量切换为二进制的整数类型(或“B”)。此代码目前按原样提供。让我们知道这是否适合您。 此方法接受变量类型实例(例如 model.binary_vartype)或单字母字符串('B'、'I'、'C'、'S' 表示半连续,'N” 表示半整数)
,在这个示例中,我最大化了四个二进制文件的总和,其总和小于 3.5。
当我将它们的类型更改为连续时,其中一个设置为 0.5,目标等于 3.5
代码:
def test_vartype():
m = Model()
m.environment.print_information()
bs = m.binary_var_list(4,name='b')
sumbs = m.sum(bs)
m.add(sumbs <= 3.5)
m.maximize(m.sum(bs))
s1 = m.solve()
assert s1
s1.display()
# now switch
for b in bs:
b.set_vartype(m.continuous_vartype)
# m.print_information()
s2 = m.solve(log_output=False)
m.report()
s2.display()
输出为:
* Python version 3.7.7,located at: C:\python\anaconda2020.02\envs\docplex_dev37\python.exe
* docplex is present,version is 2.19.0
* CPLEX library is present,version is 20.1.0.0,located at: C:\OPTIM\cplex_distrib\cplex2001R1\python\3.7\x64_win64
* pandas is present,version is 1.0.3
* numpy is present,version is 1.18.1
solution for: docplex_model1
objective: 3
b_0 = 1
b_1 = 1
b_2 = 1
* model docplex_model1 solved with objective = 3.500
solution for: docplex_model1
objective: 3.500
b_0 = 1.000
b_1 = 1.000
b_2 = 1.000
b_3 = 0.500