CPLEX C++:如何在优化期间更改参数

CPLEX C++: How to change parameters during optimization

我正在尝试修改 Cplex 在 优化期间进行分支和绑定的方式,使用它的 C++ API。我真正想做的是:

——在调用solve()方法之前设置参数。例如,使用 cplex.setParam(IloCplex::NodeSel, 0); 告诉 Cplex 在分支定界树中执行 DFS。

-一旦 cplex 找到第一个现任者(即问题的整数解),我想将此参数设置为一个(cplex.setParam(IloCplex::NodeSel, 1);),这意味着 Cplex 应该做一个最佳绑定在树中搜索而不是 dfs。

我尝试使用现有的回调(只要找到整数解就会执行)来设置参数:

ILOINCUMBENTCALLBACK1(CustomIncumbentCallback, IloNumVarArray, vars){
  cplex.setParam(IloCplex::NodeSel, 1);
  ...
}

并在 main() 中,在调用 solve() 之前:

cplex.use(CustomIncumbentCallback(env));

但是,它似乎不起作用并且参数保持其初始值,即使在回调中调用 setParam 也是如此(我已确保在找到整数解时执行此回调)。请注意,cplex 变量在我的代码中是一个全局变量。

我的问题是:是否可以在优化过程中修改参数值(调用solve()之后,结束之前),如果可以,如何修改?

您的问题与How to set UpperCutoff when using lazy constraint callback in CPLEX有关。

答案是否定的。您不能在优化期间修改参数,并且不支持从回调中设置参数。

但是,advanced start switch 参数默认设置为 1。文档指出:

For MIP models, setting 1 (one) will cause CPLEX to continue with a partially explored MIP tree if one is available. If tree exploration has not yet begun, setting 1 (one) specifies that CPLEX should use a loaded MIP start, if available. Setting 2 retains the current incumbent (if there is one), re-applies presolve, and starts a new search from a new root.

如果您在找到第一个现任者后中止求解,更改参数然后再次调用求解,它应该如上所述从中断处继续。