我正在尝试使用C++ API修改Cplex在优化过程中进行分支和绑定(bind)的方式。我实际上想做的是:

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

-一旦cplex找到第一个任职者(即问题的整数解决方案),我想将此参数设置为一个(cplex.setParam(IloCplex::NodeSel, 1);),这意味着Cplex应该在树中进行最佳绑定(bind)搜索,而不是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。该文档指出:



如果找到第一个任职者后中止解决方案,请更改参数,然后再次调用解决方案,该解决方案应从上述中断处继续进行。

关于c++ - CPLEX C++:如何在优化过程中更改参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50333237/

10-11 22:23