问题描述
我正在将Ilog Cplex与Visual C ++ 2015一起使用来解决我的复杂问题。如何删除所有约束?以下代码不起作用。
#include <ilconcert/ilomodel.h>
void deleteConstraints(IloModel m)
{
IloModel::Iterator iter(model);
while (iter.ok()) {
if ((*iter).asConstraint().getImpl()) {
(*iter).asConstraint().end();
}
++iter;
}
}
解决方法
并非模型迭代器找到的每个元素都是约束。例如,迭代器还将产生变量。使用(*iter).isConstraint()
可以测试它是否实际上指向约束。此外,在迭代模型时修改模型可能不是一个好主意。因此最好先收集所有约束,然后将其删除:
IloConstraintArray cons(model.getEnv());
for (IloModel::Iterator it(model); it.ok(); ++it) {
if ( (*iter).isConstraint() )
cons.add((*iter).asConstraint());
}
model.remove(cons);
cons.endElements();
cons.end();
根据创建模型的方式,在创建约束时跟踪所有约束可能会更容易。
请注意,您还可以使用IloIterator的实例来迭代创建的所有约束。如果您创建的任何约束都已提交给模型,则使用IloIterator
可以更方便地找到所有约束。