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

고객지원

기술문의

IloNumVarArray의 중첩사용에 의한 에러

  • 정재헌
  • 2006.03.06
  • 조회수 1,105
IloNumVarArray의 4차원 중첩사용에 의해 결정변수를 구성하고, 모델을 수립하여 해를 구할려고 하였으나, 다음과 같은 이상한 에러가 발생하엿읍니다.
각 k에 대해 v+= 1.0*xxx[k][r][i][j]를 r,i,j에 대해 루프를 통해 반복 적용하여 유일한 제약식 model.add(v==1.0);을 이용하였읍니다. 그런데, 나중에 모델을 체크해보면, xxx[k][r][i][j]의 coefficent가 일부에서 1.0이 아니라 2로 바뀌어 있는 것을 확인해볼 수 잇읍니다. 뿐만 아니라, 목적항의 coefficent도 일부의 동일한 결정변수에 대해 이상하게 변해 잇는 것을 확인할 수 있었읍니다.

trace를 위해 폴드를 압축하여 첨부합니다. 참고로 모든 코딩은 MS 비쥬얼 C++로 되어 있으며, 목적항 및 제약식의 coefficent는 직접 파일 individual_result-2.txt로부터 읽어드리게 되어 있읍니다. 예제에 잇는 serialize() 함수를 이용하여 모델을 체크하엿읍니다. 다운로드아이콘simtest.zip

댓글 4

  • 김태현2006-03-07
    안녕하세요...

    KSTEC의 김태현 입니다..

    변수명의 설명이라든가 소스의 띄어쓰기가 되어 있지 않아 보기가 상당히 어려웠습니다..

    일단 답변부터 드리도록 하겠습니다.

    4차원 변수 생성과정에 문제가 있었습니다.

    소스 보시면, 변수 생성코드를 간단히 수정하였습니다.

    또한 Trace를 위해 변수명같은 경우, name을 달아 주시기 바랍니다.

    뿐만아니라, cplex.exportModel("LPModel.lp");의 함수를 이용하여

    모델을 출력가능합니다.

    소스를 첨부하오니 참조하시기 바랍니다.

    제품 CD에 포함되어 있는 예제나 User Manual을 정독하신후, CPLEX를 사용하시면 많은 시행착오를 줄일수 있습니다..

    또한, CPLEX 정기교육 과정이 있으니 시간이 되시면 그것을 듣는 것도 도움이 되실겁니다..
    아이콘삭제
  • 소경철2006-03-07

    보충 답변입니다.

    변수의 이름을 설정할 때는 다음과 같이 변수를 생성하는 부분에서 동시에 하는 것이 좋습니다..

    // 변수 이름 설정
    for ( k = 1; k <= P-1; k++ )
    {
    xxx[k] = NumVarCube(env, 4);
    for ( r = 1; r <= 3; r++ )
    {
    xxx[k][r] = NumVarMatrix(env, S);
    for ( i = 1; i <= S-1; i++ )
    {
    xxx[k][r][i] = IloNumVarArray(env, S);
    for ( j = 1; j <= S-1; j++ )
    {
    char name[100];
    sprintf(name, "xxx(%d,%d,%d,%d)", k, r, i, j);

    xxx[k][r][i][j] = IloNumVar(env, 0, 1, ILOINT, name);
    }
    }
    }
    }
    아이콘삭제
  • 정재헌2006-03-08
    대단히 감사합니다.
    그런데 제약식을 하나 더 추가하여 저의 모델을 풀려고 하니
    추가한 제약식에 다음과 같은 문제가 발생했읍니다.

    r=1,2,3 각각에 대하여 루프를 통해 카파 제약을 추가하였는데(model.add(CAPA>=v ); 이상의 제약식 추가 코드 참조) 마지막 r=3의 제약식이
    serialize() 함수를 돌려 나온 .XML 파일에 제대로 나오지 않은 것 같읍니다. 단순히 보이지 않는 것인가요.

    jj크기를 늘려 다시 검사해보아도, 이 세번째 제약식이 문제를 일으키는 것 같읍니다. 이를 검사해보기 위해 naming 을 시도하였으나, 이것도 잘 되지 않는군요. 파일을 첨부하니 도와주시면 대단히 감사하겠읍니다.
    아이콘삭제
  • 소경철2006-03-09
    우선... 코딩을 하실 때 들여쓰기나 띄어쓰기에 신경을 써주시기 바랍니다.
    특히 다른 사람에게 소스를 보여줄 때는 가독성이 좋아야 하지 않을까요..

    =====================================================================

    첨부한 소스에 제약 이름을 넣는 부분을 추가한 다음 LP 파일을 분석해보면 r=3인 경우에는 첫번째, 두번째 제약 모두 해당하는 변수가 없음을 알 수 있습니다.

    즉, r이 1과 2인 경우에만 제약이 생성되었다는 것을 의미하죠...

    따라서 현재의 모델은 문제가 없으며 다만 Input Data에 의해 r=3인 경우에 해당하는 변수가 없어서 제약이 생성되지 않은 것으로 보이네요...

    수정한 소스는 다시 첨부했습니다...
    아이콘삭제

댓글 입력