주메뉴 바로가기 본문 바로가기 하단 바로가기

고객지원

기술문의

IloIntVarArray 선언 및 초기화 문의드립니다.

  • 김주범
  • 2012.09.27
  • 조회수 1,963
안녕하세요.
이제 곧 추석이네요. 넉넉한 추석연휴 되시길 바랍니다.

다름이 아니고, 배열 선언하는데 궁금한 점이 있어 문의드립니다.

concert를 사용하고 있는데요. 구현하고자 하는 것은
3차원 배열을 선언(ex, IloIntVarArray 형태)하고, 이 배열은 0과 1의 값만 가집니다.
초기화 값에는 0으로 셋팅하고 계산이 끝난후에 해당되는 배열에 1의 값이 셋팅됩니다.

구현한 코드가 다음과 같습니다.
typedef IloArray <IloIntVarArray> IloIntVarArray2;
typedef IloArray <IloIntVarArray2> IloIntVarArray3;
typedef IloArray <IloIntVarArray3> IloIntVarArray4;

IloIntVarArray3 bx(env, numDCs);
for(IloInt ibx=0; ibx < numDCs; ibx++){
bx[ibx] = IloIntVarArray2(env, numServices);
for(IloInt jbx=0; jbx < numServices; jbx++){
bx[ibx][jbx] = IloIntVarArray(env, K);
for(IloInt kbx=0; kbx < K; kbx++){
bx[ibx][jbx][kbx] = IloIntVar(env, 0, 1);
}
}
}

bx라는 이름의 IloIntVarArray3입니다. numDCs, numServices, K 는 배열의 크기를 나타내는 상수입니다.
[질문1] bx[ibx][jbx][kbx] = IloIntVar(env, 0, 1); => 이렇게 하면 bx 배열에 처음에 0의 값이 셋팅되는건지요?

[질문2] 0으로 초기화가 잘 됐는지 값을 확인하고자 아래와 같이 하면 에러가 납니다. 어떻게 수정해야하는지요?

for(IloInt i=0; i<numServices; i++){
equationfile << " BX[" << setw(3) << i << "] :";
for(IloInt j=0; j<numDCs; j++){
for(IloInt k=0; k < K; k++){
equationfile << " " << cplex.getValue(bx[j][i][k]);
}
equationfile << setw(3);
}
equationfile << endl;
}

[질문3] 어짜피 0과 1의 값만 가지므로 차라리 IloBoolVarArray 형태로 하는 것이 나을까요? 만약 이렇게 바꿀경우 초기값을 0으로 셋팅하고 싶으면 어떻게 해야하는지요?

추석연휴 앞두고 질문을 드려 죄송합니다.
이번주까지 일을 끝내야 되는데 진도가 안 나가네요. 바쁘시더라도 빠른 답변을 주시면 대단히 감사하겠습니다.
감사합니다.

댓글 4

  • 이병기2012-09-27
    안녕하세요.
    KSTEC 이병기입니다.

    최적화모형에서 결정변수를 의미하는 IloIntVar 등은 초기값을 지정할 수 없습니다.
    CPLEX에서의 결정변수는 초기 선언 시에 범위(domain)를 가지게 되며,
    CPLEX에서 문제를 풀고 나면(solve) 최적의 값으로 결정됩니다.

    [질문1] IloIntVar(env, 0, 1) 은 0과 1 사이의 정수값을 가질 수 있는 결정변수의 선언이므로,
    0으로 setting되는 것이 아니라 [0, 1]의 범위가 지정됩니다.

    [질문2] 먼저 j에 대한 for 구문이 잘못된 것으로 보이고,
    결정변수로 선언된 bx의 값을 solve 이후에 출력하고자 하는 것인지 잘 모르겠습니다.
    cplex.getValue는 cplex.solve() 로 문제를 풀고 난 이후 결정변수의 값이 지정된 이후에 사용할 수 있습니다.
    따라서, solve 이전에 getValue를 쓰신 것이면 error가 발생됩니다.

    [질문3] 0과 1사이의 정수변수에 대한 선언은 BoolVar를 사용하셔도 상관없습니다.
    그러나 답변드린 바와 같이 결정변수에 초기값을 지정할 수는 없습니다.
    다만, 결정변수가 변하지 않도록 한다면 IloIntVar(env, 0, 0)과 같이 아예 범위를 제한하여 선언하거나,
    최적화모형 상에서 결정변수의 값을 제한 또는 지정하는 제약식을 추가할 수 있습니다.

    cplex에서의 결정변수는 일반적으로 프로그래밍에서 사용되는 변수와는 개념이 다릅니다.
    초기값을 부여하고, cplex.solve가 아닌 어떤 과정 이후에 값이 변경되는 개념이라면,
    일반적인 프로그래밍의 변수와 같이 IloInt와 같은 변수로 선언하여 사용하실 수 있습니다.

    풍성하고 즐거운 한가위 보내시길 바랍니다.
    감사합니다.
    아이콘삭제
  • 김주범2012-09-27
    빠른 답변에 감사드립니다.
    한가지 더 질문드립니다.

    cplex.solve()로 문제를 풀고난 후에 bx[][][] 값이 0 or 1 값만을 가집니다. (True or False 처럼요).
    그렇다면 아래 코드에서 마지막줄에 IloIntVar(env, 0, 1) 부분을 IloBoolVar(env, 0, 1)로 수정하면 되는건지요?

    IloIntVarArray3 bx(env, numDCs);
    for(IloInt ibx=0; ibx < numDCs; ibx++){
    bx[ibx] = IloIntVarArray2(env, numServices);
    for(IloInt jbx=0; jbx < numServices; jbx++){
    bx[ibx][jbx] = IloIntVarArray(env, K);
    for(IloInt kbx=0; kbx < K; kbx++){
    bx[ibx][jbx][kbx] = IloIntVar(env, 0, 1);

    감사합니다.
    아이콘삭제
  • 이병기2012-09-27
    안녕하세요.
    KSTEC 이병기입니다.

    [0, 1]의 정수형 결정변수의 선언은 아래d의 형태가 모두 동일하게 사용 가능합니다.

    IloNumVar(env, 0, 1, ILOINT)
    IloNumVar(env, 0.0, 1.0, ILOBOOL)
    IloIntVar(env, 0, 1)
    IloBoolVar(env)

    모두 동일한 의미이며, 사용되는 class의 차이만 있을 뿐입니다.
    (IloBoolVar는 IloIntVar에서 파생된 class입니다.)
    어떤 형태를 사용하셔도 상관없습니다.

    감사합니다.
    아이콘삭제
  • 김주범2012-09-28
    감사합니다.
    즐거운 추석 되세요.
    아이콘삭제

댓글 입력