如何在 docplex 中将浮点数转换为二进制变量?

How to convert a float to a binary variable in docplex?

在创建模型并使用一些专门的切割解决 LP 之后,我想解决问题的 IP 版本,但更改某些变量的类型。在 JAVA 中使用函数:

IloConversion 转换(IloNumVar 变量, IloNumVarType 类型) 抛出 IloException

DOCPLEX 中的等价物是什么?

DOcplex 中相应的 API 尚未记录,因为它没有经过充分测试。 这个说,你可以试试

myvar.set_vartype('I')

将变量转换为二进制整数类型(或'B')。此代码目前按原样提供。让我们知道这是否适合您。 此方法接受变量类型实例(例如 model.binary_vartype)或单字母字符串('B'、'I'、'C'、'S' 表示半连续,'N " 对于半整数)

在这个例子中,我最大化了四个二进制文件的总和,其总和小于 3.5。
当我将它们的类型更改为连续时​​,其中一个设置为 0.5 并且 objective 等于 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.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