有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

优化如何在Java中克隆cplex对象?

我正在使用CPLEX库解决Java中的一个问题。我使用一个类“Model”来创建一个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模型时,结果是不一样的。基本约束似乎没有问题,但施加的约束肯定有问题。为什么会发生这种情况,我该如何解决?非常感谢您的帮助,谢谢


共 (1) 个答案

  1. # 1 楼答案

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

    我不知道你是如何构造基本约束的,但我猜你是在Model构造函数中从头开始构造它们的?这就解释了为什么你会得到正确的变量引用

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