我有一个直截了当(我希望)的问题,我一整天都在努力解决。我正在尝试使用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;我有另一个映射,它指示了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.任何想法都将非常感谢!
发布于 2014-09-14 00:20:31
我经常发现,最简单的方法就是在一个数组中的所有变量上用一个单独的循环来命名,就像这样(对于近似的语法很抱歉):
for (i=0; i<M; i++)
for (j=0; j<N; j++)
X[i][j].setName(resourceName[i] + "_" + taskName[j]);显然,可以将setName()调用合并到循环中,如果这样更方便的话,您可以在其中实际创建变量
但是我从来不使用变量的命名来传达有用的信息,除非用于我自己的调试等。我通常会遍历我的代码中的变量,并使用CPLEX中的值来决定在用户界面中绘制什么,基于解决方案创建报告等
https://stackoverflow.com/questions/25818364
复制相似问题