如何在cplex-python中设置间隙公差?

时间:2019-05-21 05:03:44

标签: python optimization mathematical-optimization modeling cplex

我想设置一个间隙值(GAP),以便当当前间隙小于GAP时停止优化过程。我已经阅读了cplex-python文档,发现:

Model.parameters.mip.tolerances.absmipgap(GAP)

但我收到下一个警告:

Model.parameters.mip.tolerances.mipgap(float(0.1))
TypeError: 'NumParameter' object is not callable

有什么想法吗?请帮我。预先感谢。

3 个答案:

答案 0 :(得分:1)

让我根据您的问题修改公交车示例:

from docplex.mp.model import Model

mdl = Model(name='buses')

# gap tolerance
mdl.parameters.mip.tolerances.mipgap=0.001;


nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

print("gap tolerance = ",mdl.parameters.mip.tolerances.mipgap.get())

给出

nbBus40  =  6.0
nbBus30  =  2.0
gap tolerance =  0.001

致谢

答案 1 :(得分:1)

您的错误是像调用函数一样调用参数。更改参数的正确方法是为其分配:

Model.parameters.mip.tolerances.absmipgap = GAP

还要确保您不使用Model类,而是使用此类的实例:

mdl = Model()
mdl.parameters.mip.tolerances.absmipgap = GAP

还要注意,有两个间隙参数:绝对和相对。相对间隙是最常用的。您可以找到herehere(相对公差的参数仅称为mipgap)。

答案 2 :(得分:1)

基于收到的错误,我认为您可能正在使用CPLEX Python API而不是docplex(与其他答案一样)。要解决您的问题,请考虑以下示例:

import cplex                                                                    
Model = cplex.Cplex()                                                           
# This will raise a TypeError                                                   
#Model.parameters.mip.tolerances.mipgap(float(0.1))                             
# This is the correct way to set the parameter                                  
Model.parameters.mip.tolerances.mipgap.set(float(0.1))                          
# Write the parameter file to check that it looks as you expect                 
Model.parameters.write_file("test.prm")

您需要使用set()方法。您可以使用write_file方法将参数文件写入磁盘并查看它,从而确保按预期更改参数。