回调 - 访问约束矩阵系数

Callback - Access constraints matrix coefficients

我正在使用 JuMP 0.21.1 和 CPLEX 求解整数线性规划。我正在使用回调来添加用户削减。在此回调中,我想访问以下信息:

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

在 JuMP 文档中指定我可以获得的唯一信息是变量的当前值,如果我需要任何其他信息,我必须创建一个依赖于求解器的回调。

我在 CPLEX.jl github 存储库的 the documentation but it does not really help me. I also found the cplex_callback.jl 中看到了 GLPK 回调,这看起来很有前途,因为有一个函数 "setcallbackcut" 其中包含一个参数 rhs 等.但是,我不知道怎么用...

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

这里是使用 CPLEX 的求解器相关回调和用户切割的示例。

https://github.com/JuliaOpt/CPLEX.jl/blob/5ae4628446470fa0a46438cdfe577155dbcfd54c/test/MathOptInterface/MOI_callbacks.jl#L336-L366

请注意,CPLEX.jl 只是包装了 CPLEX 的 C API,因此您只能使用它的功能。这是文档: https://www.ibm.com/support/knowledgecenter/SSSA5P_12.10.0/ilog.odms.cplex.help/refcallablelibrary/mipapi/hpMIPcallbacks.html

特别是

number of constraints (which varies as I add user cuts)

因为不能保证 CPLEX 会添加您提供的剪辑。为什么回调中需要系数和 RHS 项?

请注意,为避免使用全局变量,只需将所有内容包装在一个函数中以创建一个闭包。例如,在下面可以在回调中访问和修改变量 calls

function build_and_run_model()
    # ...
    calls = 0
    function my_callback(cb_data, cb_where)
        calls += 1
        # ...
    end
    # ...
end