简体   繁体   中英

Name 2D Variables CPLEX Concert Technology C++

I have a straightforward (I hope) issue that I have been grappling with all day. I am trying to name a 2D decision variable in C++ using concert technology. My model is a real life assignment problem - so I need to index my variables with the actual resource and task names in order to provide the solution to the decision makers. This is easy with OPL using tuples. However, I am confused with concert technology. I have 2 decision variables (a) a 2D variable boolean variable that indicates which resource has been assigned to which task, and (b) a 1D boolean indicator variable that indicates if a particular resource has been selected in the assignment solution. It has been straightforward to name the 1D variable. I have the following Map which holds the name of the resources and their experience levels. I use this Map to iterate the variable and name it as follows:

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));
}

So how do I do the following for the 2D variable. It is of the form Xij where i is the Resource Name and j is the Task Name. I have declared the variable as follows:

IloArray<IloNumVarArray> X;

I have another Map which indicates the fit between i & j. It is:

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.

Any ideas will be very appreciated!

I have often found it easiest to just do the naming in a separate loop over all the variables in an array, so something like (apologies for the approximate syntax):

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

Obviously the setName() calls could be folded into the loop(s) where you actually create the variables if that is more convenient

But I never use the naming of the variables to convey useful information other than for my own debugging etc. I would usually walk over the variables in my code and use the values from CPLEX to decide what to draw in a user interface, create reports etc. based on the solution

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM