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

问题描述

在创建模型并通过一些专门的切割解决 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