回调--访问约束矩阵系数。

问题描述 投票:0回答:1

我正在用JuMP 0.21.1和CPLEX解决整数线性程序。我正在使用一个回调来添加用户的切割。在这个回调中,我想访问以下信息。

  • 约束的数量(随着我添加用户切口而变化)。
  • 变量的数量
  • 约束矩阵的系数值。
  • 约束右边的系数的值。

我可以使用全局变量来获取这些信息,但这会降低性能,因为这些值不是恒定的(当我添加用户切割时,约束数量会增加)。

在JuMP文档中规定,我只能得到变量的当前值,如果我需要其他的信息,我必须创建一个依赖于求解器的回调。

我看到了在 文件 但它并没有真正帮助我。我还发现 cplex_callback.jl 在CPLEX.jl的github仓库里有一个函数 "setcallbackcut",其中包含一个参数rhs,看起来很有前途。但是,我不知道如何使用它......。

你能告诉我怎么做吗?或者我在哪里可以找到例子?

callback cplex julia-jump
1个回答
2
投票

下面是一个使用CPLEX中依赖于求解器的回调来进行用户切割的例子。

https:/github.comJuliaOptCPLEX.jlblob5ae4628446470fa0a46438cdfe577155dbcfd54ctestMathOptInterfaceMOI_callbacks.jl#L336-L366。

请注意,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
© www.soinside.com 2019 - 2024. All rights reserved.