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

고객지원

기술문의

[Q] concert tech. 사용

  • 박인순
  • 2002.01.10
  • 조회수 2,236
CPLEX7.0을 사용하고 있는 KAIST 전자과 박인순이라고 합니다.

먼저 요전의 답변 감사드립니다.
Concert tech. 을 추천해 주셔서 사용해 보려고 하는데요.
즉, 전에 질문했던 일들을 concert tech.을 사용해서 해보려구 합니다.
제가 C++에 대해 잘 몰라서 막막한 부분이 많아 다시 질문합니다.

제가 하려는 일을 정리해 보면
1. *.lp 파일을 읽는다.
2. MIP를 이용하여 optimal solution을 구한다.
3. 그 과정에서 feasible solution 이 발생할 때마다 solution을
*.lp 파일에서 사용된 변수이름과 함께 파일에 저장한다.


1. *.lp 파일을 로드하는 것은 메뉴얼의 ilomipex2.cpp에 나와 있더군요. importModel 이라는 함수가 정의 되어 있는 것 같구요...

2. Optimal solution 구하는 것은 extract(model) 후 solve() 하면 되는 거 같은데요, 이때 node select strategy 랑 display option 바꾸려면 어떻게 해야 하나요?

3. 요 부분은 전혀 감이 잡히지 않습니다. callback을 이용해야 할 것 같긴 한데 뭘 어떻게 해야 할지 잘 모르겠네요... TT
변수 이름과 값은 getName(), getValue() 라는 함수를 사용해서 얻을 수 있는 것 같은데, 맞는지 잘 모르겠습니다.

감사합니다.

댓글 5

  • 유환주2002-01-10
    :node select strategy 랑 display option 바꾸려면 어떻게 해야 하나요?
    답변:
    examples/src/ilolpex3.cpp <-- 이 예제에 Parameter 설정을 사용하는 방법이 있습니다
    예를 들면: cplex.setParam(IloCplex::BrDir, 1); // Branch up first 전략으로 설정

    :callback을 이용해야 할 것 같긴 한데 뭘 어떻게 해야 할지 잘 모르겠네요.
    답변:
    examples/src/iloadmipex1.cpp <-- 이 예제에 Callback을 사용하는 방법이 있습니다

    :변수 이름과 값은 getName(), getValue() 라는 함수를 사용해서 얻을 수 있는 것 같은데, 맞는지 잘 모르겠습니다.
    답변:
    examples/src/iloadmipex4.cpp <-- 이 예제에 Name을 사용하는 방법이 있습니다
    값의 출력은 아래와 같은 방법으로 하면 됩니다:
    env.out() << vars[0].getName() << \":\" << cplex.getValue(vars[0]) << endl;
    아이콘삭제
  • 박인순2002-01-10
    답변 감사합니다.
    질문이 몇 가지 더 있습니다.
    1. MIP로 최적화할때 나오는 feasible solution들을
    체크하려면 어떤 callback 함수를 써야 하는지요?
    2. callback 함수 내에서 다음과 같은 걸 사용하려면 어떤 인자를 넘겨줘야 하나요?
    env.out() << vars[0].getName() << \":\" << cplex.getValue(vars[0]) << endl;



    :유환주님의 글입니다.

    ::node select strategy 랑 display option 바꾸려면 어떻게 해야 하나요?
    :답변:
    :examples/src/ilolpex3.cpp <-- 이 예제에 Parameter 설정을 사용하는 방법이 있습니다
    :예를 들면: cplex.setParam(IloCplex::BrDir, 1); // Branch up first 전략으로 설정
    :
    ::callback을 이용해야 할 것 같긴 한데 뭘 어떻게 해야 할지 잘 모르겠네요.
    :답변:
    :examples/src/iloadmipex1.cpp <-- 이 예제에 Callback을 사용하는 방법이 있습니다
    :
    ::변수 이름과 값은 getName(), getValue() 라는 함수를 사용해서 얻을 수 있는 것 같은데, 맞는지 잘 모르겠습니다.
    :답변:
    :examples/src/iloadmipex4.cpp <-- 이 예제에 Name을 사용하는 방법이 있습니다
    :값의 출력은 아래와 같은 방법으로 하면 됩니다:
    :env.out() << vars[0].getName() << \":\" << cplex.getValue(vars[0]) << endl;
    아이콘삭제
  • 소경철2002-01-11
    1. MIP으로 최적화할 때는 B&B가 동작하게 됩니다. 따라서 탐색과정의 모든 정보를 화면에 보여지게 할 수도 있는 거죠. (이 주기는 user가 조정할 수 있습니다.) 일정한 주기마다 정보를 보여주면서 탐색을 진행하다가 정수해를 찾게 되면 그 때의 정보도 보여주게 되어 있습니다. 이 해들이 모두 Feasible Solution이 되겠죠..^^
    (예: cplex.setParam(IloCplex::MIPInterval, 50); => 50번의 iteration마다 정보를 화면에 보여주는 예입니다.)
    또한, MIP을 사용할때 Callback을 사용해서 어떤 제어를 하시고 싶으시다면, ILOMIPCALLBACK() 함수를 사용하시면 됩니다.

    2. Callback 함수 내에서는 IloCplex 객체를 사용할 필요없이 제공되는 함수를 사용하시면 됩니다. 즉, env.out() << vars[0].getName() << \":\" << getIncumbentValue(vars[0]) << endl; 이라고 하시면 됩니다.



    :박인순님의 글입니다.

    :답변 감사합니다.
    :질문이 몇 가지 더 있습니다.
    :1. MIP로 최적화할때 나오는 feasible solution들을
    :체크하려면 어떤 callback 함수를 써야 하는지요?
    :2. callback 함수 내에서 다음과 같은 걸 사용하려면 어떤 인자를 넘겨줘야 하나요?
    :env.out() << vars[0].getName() << \":\" << cplex.getValue(vars[0]) << endl;
    아이콘삭제
  • 박인순2002-01-12
    먼저 답변 감사드립니다.
    금방 될 것 같으면서 잘 안되는군요...
    아직 문재가 해결되지 않았습니다.
    궁금한 게 또 있어서요...

    일단 제가 하고자 하는 일을 간단히 말씀드리면...

    MIP로 최적화할 때 다음과 같이
    cplex.setParam(IloCplex::MIPDisplay, 1);
    놓고 하면, feasible solution 이 발생 할 때만 display가 이루어 집니다. 제가 하고자 하는 것은 display와 동시에 발생한 feasible solution을 저장하고자 하는 겁니다. 따라서 callback 을 이용하는데, callback 함수의
    내용은 다음과 같습니다.

    if (1. Integer feasible solution 발생) then (2. 저장)

    (질문). 위의 (1)을 정확히 어떤 걸로 채워야 할지 모르겠습니다.
    참고로 IloCplex::MIPCallback 의 멤버 함수의 isIntegerFeasible()은 \"현재까지의 integer feasible solution 발생 유무\"를 표시하더군요.결국 첫번째 feasible solution 이 발생한 이후에는 항상 true가 되어 제가 원하는 결과를 주지 못합니다.
    아이콘삭제
  • 소경철2002-01-14
    답변이 늦어서 죄송합니다.
    먼저, (1)번에 대한 판단을 하기 위해서는 getIncumbentObjValue() 함수를 이용하시면 됩니다. 이 함수가 하는 역할은 현재 시점에서 가장 좋은 정수해를 return 해주는 것입니다.

    Callback 함수 내에서, 새로운 정수해를 찾을때마다 화면에 그 때의 목적함수 값과 그때까지의 탐색횟수를 찍는 아주 간단한 프로그램의 예를 보여드리겠습니다. 여기에서, oldObj와 newObj는 callback 함수 밖에서 전역변수로 선언해야 합니다.

    newObj = getIncumbentObjValue();

    if (oldObj > newObj) {
    cout() << \"========================================\" << endl;
    cout() << \"Solution value = \" << newObj << endl;
    cout() << \"Iterations = \" << getNiterations() << endl;
    cout() << \"========================================\" << endl;
    oldObj = newObj;
    }

    이런 식으로 구성하게 되면, 새로운 정수해를 찾을 때마다 if 문 안의 내용이 실행되게 됩니다. 이 if 문안에 (2)에 해당하는 기능을 넣으시면 됩니다.


    :박인순님의 글입니다.

    :먼저 답변 감사드립니다.
    :금방 될 것 같으면서 잘 안되는군요...
    :아직 문재가 해결되지 않았습니다.
    :궁금한 게 또 있어서요...
    :
    :일단 제가 하고자 하는 일을 간단히 말씀드리면...
    :
    :MIP로 최적화할 때 다음과 같이
    :cplex.setParam(IloCplex::MIPDisplay, 1);
    :놓고 하면, feasible solution 이 발생 할 때만 display가 이루어 집니다. 제가 하고자 하는 것은 display와 동시에 발생한 feasible solution을 저장하고자 하는 겁니다. 따라서 callback 을 이용하는데, callback 함수의
    :내용은 다음과 같습니다.
    :
    :if (1. Integer feasible solution 발생) then (2. 저장)
    :
    :(질문). 위의 (1)을 정확히 어떤 걸로 채워야 할지 모르겠습니다.
    :참고로 IloCplex::MIPCallback 의 멤버 함수의 isIntegerFeasible()은 \"현재까지의 integer feasible solution 발생 유무\"를 표시하더군요.결국 첫번째 feasible solution 이 발생한 이후에는 항상 true가 되어 제가 원하는 결과를 주지 못합니다.
    :
    아이콘삭제

댓글 입력