我有一个直截了当的(我希望如此)问题,我一整天都在努力解决这个问题。我正在尝试使用 Concert 技术在 C++ 中命名一个 2D 决策变量。我的模型是一个现实生活中的分配问题——所以我需要用实际的资源和任务名称来索引我的变量,以便为决策者提供解决方案。这对于使用元组的 OPL 来说很容易。但是,我对音乐会技术感到困惑。我有 2 个决策变量 (a) 一个二维变量 bool 变量,指示哪个资源已分配给哪个任务,以及 (b) 一个一维 bool 指示变量,指示是否在分配解决方案中选择了特定资源。 命名一维变量很简单。我有以下 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;
我有另一个 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 中的值来决定在用户界面中绘制什么,根据解决方案创建报告等
关于c++ - 命名二维变量 CPLEX Concert Technology C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25818364/