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

고객지원

기술문의

[Q] Callback 함수 내에서 solution value 표시

  • 박인순
  • 2002.01.18
  • 조회수 2,065
안녕하세요. CPLEX7.0 concert tech.를 사용 중인 KAIST 전자과 박인순입니다.
지난 번에 답변주셔서 감사합니다.
그런데 또 문제가 생겨서요.

일단 callback 함수는 만들었습니다.
함수 안에서 feasible solution의 값들을 저장하고 싶은데요...
cplex.getValue()라는 함수를 사용하는데,

\"0x101b352c에 있는 명령이 0x00000004의 메모리를 참조했습니다.
메모리는 written될 수 없엇습니다.\"

라는 응용 프로그램 오류 메시지가 뜨는군요...
어떻게 해야 오류 메세지 없이 solution의 값을 얻을 수 있을까요?

제가 만든 callback 함수는 다음과 같습니다.
====
#define MIPCALLBACK2(name, type1, x1, type2, x2) \\
class name : public IloCplex::MIPCallback {\\
type1 x1;\\
type2 x2;\\
public:\\
name(type1 xx1, type2 xx2) : x1(xx1), x2(xx2) {}\\
void main();\\
};\\
void name::main()

IloNum newObj, oldObj=100000;


MIPCALLBACK2(MyCallback, IloCplex, cplex, IloNumVarArray, var) {
newObj=getIncumbentObjValue();
if (oldObj>newObj){

IloInt i=1;
if ( var[i].getName() ) cout << var[i].getName() << cplex.getValue(var[i]) << endl;
oldObj=newObj;
}
}

댓글 1

  • 소경철2002-01-21
    현재 문제가 되는 예상 부분은, name class를 사용하는 부분과, callback 함수 내에서 변수의 값을 가져오는 부분입니다.

    첫번째, name class를 사용하는 부분입니다. 이 부분은 이미 ilocplex.h 파일에서 제공하고 있기 때문에, 여기서 다시 넣어줄 필요가 없습니다.
    (#include <ilcplex/ilocplex.h> 를 해주시면 됩니다.)

    callback을 사용한 예제를 하나 보여드리겠습니다.

    #include <ilcplex/ilocplex.h>
    ILOSTLBEGIN

    IloNum oldObj = 10000;
    IloNum newObj = 0;

    ILOMIPCALLBACK1(MyCallback, IloNumVarArray, vars) {

    newObj = getIncumbentObjValue();

    IloNum i = 1;
    if (oldObj > newObj) {
    cout() << \"Solution value = \" << newObj << endl;
    cout() << \"Values = \" << getIncumbentValue(vars[i])<< endl;
    cout() << \"Iterations = \" << getNiterations() << endl;
    oldObj = newObj;
    }
    }


    int main() {
    ...

    IloCplex cplex(env);
    cplex.use(MyCallback(env, vars)); // 위에 선언한 callback 함수 사용
    ...
    }


    두번째, callback 함수 내에서 변수의 값을 불러오는 과정에서 문제가 발생했을 수도 있습니다. callback 함수 내에서 미리 제공되는 멤버함수들이 많이 있기 때문 IloEnv 객체와 IloCplex 객체는 인수로 넘겨주지 않으셔도 됩니다. 따라서, 현재의 목적함수값을 가져오기 위해 사용되는 getIncumbentObjValue() 함수처럼, 현재의 변수값을 가져오기 위한 함수로 getIncumbentValue(const IloNumVar var)가 제공되고 있으니 이 함수를 사용해 보시기 바랍니다.



    :박인순님의 글입니다.

    :안녕하세요. CPLEX7.0 concert tech.를 사용 중인 KAIST 전자과 박인순입니다.
    :지난 번에 답변주셔서 감사합니다.
    :그런데 또 문제가 생겨서요.
    :
    :일단 callback 함수는 만들었습니다.
    :함수 안에서 feasible solution의 값들을 저장하고 싶은데요...
    :cplex.getValue()라는 함수를 사용하는데,
    :
    :\"0x101b352c에 있는 명령이 0x00000004의 메모리를 참조했습니다.
    :메모리는 written될 수 없엇습니다.\"
    :
    :라는 응용 프로그램 오류 메시지가 뜨는군요...
    :어떻게 해야 오류 메세지 없이 solution의 값을 얻을 수 있을까요?
    :
    :제가 만든 callback 함수는 다음과 같습니다.
    :====
    :#define MIPCALLBACK2(name, type1, x1, type2, x2) \\
    :class name : public IloCplex::MIPCallback {\\
    : type1 x1;\\
    : type2 x2;\\
    :public:\\
    : name(type1 xx1, type2 xx2) : x1(xx1), x2(xx2) {}\\
    : void main();\\
    :};\\
    :void name::main()
    :
    :IloNum newObj, oldObj=100000;
    :
    :
    :MIPCALLBACK2(MyCallback, IloCplex, cplex, IloNumVarArray, var) {
    : newObj=getIncumbentObjValue();
    : if (oldObj>newObj){
    :
    : IloInt i=1;
    : if ( var[i].getName() ) cout << var[i].getName() << cplex.getValue(var[i]) << endl;
    : oldObj=newObj;
    : }
    :}
    :
    아이콘삭제

댓글 입력