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