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.
如果您在找到第一个现任者后中止求解,更改参数然后再次调用求解,它应该如上所述从中断处继续。
我正在尝试修改 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.
如果您在找到第一个现任者后中止求解,更改参数然后再次调用求解,它应该如上所述从中断处继续。