繁体   English   中英

如何在 Java 中克隆一个 cplex object?

[英]How to clone a cplex object in Java?

我正在使用 CPLEX 库解决 Java 中的一个问题。 我使用 class“模型”来创建 CPLEX object,并向其添加变量、目标 function 和多个约束。 这是基本的 model,我将约束称为“基本约束”。

我使用一种算法,该算法基本上将约束添加到“模型”并迭代求解,直到无法添加更多相关约束。 我将这些约束称为“强加约束”。

要创建相同 model 的副本(具有基本约束和强制约束),我使用下面的代码。

private Model duplicate(Model M) throws IloException {
        Model M2 = new Model(Q,k,dep,dLoc,N,cus,cLoc,D,lD,eps);     \\create cplex object, variables, basic constraints, objective function
        ArrayList<IloRange> constraints = M.getImposedConstraints(); \\list of imposed constraints
        IloCopyManager copymanager = new IloCopyManager(M.getCplex());
        Iterator iter = (Iterator) M.getCplex().rangeIterator();
        while (iter.hasNext()) {
            IloRange c = (IloRange) iter.next();
            M2.imposeConstraint((IloRange)c.makeCopy(copymanager));
        }
        return M2;
    }

但是,无法正确复制 Model。 施加的约束不一样(我认为这可能是因为变量引用似乎发生了变化?),因此求解模型 M 和 M2 时的结果是不一样的。 基本约束似乎没有问题,但施加的约束肯定有问题。 为什么会发生这种情况,我该如何解决? 非常感谢任何帮助,谢谢!

问题可能是在模型MM2中,您有不同的变量实例,并且IloConstraint.copy()无法知道M中的哪个变量必须映射到M2中的哪个变量。 copy()的结果仍将引用M中的变量(而不是M2中的变量)。

我看不出你是如何构造基本约束的,但我猜你是在Model构造函数中从头开始构造它们的? 这可以解释为什么你在那里得到正确的变量引用。

要解决您的问题,请不要将施加的约束存储为IloConstraint 而是将它们存储为非零系数列表和相应的变量索引不是变量对象)。 这样,您可以在克隆 model 时使用正确的变量引用轻松重建施加的约束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM