如何检查CPLEX C ++中是否已存在约束?

时间:2013-03-09 06:18:11

标签: c++ linear-programming cplex

我有一些形式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 个答案:

答案 0 :(得分:1)

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

(1)如果您知道每个约束中的内容总是相同,那么您可以创建一个结构来保存该信息,例如:

    class tuple{
      public int index1;
      public int index2;
      public int index3;
    }

然后你可以为你添加的每个约束创建一个,并将它们保存在列表或数组或类似的中。

(2)如果你知道索引的可能值,那么也许你可以从索引创建一个哈希码或类似的东西。如果做得好,这也可以解决由于置换索引引起的对称问题 - (尺寸[a] +尺寸[b] +尺寸[c])与(尺寸[b] +尺寸[a] +尺寸相同) [C])。

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