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 示例。