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

고객지원

기술문의

IlcIntArray : IloNumArray

  • 황준하
  • 2002.03.20
  • 조회수 1,995
부산대학교 컴퓨터공학과 황준하
ILOG Solver 5.0

ILOG Solver의 이전 버전에서는
IlcIntArray 변수의 첨자로 IlcIntVar 변수가 사용되어 그 자체가 IlcIntVar 변수가 되도록 지정할 수 있었는데
IloNumArray에서는 그와 같은 기능을 사용학 수가 없습니다.

예제는 두 변수의 값이 IlcIntArray의 첨자로 쓰이는 경우입니다. 변수 두 개의 값이 나왔을 때 그 변수의 첨자에 해당하는 배열의 값의 합이 10 이상을 만족해야 합니다.
이 코드에서 이전 스타일과 같이 프로그래밍할 때는 제대로 답이 나오는데 현재 스타일에 맞출 경우 에러가 발생합니다.

* 코드

#include <iostream.h>
#include <ilsolver/ilosolver.h>

//#define ILCINTVAR

#ifdef ILCINTVAR

// 이전 스타일 : IlcIntVarArray 사용
void main()
{
IlcManager m(IlcEdit);
IlcIntArray Ary(m, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

IlcIntVarArray Vars(m, 2, 0, 9);
m.add(Ary[Vars[0]] + Ary[Vars[1]] >= 10);
m.add(IlcGenerate(Vars));

if (m.nextSolution()) {
m.out() << Vars[0].getValue() << \"\\t\" << Ary[Vars[0].getValue()] << endl;
m.out() << Vars[1].getValue() << \"\\t\" << Ary[Vars[1].getValue()] << endl;
}

m.end();
}

#else

// 현재 스타일 : IloNumVarArray 사용
void main()
{
IloEnv env;
IloModel model(env);
IloNumArray Ary(env, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

IloNumVarArray Vars(env, 2, 0, 9);
model.add(Ary[Vars[0]] + Ary[Vars[1]] >= 10); // ==> 에러 발생

IloSolver solver(model);

if (solver.solve()) {
solver.out() << solver.getValue(Vars[0]) << \"\\t\" << Ary[solver.getValue(Vars[0])] << endl;
solver.out() << solver.getValue(Vars[1]) << \"\\t\" << Ary[solver.getValue(Vars[1])] << endl;
}

env.end();
}

#endif

댓글 4

  • 소경철2002-03-20

    Concert Technology에서도 이 기능을 사용하실 수가 있습니다.

    IloNumArray의 생성자를 보면, () operator가 있는데, 이 operator를 사용하시면 됩니다.
    (IloNumArray는 IloIntArray의 상위 클래스입니다.)


    현재 에러가 발생한 부분을 예로 들면,

    model.add(Ary[Vars[0]] + Ary[Vars[1]] >= 10); 라고 되어있는 것을

    model.add(Ary(Vars[0]) + Ary(Vars[1]) >= 10); 으로 바꾸시면 됩니다.

    감사합니다.



    :황준하님의 글입니다.

    :부산대학교 컴퓨터공학과 황준하
    :ILOG Solver 5.0
    :
    :ILOG Solver의 이전 버전에서는
    :IlcIntArray 변수의 첨자로 IlcIntVar 변수가 사용되어 그 자체가 IlcIntVar 변수가 되도록 지정할 수 있었는데
    :IloNumArray에서는 그와 같은 기능을 사용학 수가 없습니다.
    :
    :예제는 두 변수의 값이 IlcIntArray의 첨자로 쓰이는 경우입니다. 변수 두 개의 값이 나왔을 때 그 변수의 첨자에 해당하는 배열의 값의 합이 10 이상을 만족해야 합니다.
    :이 코드에서 이전 스타일과 같이 프로그래밍할 때는 제대로 답이 나오는데 현재 스타일에 맞출 경우 에러가 발생합니다.
    :
    :* 코드
    :
    :#include <iostream.h>
    :#include <ilsolver/ilosolver.h>
    :
    ://#define ILCINTVAR
    :
    :#ifdef ILCINTVAR
    :
    :// 이전 스타일 : IlcIntVarArray 사용
    :void main()
    :{
    : IlcManager m(IlcEdit);
    : IlcIntArray Ary(m, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    :
    : IlcIntVarArray Vars(m, 2, 0, 9);
    : m.add(Ary[Vars[0]] + Ary[Vars[1]] >= 10);
    : m.add(IlcGenerate(Vars));
    :
    : if (m.nextSolution()) {
    : m.out() << Vars[0].getValue() << \"\\t\" << Ary[Vars[0].getValue()] << endl;
    : m.out() << Vars[1].getValue() << \"\\t\" << Ary[Vars[1].getValue()] << endl;
    : }
    :
    : m.end();
    :}
    :
    :#else
    :
    :// 현재 스타일 : IloNumVarArray 사용
    :void main()
    :{
    : IloEnv env;
    : IloModel model(env);
    : IloNumArray Ary(env, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    :
    : IloNumVarArray Vars(env, 2, 0, 9);
    : model.add(Ary[Vars[0]] + Ary[Vars[1]] >= 10); // ==> 에러 발생
    :
    : IloSolver solver(model);
    :
    : if (solver.solve()) {
    : solver.out() << solver.getValue(Vars[0]) << \"\\t\" << Ary[solver.getValue(Vars[0])] << endl;
    : solver.out() << solver.getValue(Vars[1]) << \"\\t\" << Ary[solver.getValue(Vars[1])] << endl;
    : }
    :
    : env.end();
    :}
    :
    :#endif
    아이콘삭제
  • 황준하2002-03-20
    말씀하신대로 고치면 에러는 발생하지 않습니다.
    그런데 실행시켜 보면 답이 나오지 않습니다.

    아이콘삭제
  • 소경철2002-03-20
    IloNumVarArray를 사용하고 싶으시다면, IloNumVarArray(env, 2, 0, 9, ILOINT); 라고 하면 되구요, 다른 방법으로는, IloNumVarArray 대신에 IloIntVarArray를 사용해도 됩니다.

    다음 코드를 참조하시기 바랍니다.


    #include <ilsolver/ilosolver.h>

    ILOSTLBEGIN

    void main() {
    try {
    IloEnv env;
    IloModel model(env);
    IloIntArray Ary(env, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

    IloIntVarArray Vars(env, 2, 0, 9);
    model.add(Ary(Vars[0]) + Ary(Vars[1]) >= 10);

    IloSolver solver(model);

    solver.startNewSearch(IloGenerate(env, Vars));

    while (solver.next()) {

    IloIntArray varArray(env, 2);
    varArray[0] = solver.getValue(Vars[0]);
    varArray[1] = solver.getValue(Vars[1]);

    cout << varArray[0] << \"\\t\" << Ary[varArray[0]] << endl;
    cout << varArray[1] << \"\\t\" << Ary[varArray[1]] << endl;
    cout << endl;
    }
    solver.endSearch();
    env.end();
    }
    catch (IloException& ex) {
    cerr << \"Error: \" << ex << endl;
    }
    }


    감사합니다.



    :황준하님의 글입니다.

    :말씀하신대로 고치면 에러는 발생하지 않습니다.
    :그런데 실행시켜 보면 답이 나오지 않습니다.
    :
    :
    아이콘삭제
  • 장용성2002-03-20
    1. IloNumVarArray Vars(env, 2, 0, 9);
    ==> IloNumVarArray Vars(env, 2, 0, 9, ILOINT);

    2. model.add(Ary[Vars[0]] + Ary[Vars[1]] >= 10);
    model.add(Ary(Vars[0]) + Ary(Vars[1]) >= 10);
    위와 같은 제약을 element constraint 라고 합니다..

    도움이 되셨으면 좋겠군요.. 수고하세요..
    아이콘삭제

댓글 입력