我有一些 Sizes[i1] + Sizes[i2] + Sizes[i3]<=1 形式的约束,我通过添加
model.add(Sizes[i1] + Sizes[i2] + Sizes[i3]<=1)
对于一些特定的索引 i1、i2、i3。稍后我想为所有其他索引组合添加约束
model.add(Sizes[k1] + Sizes[k2] + Sizes[k3]>1)
有什么好的方法可以做到这一点,例如检查约束是否已经存在于模型中?
也许我可以存储由 IloModel::add 函数返回的句柄(例如作为 ILOExtracableArray 或什至 IloConstraintArray?)但即便如此我也不知道如何检查约束是否已经存在。 谢谢
最佳答案
我不认为真的有一种简单的方法可以从复杂模型中恢复它。我以前在几个项目中不得不做类似的事情,所以我在下面给出我的两个建议。
(1) 如果您知道在每个约束中总是有相同数量的事物,那么您可以创建一个结构来保存该信息,例如:
class tuple{
public int index1;
public int index2;
public int index3;
}
然后您可以为您添加的每个约束创建一个,并将它们保存在列表或数组或类似内容中。
(2) 如果您知道索引的可能值,那么也许您可以从索引中创建哈希码或类似代码。如果做得好,这也可以解决由于排列索引而导致的对称性问题 - (Sizes[a] + Sizes[b] + Sizes[c]) 与 (Sizes[b] + Sizes[a] + Sizes [c]).
然后如上所述,您可以将哈希码保存在列表或数组中以用于您添加的约束。
关于c++ - 如何检查 CPLEX C++ 中是否已存在约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15307909/