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

时间:2018-05-14 14:49:51

标签: c++ cplex

我试图修改Cplex执行其分支的方式& 优化期间绑定,使用它的C ++ API。我真正想做的事情:

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

-cnce找到第一个现任者(即问题的整数解决方案),我想将此参数设置为一个(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()之后但在结束之前)修改参数的值,如果是,那么如何?

1 个答案:

答案 0 :(得分:1)

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

答案是否定的。您无法在优化期间修改参数,也不支持在回调中设置参数。

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

  

对于MIP模型,设置1(一)将导致CPLEX继续使用   部分探索MIP树(如果有)。如果树探索   尚未开始,设置1(一)指定CPLEX应使用a   加载MIP启动(如果可用)。设置2保持当前   现任(如果有的话),重新应用预解决,并开始新的   从新的根搜索。

如果您在找到第一位现任者后中止解决方案,请更改参数然后再次呼叫解决,它应该如上所述继续停止。