2013-03-09 31 views
0

我有形式某些尺寸約束[I1] +大小[12] +大小[I3] < = 1,這是我對一些特定索引I1,I2,I3添加由如何檢查CPLEX C++中是否存在約束?

model.add(Sizes[i1] + Sizes[i2] + Sizes[i3]<=1) 

。後來我想爲所有其他索引組合添加約束條件

model.add(Sizes[k1] + Sizes[k2] + Sizes[k3]>1) 

是否有一些很好的方法可以做到這一點,檢查約束是否已經存在於模型中?

也許我可以存儲由IloModel :: add函數返回的句柄(例如,作爲ILOExtracableArray甚至IloConstraintArray?),但即使如此,我也不知道如何檢查該contrament是否已經存在。 謝謝

回答

1

我不認爲這真的是有一種簡單的方法來從CPLEX模型,這回來了。我以前不得不在幾個項目中做類似的事情,所以我在下面給出我的兩個建議。

(1)如果你知道你總是在每個約束相同數量的東西,那麼你可以創建一個結構來保存這些信息,如:

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

,然後你可以創建一個用於您添加的每個約束,並將它們保存在列表或數組中或類似內容中。 (2)如果你知道指數的可能值,那麼你可以創建一個散列碼或類似的索引。如果做得對,這也可以解決歸因於排列指標的對稱性問題 - (尺寸[a] +尺寸[b] +尺寸[c])與(尺寸[b] +尺寸[a] +尺寸[C])。

然後如上所述,您可以將散列碼保存在您添加的約束的列表或數組中。