我正在尝试使用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/