2012-02-16 52 views
2

我正在使用IBM CPLEX來使用C++ API建模約束程序。IBM CPLEX - 如何取回對命名變量的引用?

我已經聲明瞭一個布爾VAR陣列像這樣:

IloEnv env; 
IloBoolVarArray bVars(env); 

然後,添加3個變量的數組,併爲其指定名稱爲這樣:

bVars.add(IloBoolVar(env,"a")); 
bVars.add(IloBoolVar(env,"b")); 
bVars.add(IloBoolVar(env,"c")); 

我的問題是:

我是否需要知道該數組中變量(0,1或2)的索引以便在表達式中引用/使用該變量?

我似乎無法找到使用指定名稱「a」,「b」或「c」來引用變量的方法。

回答

1

當您對.lp文件執行「exportModel」時,將使用構造函數中變量的「名稱」。它對於交互式調試非常有用,但不適合在代碼中訪問,並且根本不需要。如果你想在表達式中使用數組的元素,那麼你需要知道索引。這不是一個關聯數組。但是,您還有其他選擇。你可以將它們分配給C++變量。

IloBoolVar a(env, "a"); 
IloBoolVar b(env, "b"); 
IloBoolVar c(env, "c"); 

IloBoolVar類型是一個實現句柄,所以如果你還需要的話,也可以將值存儲在一個數組中。

IloBoolVarArray bVars(env); 
bvars.add(a); 
bvars.add(b); 
bvars.add(c); 

在這種情況下bvars [0]和一個表示相同的變量。如果您需要按名稱隨機訪問,也可以使用std :: map或hash-table來存儲變量。

+0

我應該提到我試圖避免使用地圖名稱來節省空間。但是,如果您認爲沒有更好的出路,我可能不得不提前使用地圖。 – dhrumeel 2012-02-16 22:23:26

0

也可以這樣定義

IloBoolVarArray bvars(env , 3); 

陣列它會自動實例化3布爾變量的陣列,然後可以通過[]操作的任何數組訪問。

如果你的程序涉及很多變量,那麼使用整數索引而不是名稱會更好更容易。