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

고객지원

기술문의

감사합니다.

  • 이태진
  • 2013.08.07
  • 조회수 2,742
기술문의가 아닌 수식에 관해 문의 드려 죄송합니다.

이번에 드리는 문의 역시 기술적인 부분이 아니라면

죄송합니다.

min max 를 구현하는데에 있어 오류가 나서 문의드리니

확인해 주시면 감사하겠습니다.

min max 를 수식으로 표현하는 방법은 알겠는데

cplex상에서 구현하는 법을 모르겠네요...^^: 다운로드아이콘라스트 (2).zip

댓글 1

  • 이병기2013-08-08
    안녕하세요.
    KSTEC 이병기입니다.

    mod와 dat 파일을 통해 본 문제점은 아래와 같습니다.

    1. 주석처리된 기존 목적식은 min max에 대한 목적식을 표현하고 있지 않음(sum으로 인한 단일 값에 대한 minimize 형태)
    => 아래와 같이이 표현가능합니다.
    ex.
    min-max 목적식 형태 : minimize max(i in I) (sum(j in J) x[i][j]);

    목적식과 제약식을 분리한 형태 :
    dvar float t;
    minimize t;
    subject to {
    forall(i in I) (t - sum(j in J) x[i][j]) >= 0;
    }

    2. forall이나 sum 함수에서 s index를 사용하고 있으나, s index에 해당하는 변수가 없음
    => 사용하지 않는 불필요 index를 제거해야 합니다.

    3. 주석처리되지 않는 minimize 구문(minimize t[i][j])에 i와 j index를 사용하나, index를 지정하는 부분이 없음
    => 최소화하고자 하는 값이 어떤 형태인지 짐작하기 어렵습니다. 주석처리된 목적식으로는 어떤 값들 중에서 최대값을 최소화하는지를 파악할 수 없습니다.
    mimize t 또는 minize sum(i in I, j in J) t[i][j] 형태가 가능합니다.

    4. 결정변수 t[N][N]은 boolean형이나, sum으로 된 수식은 float*boolean임
    따라서, 1 >= 1200, 0 >= 3 과 같은 경우에는 제약 위반이 발생하므로,
    0이 아닌 거리에 해당되는 결정변수 x는 모두 0으로 결정될 것입니다.
    => 역시 목적식의 정확한 의미에 따라 dvar float t[I][J] 또는 dvar float t 형태가 가능해 보입니다.

    5. 제약식에서 forall로 각 제약식을 생성하는 듯 하지만, sum으로 i,j index에 대하여 전체 합을 하고 있음
    예로 아래와 같은 제약은 sum으로 i,j index에 대하여 모두 합한 값이 R1보다 작거나 같다라는 의미이므로
    forall의 i,j index에 대한 의미가 없는 상태입니다.
    // 거리제한
    forall(i,j in N)
    sum(i,j in N) x[i][j][1] <= R1 ;
    => forall(i,j in N) x[j][j][1] <= R1 또는 sum(i,j in N) x[[i][j][1] <= R1 형태가 가능합니다.
    위 두 식은 의미하는 바가 완전히 다릅니다. 정확한 수식을 표현하는 형태를 생각하여야 합니다.

    전체적으로 수리모형을 cplex opl로 표현하는 부분에서 많은 오류가 있습니다.
    cplex에 포함된 많은 예제를 먼저 참고하셔서 표현법을 이해하시는 것이 좋겠습니다.

    이상입니다.
    감사합니다.

    아이콘삭제

댓글 입력