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

고객지원

기술문의

수식관련 문의드립니다.

  • 이태진
  • 2013.08.27
  • 조회수 1,188
일전에 min max관련해서 문의드린 학생입니다.

염치없는 질문에도 불구하고 잘 알려주셔서
구현해서 원하는 수식을 얻었는데...

이상하게도 제가 원하는 목적값이 나오지 않아
이렇게 한번 더 문의드립니다.

첨부로 드리는 것을 보시면 아시겠지만
제가 원하는 값은 목적식에서 각각의 배가
이동한 거리(시간) 중 최대 값을 선택하는 것인데
지금은 단순히 각각의 배가 움직인 거리(시간)가
합쳐지게 되어 더 많은 배를 사용하여도
시간이 증가 할 뿐입니다.

갑작스러운 설명과 문의이고
기술적인 문제가 아닐 수도 있지만
도움 받을 곳이 없어 안타까운 마음에 문의드립니다.

바쁘시겠지만, 한번만 고려해 주시길 부탁드립니다.

혹시나 하여 메일 주소 남깁니다.
숫자로 시작하는 메일주소가 기입되지 않아
다른 메일 주소를 남겨서...^^;
82bone82@naver.com 다운로드아이콘교수님.zip

댓글 9

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


    1. 목적식 오류

    minimize max(i, j in N)
    ((sum(i, j in N) D[i][j] * x[i][j][1])/v[1])
    + ((sum(i, j in N) D[i][j] * x[i][j][2])/v[2])
    + ((sum(i, j in N) D[i][j] * x[i][j][3])/v[3]); // (1)


    모든 i,j에 대하여 D[i][j]*x[i][j] 값을 이미 합한 상태입니다. (모든 배에 대한 이동거리의 합)
    i, j에 해당하는 값중에서 max값을 찾을 수 없는 상태이기 때문에, 위 구문에서는 max가 의미없습니다.

    i,j는 노드(전체 set : N), s는 배(전체 set : S)를 나타내는 index라면

    minimize max(s in S) ((sum(i, j in N) D[i][j] * x[i][j][s])/v[s]) ;

    로 표현하여야 각 배들의 총 이동거리 중 최대값을 최소화 하는 형태가 됩니다.
    위 두 수식에 대하여 직접 계산해 보시면 명확해 질 것입니다.
    정확한 목적식의 의미와 표현법을 확인해 보시기 바랍니다.

    2. 제약식 오류

    // subtour elimination constraints
    forall(i,j in N_I, s in S)
    pi[i]-pi[j] + T*(sum(s in S) x[i][j][s]) <= T-1; // (7)

    index 사용에 오류가 있습니다.
    forall(i,j in N_I, s in S) 에서 각 i, j, s 에 대한 제약식을 선언하는데,
    실제 제약식에서는 sum(s in S) x[i][j][s] 로 s에 대한 모든 합을 하여, 더이상 s index 값이 존재하지 않는 상태입니다.

    두 곳 중 한곳에서 s index를 사용하지 않아야 합니다.
    정확한 제약식의 의미를 확인해 보셔야 합니다.

    이상입니다.
    감사합니다.
    아이콘삭제
  • 이태진2013-08-27
    ^^

    너무 감사드립니다...

    말씀하신대로 해보도록 하겠습니다~~!!

    ^^
    아이콘삭제
  • 이태진2013-08-27
    말씀해 주신대로 수정해서 해결되었습니다.

    추가로 하나만 더 문의드리겠습니다.

    포기하고 있었던 것인데, 도우심에 감사해서

    힘을내어 하나 더 해 보려고 하는 것인데...

    파일로 드린 것 중에서

    모든 소해함은 Depot에서 출발

    이라는 제약식이 있습니다.

    보시다시피 '//'를 제거하고 수식을 확인하면

    오류가 생겨서 사용하지 못하고 있었습니다.

    이 부분에 대한 오류를 해결 못해서

    안타가워하고 있는데...

    한번만 더 부탁드립니다^^;
    아이콘삭제
  • 이병기2013-08-28
    안녕하세요.
    KSTEC 이병기입니다.

    // 모든 소해함은 Depot에서 출발
    // forall(s in S)
    // sum(j in N_I) x[0][j][s] == 1; // (13)

    위 제약식에서 사용되는 결정변수 x는 아래와 같이 선언된 상태이고 사용되는 index set N은 a~l의 영문 string입니다.

    dvar boolean x[N][N][S]; // if ship ‘s’ moves i to j, then 1, else 0 소해함 운행에 관한 결정변수

    따라서 결정변수는 x[a][a][1] ~ x[l][l][3] 으로 나타나는데, 0은 index set N에 존재하지 않기 때문에 에러가 발생합니다.

    이상입니다.
    감사합니다.
    아이콘삭제
  • 이태진2013-08-28
    // 모든 소해함은 Depot에서 출발
    // forall(s in S)
    // sum(j in N_I) x[0][j][s] == 1; // (13)

    말씀하신 내용 잘 이해하였습니다.

    forall(s in S, i ==a)
    sum(i in N, j in N_I) x[i][j][s] == 1;

    이런식으로 입력을 해 보았는데...
    오류가 나서 해결하지 못하고 있습니다.
    모든 i,j에 대해서 합을 하는데
    i는 말씀하신대로 string이니
    출발점인 a라는 것을 인식하게 하고 싶은데
    너무도 부족한 지식에 또 막히고 있습니다.

    ^^;

    ※ 도와주신 덕분에 큰 문제들 잘해결하였습니다.
    또 다른 프로그램으로 휴리스틱 코딩해야하지만
    optimal sol'은 덕분에 잘 찾았습니다.
    너무 감사드립니다.
    아이콘삭제
  • 이병기2013-08-28
    forall에 사용할 index set을 추가 지정하고 조건으로 a인 경우에만 제약이 생성되도록 하는 방법이 있습니다.

    forall(s in S, i in N : i == a) sum(j in N_I) x[i][j][s] == 1;
    아이콘삭제
  • 이태진2013-08-28
    forall에 사용할 index set을 추가 지정한다는 것이
    declation 부분에서 set 지정하는 부분에
    'a'라는 것을 추가로 지정한다는 것인가요?

    당연하겠지만 알려주신 제약식을 입력해보면
    이름 'a'가 없다고 오류가 나오는데...

    set 지정하는 법을 한번 더 알려주시면 감사하겠습니다~

    너무 모르는 사람이 모든 것을 아는 분께 문의드리는 듯
    하여 죄송하네요^^;
    아이콘삭제
  • 이병기2013-09-05
    set 지정후에 조건에서 string data에 대한 비교이므로 ''를 붙이셔야 합니다.

    forall(s in S, i in N : i == 'a') sum(j in N_I) x[i][j][s] == 1;
    아이콘삭제
  • 이태진2013-09-05
    끝까지 도와 주셔서 감사드립니다...^^!

    작은 건데 스스로 하지 못하네요^^:
    아이콘삭제

댓글 입력