我正在用JuMP 0.21.1和CPLEX解决整数线性程序。我正在使用一个回调来添加用户的切割。在这个回调中,我想访问以下信息。
我可以使用全局变量来获取这些信息,但这会降低性能,因为这些值不是恒定的(当我添加用户切割时,约束数量会增加)。
在JuMP文档中规定,我只能得到变量的当前值,如果我需要其他的信息,我必须创建一个依赖于求解器的回调。
我看到了在 文件 但它并没有真正帮助我。我还发现 cplex_callback.jl 在CPLEX.jl的github仓库里有一个函数 "setcallbackcut",其中包含一个参数rhs,看起来很有前途。但是,我不知道如何使用它......。
你能告诉我怎么做吗?或者我在哪里可以找到例子?
下面是一个使用CPLEX中依赖于求解器的回调来进行用户切割的例子。
请注意,CPLEX.jl只是封装了CPLEX的C语言API,所以你对它的作用有限。这里是文档。https:/www.ibm.comsupportknowledgecenterSSSA5P_12.10.0ilog.odms.cplex.helprefcallablelibrarymipapihpMIPcallbacks.html
特别是在以下方面要注意
限制条件的数量(随着我添加用户的切割而变化)。
因为无法保证CPLEX会添加您提供的切面。为什么你需要在回调中加入系数和RHS项?
请注意,为了避免使用全局变量,只要把所有的东西都包在一个函数中建立一个闭包就可以了。例如,在下面的例子中,访问和修改变量就可以了。calls
内的回调。
function build_and_run_model()
# ...
calls = 0
function my_callback(cb_data, cb_where)
calls += 1
# ...
end
# ...
end