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

고객지원

기술문의

Conflict refiner를 java로 구현시에...

  • 이병권
  • 2009.03.26
  • 조회수 2,030
안녕하십니까..
밑에 답글을 달고 바로 질문을 올리네요. ^^

모델을 하나 검증할게 있어 conflict refiner를 시용하려고 합니다. 막상 manual을 찾아보고 하려니 답답한 부분이 있군요.

refineConflict(IloConstraint[] cons, double[] d);

위 메소드를 사용하려고 하는데, cons[]에는 모델링에서 사용된 constraint를 모두 집어넣는 것으로 보입니다.
보통 constraint들이 loop문 안에서 정의되어 model에 삽입되는데요...C++에서는 IloConstraint가 class로 되어 있으니 add 멤버메소드를 이용해서 constraint 하나하나를 cons[]에 집어넣으면 문제될것이 없는데, java에서는 IloConstraint가 interface로 정의되어 있더군요..

흠... IloLinearNumExpr의 경우에는 interface로 정의되어 있지만
IloLinearNumExpr expr = cplex.linearNumExpr();
로 초기화(?)하고 expr.addTerm()해서 사용하면 되는데, IloConstraint는 그것도 안되고.. 어떻게 초기화(?)해서 사용해야 할지 모르겠습니다.

요약하면, loop문 안에서 제약조건들을 하나씩 cons[]에 집어넣어야 할듯한데, cons[]를 어떻게 초기화(?)하고 constraint를 삽입하는지 모르겠습니다.


p.s... 혹시 제가 refineConflict 메소드의 용법을 잘못 이해한 것을수도 있겠군요.ㅋ.. 이해가 잘못되었다 하더라도 IloConstraint의 사용방법은 궁금하네요. (^^)

댓글 4

  • 이보헌2009-03-27
    refineConflict 에는 IloConstraint []와 IloConstraint의 하위 객체인 IloRange []등이 들어갈 수 있습니다.

    질문은 IloConstraint의 생성이 끝날때 까지 크기를 알 수 없기 때문에 IloConstraint []의 사이즈를 결정하기 어려워 생기는 문제로 보입니다.

    1. IloConstraint의 size를 알 수 없을경우, java.util에서 제공하는 arraylist를 사용할 수 있습니다.
    import java.util.*;
    를 사용하여, array에 객체를 add 할 수 있습니다.

    2. cplex 객체에서 IloConstraint []를 cplex.getNRows() 함수를 사용하여 호출 할 수 있습니다.

    cplex가 설치된 폴더에 java를 사용한 예제들이 있습니다.
    참고해보시면 도움이 많이 되실듯 합니다.
    예)C:\ILOG\CPLEX111\examples\src
    아이콘삭제
  • 이병권2009-03-27
    질문을 깔끔하게 드렸어야 했는데. ^^.. 죄송합니다.
    질문도 실력이라던데.ㅋㅋ 부족합니다.
    :
    :
    :

    말씀하신 방법도 생각해 보았습니다.
    (cplex.getNrows() 메소드는 제약의 개수를 호출하는 것으로 압니다.)

    arraylist를 사용하면 하나씩 add하는데는 문제가 없지만 여전히 refineConflict 메소드를 호출하려면 인자값에 IloConstraint[]가 있어야 하는것으로 압니다.^^

    작성한 코드를 보여드리면..

    ArrayList [IloConstraint] rowList = new ArrayList [IloConstraint] ();
    를 이용해서 제약조건들을 추가할 수 있지만...(꺽쇠괄호가 안돼네요.. ㅠ.ㅠ)

    IloConstraint[] cons;

    for (int i=0; i<rowList.size(); i++) {
    cons[i] = rowList.get(i);
    }

    해야 하는데.... cons[]가 초기화되어 있지 않으면 exception이 당연히 발생하겠지요..ㅎ~

    cons[]의 초기화는 어떻게 하면 될런지요? (^^)

    :
    :
    예제들은 다 보고 질문 올렸습니다만.. 찾진 못했습니다.ㅎㅎ. 혹시 어느 예제인지 알려주시겠습니까?
    아이콘삭제
  • 이보헌2009-03-27
    설명이 충분하지 못했던것 같습니다.
    아래 방식으로 해 보시고 의문이 있으시면 다시 연락 주시기 바랍니다.

    1. arrayList를 refineConflict 의 인수로 직접 사용 할 수는 없습니다. arrayList를 사용하여 저장된 제약들을 IloConstraint[]에 복사한 후 사용하셔야 합니다. 방식은 아래 2번과 유사합니다.
    예)ArrayList array = new ArrayList();
    while() {array.add(제약);}
    IloConstraint[] cons = new IloConstraint[array.size()];
    for() { cons[i] = (IloConstraint)array.get(i); }


    2. cplex.getNrows()를 사용하여 다음과 같은 방식으로 cplex에 모든 제약이 생성된 후에 제약의 size를 호출 할 수 있습니다.
    IloConstraint[] cons = new IloConstraint[cplex.getNrows()];
    for (Iterator conit = cplex.rangeIterator(); conitt.hasNext(); ++i1) {
    cons[i1] = (IloConstraint)conit.next();
    }
    cplex.refineConflict(cons, DoubleArray);


    refineConflict를 사용하는 예제는 없습니다.
    동일하지는 않더라도 참고하시면 문제 풀이나 표현방식에 도움을 주는 예제들이 많이 있다는 의미였습니다. ^^
    아이콘삭제
  • 이병권2009-03-31
    고맙습니다. ^^;;;
    아이콘삭제

댓글 입력