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

고객지원

기술문의

[질문]CPLEX에서의 결정변수 추출

  • 도형호
  • 2008.10.16
  • 조회수 2,286
안녕하십니까.
CPLEX10.1버젼을 사용하여 현재 생산관리에 대한 연구를 하는 학생입니다.
MIP방식이 현재 시간이 많이 걸려서 이를 휴리스틱으로
해결방법을 찾는 연구를 하고 있는데 스킬이 낮아서 힘들어집니다.
요는 MIP를 LP로 바꾸어서 0-1 결정변수를 0 =< x =< 1
사이에서 구하게끔 하여 어떤 기준 이하의 x는 0으로
기준 이상의 x는 1로 바뀌게 하려고 하는 중인데
CPLEX를 한번 돌려서 나온 결정변수 x를 결정되어지고 난 후 C++로 리턴받는 함수를 모르겠습니다.
제 표현방식이 짧아서 전달이 잘 되었을지 걱정입니다.

댓글 4

  • 임승빈2008-10-17
    안녕하세요.

    결정변수 x에 대한 solution 확인 방법은 다음과 같습니다.

    cplex.getValue(x);

    만약 결정변수를 IloNumVarArray로 선언하셨다면,

    cplex.getValue(x[index]);

    형태를 사용하시면 됩니다.

    위와 같이 하면 IloNum 형태의 숫자를 리턴해 줍니다.

    solution을 특정 array에 저장하고 싶으실 경우,

    그리고, 결정변수를 array 형태로 선언하셨다면 다음과 같이 저장할 수 있습니다.

    IloNumArray array(env); //solution을 저장할 array

    cplex.getValues(array, x); //x는 IloNumVarArray 형태

    위와 같이하면 x의 solution 값들이 array에 들어가게 됩니다.


    좀 더 자세한 사항은 CPLEX 매뉴얼을 IloCplex로 검색하시거나, getValue 로 검색하시면 정보를 얻으실 수 있습니다.

    감사합니다.

    아이콘삭제
  • 도형호2008-10-17
    질문을 조금 잘못한듯합니다.
    처음에 시작을 간단한 lp파일(text형식)을 랜덤하게 생성한 데이터로 생성을 하는 것으로 시작을 해서
    현재는 한 코드내에서 lp파일을 생성하고 그것을 외부에서 불러오는 형식을 취했습니다.
    과거 쓰던 cplex에서는 파일을 하나하나 작업을 했기때문에
    약간 변형하기위해 cplex10.1을 사용하면 간단하다고 해서 변환했습니다.

    현재까지 상황은 위와 같고 solution(object value)이 결정되었을때의
    각 변수의 값을 얻기위해 cplex.getValue라는 함수를 사용해보았습니다.
    안에 변수명을 넣으면 C코드자체에서 변수를 미지정한 오류가
    뜹니다.
    너무 말로 설명하려니 스킬이 부족한 저로써는 어렵습니다. 어떻게 하면 좋을지 조언 조금만 더 부탁드립니다.
    아이콘삭제
  • 임승빈2008-10-17
    안녕하세요.

    정확하게 어떠한 형태로 구현을 하셨는지 파악이 안되네요.

    혹시 lp 파일을 c++코드로 로딩시켜서 cplex를 구동시키는 것인가요?

    만약에 그렇다면 아래와 같은 구성이 되어 있을텐데요,

    lp 파일에 작성된 변수와 제약식, 목적식이, lp 파일 호출 시,

    로딩되게 됩니다.

    예를들면,

    IloObjective obj;
    IloNumVarArray var(env);
    IloRangeArray rng(env);
    cplex.importModel(model, argv[1], obj, var, rng); <-- lp 파일 로드 부분

    위 코드에서 lp 파일에 작성된 변수는 var 에 저장됩니다.

    따라서 솔루션이 나오게 되면 cplex.getValue(var[index])를

    사용하시면 되는데요,

    제가 정확하게 문제상황을 이해했는지 모르겠네요.

    만약 이러한 상황이라면, cplex c++ 예제 ilolpex7.cpp가 참고가 될 것으로 생각됩니다.
    아이콘삭제
  • 유환주2008-10-17
    코딩방식에 따라 API가 다릅니다.

    Callable Library를 사용했다면 examples의 lpex1.c를 보면 아래와 같은 부분이 있습니다.
    status = CPXsolution (env, lp, &solstat, &objval, x, pi, slack, dj);

    Concert Library를 사용했다면 examples의 ilolpex1.cpp를 보면 아래와 같은 부분이 있습니다.
    cplex.getValues(vals, var); <-- 여러개의 변수값을 가져올 때
    val = cplex.getValue(var); <-- 이것도 가능합니다. 1개의 변수값을 가져올 때.
    아이콘삭제

댓글 입력