【问题标题】:How to clone a cplex object in Java?如何在 Java 中克隆 cplex 对象?
【发布时间】:2020-07-13 06:56:16
【问题描述】:

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

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

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

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;
    }

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

【问题讨论】:

    标签: java optimization linear-programming cplex integer-programming


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      相关资源
      最近更新 更多