CPLEX+Java 中的目标和回调:非线性预处理
Goals and Callbacks in CPLEX+Java: Nonlinear Pre-processing
我有一个问题,我想在 CPLEX 中插入新的解决方案。最初,我使用启发式回调来完成此操作。这里的问题是忽略了以下内容:
model.setParam(IloCplex.Param.Preprocessing.Linear,1);
(我知道这是因为控制回调)。问题是:非线性预处理会帮助我降低成本的下限(否则,我无法证明最优性)。
我在网上做了一些研究,发现我也可以使用目标添加解决方案,特别是解决方案目标。
我现在使用解决方案目标,简而言之如下:
private class InsertSolution2 extends IloCplex.Goal {
@Override
public IloCplex.Goal execute(IloCplex iloCplex) throws IloException {
if (nextSolution != null) {
System.out.println("In Solution Goal: Next Solution Exists");
//inject solution
//set values for vars and vals
nextSolution = null;
return cplex.solutionGoal(vars, vals);
}
return null;
}
}
然后我将其添加到 cplex.solve(new InsertSolution2())
这给了我一些问题(但我是一个有目标的完全初学者......)
- 以上是否正确?
- 后台是怎么实现的?它仍然忽略了预处理......是否有允许非线性预处理的替代方法?
- 这是否与启动解决方案冲突?我的开始解决方案现在被忽略了...
谢谢!
莱拉
我认为使用目标不会对您有所帮助。目标是使用回调实现的,所以没有什么是你不能用回调实现的目标。
但是,您可以尝试使用新的通用回调框架,而不是使用启发式回调来注入可行的解决方案。该框架旨在克服您描述的问题。例如,在此框架中,您可以从那里激活 GLOBAL_PROGRESS
上下文和 post 启发式解决方案。有关如何在树搜索期间从通用回调中注入可行解决方案的示例,请参阅 CPLEX 附带的 AdMIPex9.java
示例。
我有一个问题,我想在 CPLEX 中插入新的解决方案。最初,我使用启发式回调来完成此操作。这里的问题是忽略了以下内容:
model.setParam(IloCplex.Param.Preprocessing.Linear,1);
(我知道这是因为控制回调)。问题是:非线性预处理会帮助我降低成本的下限(否则,我无法证明最优性)。
我在网上做了一些研究,发现我也可以使用目标添加解决方案,特别是解决方案目标。
我现在使用解决方案目标,简而言之如下:
private class InsertSolution2 extends IloCplex.Goal {
@Override
public IloCplex.Goal execute(IloCplex iloCplex) throws IloException {
if (nextSolution != null) {
System.out.println("In Solution Goal: Next Solution Exists");
//inject solution
//set values for vars and vals
nextSolution = null;
return cplex.solutionGoal(vars, vals);
}
return null;
}
}
然后我将其添加到 cplex.solve(new InsertSolution2())
这给了我一些问题(但我是一个有目标的完全初学者......)
- 以上是否正确?
- 后台是怎么实现的?它仍然忽略了预处理......是否有允许非线性预处理的替代方法?
- 这是否与启动解决方案冲突?我的开始解决方案现在被忽略了...
谢谢! 莱拉
我认为使用目标不会对您有所帮助。目标是使用回调实现的,所以没有什么是你不能用回调实现的目标。
但是,您可以尝试使用新的通用回调框架,而不是使用启发式回调来注入可行的解决方案。该框架旨在克服您描述的问题。例如,在此框架中,您可以从那里激活 GLOBAL_PROGRESS
上下文和 post 启发式解决方案。有关如何在树搜索期间从通用回调中注入可行解决方案的示例,请参阅 CPLEX 附带的 AdMIPex9.java
示例。