2014-09-12 64 views
0

我有一個直截了當(我希望)的問題,我一直在努力整天。我試圖用音樂會技術在C++中命名2D決策變量。我的模型是一個真正的人生分配問題 - 所以我需要將我的變量與實際的資源和任務名稱進行索引,以便爲決策者提供解決方案。 OPL使用元組很容易。但是,我對音樂會技術感到困惑。我有2個決策變量(a)一個二維變量布爾變量,用於指示哪個資源已分配給哪個任務,以及(b)一維布爾指示符變量,用於指示是否在分配解決方案中選擇了特定資源。 命名1D變量已經很簡單。我有以下地圖,其中包含資源名稱和經驗級別。我用這個Map來迭代變量並將其命名如下:名稱二維變量CPLEX Concert技術C++

map<string, string> Map;  // The first string holds the name and the second string the experience level 
IloNumVarArray Y(env);  // My 1D variable 



map<string, string>::iterator Name;  // Iterator for the Map 



for (Name = Map.begin(); Name != Map.end(); Name++) 
{ 
       string getName = Name->first; 
       char convertedName[100]; 
       strcpy_s(convertedName, getName.c_str()); 
       Y.add(IloNumVar(env, 0, 1, ILOINT, convertedName)); 
} 

那麼我該如何爲2D變量做如下操作。它的形式是Xij,其中i是資源名稱,j是任務名稱。我已經聲明的變量如下:

IloArray<IloNumVarArray> X; 

我還有一個地圖這表明我&Ĵ之間的配合。它是:

Map<string, map<string, float>> fitMap; //first string is the resource name, second string is the` task name and the float is the fit value. 

任何想法將不勝感激!

回答

0

我常常發現它簡單的方法就是做命名的數組中的所有變量不同的循環,所以像(道歉近似語法):

for (i=0; i<M; i++) 
    for (j=0; j<N; j++) 
     X[i][j].setName(resourceName[i] + "_" + taskName[j]); 

顯然的setName()調用可以被摺疊到循環中,如果這更方便您實際創建變量

但我從來沒有使用變量的命名傳達有用的信息,而不是我自己的調試等。我通常會走路覆蓋我的代碼中的變量,並使用CPLEX中的值決定在用戶​​界面creat中繪製什麼e報告等基於解決方案