Как клонировать объект cplex в Java? - PullRequest
0 голосов
/ 13 июля 2020

Я решаю проблему в Java с помощью библиотеки CPLEX. Я использую класс «Модель» для создания объекта CPLEX и добавления к нему переменных, целевой функции и нескольких ограничений. Это базовая c модель, и я называю ограничения «базовыми c ограничениями».

Я использую алгоритм, который в основном добавляет ограничение в «Модель» и решает его итеративно, пока не исчезнут соответствующие ограничения. можно добавить. Я называю эти ограничения «наложенными ограничениями».

Чтобы создать копию той же модели (как с базовыми c, так и с наложенными ограничениями), я использую приведенный ниже код.

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 не тот. Кажется, что проблема не с основными c ограничениями, но определенно с наложенными ограничениями. Почему это происходит и как это исправить? Любая помощь приветствуется, спасибо!

1 Ответ

0 голосов
/ 20 июля 2020

Проблема, вероятно, в том, что в моделях M и M2 у вас есть разные экземпляры переменных, и IloConstraint.copy() не может знать, какая переменная в M должна быть сопоставлена ​​с какой переменной в M2. Результат copy() по-прежнему будет ссылаться на переменные в M (а не в M2).

Я не понимаю, как вы создаете базовые ограничения c, но я думаю, вы их создаете с нуля в конструкторе Model? Это объясняет, почему вы получаете там правильные ссылки на переменные.

Чтобы обойти вашу проблему, не сохраняйте наложенные ограничения как IloConstraint. Вместо этого сохраните их как список ненулевых коэффициентов и соответствующую переменную индексы ( не объекты переменных). Таким образом, вы можете легко восстановить наложенные ограничения с правильными ссылками на переменные при клонировании модели.

...