【问题标题】:CPLEX C++: How to change parameters during optimizationCPLEX C++:如何在优化期间更改参数
【发布时间】:2018-05-14 14:49:51
【问题描述】:

我正在尝试修改 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() 之后,但在它结束之前),如果可以,如何?

【问题讨论】:

    标签: c++ cplex


    【解决方案1】:

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

    答案是否定的。优化过程中不能修改参数,不支持在回调中设置参数。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 2016-03-06
      相关资源
      最近更新 更多