0

我有一些形式 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?),但即便如此,我也不知道如何检查约束是否已经存在。谢谢

4

1 回答 1

1

我不认为真的有一种简单的方法可以从 cplex 模型中得到它。我之前不得不在几个项目中做类似的事情,所以我在下面给出我的两个建议。

(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])。

然后如上所述,您可以将哈希码保存在您添加的约束的列表或数组中。

于 2013-03-11T17:56:58.540 回答