将2D变量命名为CPLEX Concert Technology C++
Name 2D Variables CPLEX Concert Technology C++
我有一个简单的(我希望)问题,我一整天都在努力解决。我正在尝试使用concert技术在C++中命名一个2D决策变量。我的模型是一个现实生活中的分配问题,所以我需要用实际的资源和任务名称来索引我的变量,以便为决策者提供解决方案。使用元组的OPL很容易做到这一点。然而,我对音乐会技术感到困惑。我有两个决策变量(a)一个2D变量布尔变量,指示哪个资源被分配给了哪个任务;(b)一个1D布尔指示符变量,指示是否在分配解决方案中选择了特定资源。命名1D变量非常简单。我有下面的地图,里面有资源的名称和他们的经验水平。我使用这个Map来迭代变量,并将其命名如下:
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,它指示I&j.它是:
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.
任何想法都将不胜感激!
我经常发现在一个单独的循环中对数组中的所有变量进行命名是最容易的,所以类似于(对近似语法表示歉意):
for (i=0; i<M; i++)
for (j=0; j<N; j++)
X[i][j].setName(resourceName[i] + "_" + taskName[j]);
显然,如果更方便的话,setName()调用可以折叠到实际创建变量的循环中
但是,除了我自己的调试等之外,我从不使用变量的命名来传达有用的信息。我通常会遍历代码中的变量,并使用CPLEX中的值来决定在用户界面中绘制什么,创建报告等