【问题标题】:Name 2D Variables CPLEX Concert Technology C++名称 2D 变量 CPLEX Concert Technology C++
【发布时间】:2014-09-12 23:33:39
【问题描述】:

我有一个直截了当(我希望如此)的问题,我整天都在努力解决这个问题。我正在尝试使用 Concert 技术在 C++ 中命名一个 2D 决策变量。我的模型是一个现实生活中的分配问题——所以我需要用实际的资源和任务名称来索引我的变量,以便为决策者提供解决方案。使用元组的 OPL 很容易做到这一点。但是,我对音乐会技术感到困惑。我有 2 个决策变量(a)一个 2D 变量布尔变量,指示哪个资源已分配给哪个任务,以及(b)一个 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.

任何想法将不胜感激!

【问题讨论】:

    标签: c++ mathematical-optimization cplex


    【解决方案1】:

    我经常发现在一个单独的循环中对数组中的所有变量进行命名是最简单的,所以类似于(为近似语法道歉):

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

    显然 setName() 调用可以折叠到你实际创建变量的循环中,如果这样更方便的话

    但是我从不使用变量的命名来传达有用的信息,而不是用于我自己的调试等。我通常会遍历我的代码中的变量并使用来自 CPLEX 的值来决定在用户​​界面中绘制什么,根据解决方案创建报告等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多