[英]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 时的结果是不一样的。 基本约束似乎没有问题,但施加的约束肯定有问题。 为什么会发生这种情况,我该如何解决? 非常感谢任何帮助,谢谢!
问题可能是在模型M
和M2
中,您有不同的变量实例,并且IloConstraint.copy()
无法知道M
中的哪个变量必须映射到M2
中的哪个变量。 copy()
的结果仍将引用M
中的变量(而不是M2
中的变量)。
我看不出你是如何构造基本约束的,但我猜你是在Model
构造函数中从头开始构造它们的? 这可以解释为什么你在那里得到正确的变量引用。
要解决您的问题,请不要将施加的约束存储为IloConstraint
。 而是将它们存储为非零系数列表和相应的变量索引(不是变量对象)。 这样,您可以在克隆 model 时使用正确的变量引用轻松重建施加的约束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.