2014-09-12 3 views
0

나는 하루 종일 갈고 섰다. 콘서트 기술을 사용하여 C++에서 2D 결정 변수의 이름을 지정하려고합니다. 내 모델은 실생활 할당 문제입니다. 따라서 의사 결정자에게 솔루션을 제공하기 위해 실제 자원 및 작업 이름으로 변수를 색인해야합니다. 튜플을 사용하는 OPL에서는 쉽습니다. 그러나 나는 콘서트 기술과 혼동을 느낀다. 나는 2 개의 결정 변수 (a) 어떤 자원이 어떤 작업에 할당되었는지를 가리키는 2 차원 변수 부울 변수와 (b) 할당 솔루션에서 특정 자원이 선택되었는지를 나타내는 1D 부울 지시자 변수를 가진다. 1D 변수의 이름을 지정하는 것이 쉽습니다. 나는 자원의 이름과 그들의 경험 수준을 보유하고있는 다음지도를 가지고있다. 이 맵을 사용하여 변수를 반복하고 다음과 같이 이름을 지정합니다.이름 2D 변수 CPLEX 콘서트 기술 C++

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; 

난 내가 & 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. 

모든 아이디어는 매우 감사하겠습니다!

답변

0

나는 종종 배열에있는 모든 변수를 통해 별도의 루프에서 이름을 바로하는 것이 가장 쉬운 방법을 발견, 그래서 (대략적인 구문에 대한 사과)과 같은 한 :

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

에서는 setName() 호출이 더 편리하면 변수를 실제로 만들 루프 (들)에 접힐 수 있습니다.

그러나 내 자신의 디버깅 이외에 유용한 정보를 전달하기 위해 변수의 이름을 사용하지 않습니다. 내 코드의 변수를 비교하고 CPLEX의 값을 사용하여 사용자 인터페이스에서 무엇을 그리는 지 결정합니다. creat 전자 리포트 등을 기반으로 솔루션