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

고객지원

기술문의

IloScalProd 문의

  • 이상원
  • 2006.07.26
  • 조회수 1,140
성의 있는 답변으로 인해 매우 감사드립니다.

덕분에... 문제들이 하나 하나 잘 해결되고 있답니다.

다시 한번 감사드립니다. _0_ 꾸벅~!

이번 질문은 서로 다른 Array의 제약식 구성에서 문제가 생겨서
문의 드립니다.
먼저 Array구성은 다음과 같습니다.

Decision Variable
X[i][j] --> 2차원 Array로 정의 ---->> 7 by 5 elements

data (parameter)
weight --> 1차원 Array로 정의 ---->> 1 by 5 elements

되어 있습니다.
수식이 ∑∑X[i][j]*weight[j] 로 구성되어있어서.... 다음과 같이
코드를 작성했더니....

IloExpr Constraints(env);

Constraints =+ IloScalProd(X[0],weight);
Constraints =+ IloScalProd(X[1],weight);

--> 이런 식으로

error C2665: 'IloScalProd' : none of the 14 overloads can con ..

이런 에러메시지가 뜨는군요..아무래도 제가 생각을 잘 못한 거 같은데.

차원이 서로 다른 Array(여기서는 2차와 1차)를 가지고 제약식을 구성하려고할때 IloScalProd를 어떻게 구성해야 할른지.... 부탁드리겠습니다...
ㅠ_ㅠ

댓글 4

  • 소경철2006-07-26
    다른 곳은 문제가 없는 것 같구요..

    Constraints =+ IloScalProd(X[0],weight);
    Constraints =+ IloScalProd(X[1],weight);

    이 부분이 문제가 있네요..

    IloExpr 객체에서 사용가능한 operator는 =+ 가 아니라 += 입니다..^^
    아이콘삭제
  • 이상원2006-07-26
    ^^ 그렇군요... 그런데.. 그 부분을 수정해도 사라지지 않네요.

    에러 발생 부분이 다음 부분입니다..

    // 2nd Constraint
    IloExpr constraints_1(env);
    for(i=0; i<Supplier; i++)
    {
    이부분 --------> constraints_1 += IloScalProd(X[i],volume);
    }


    IloExpr constraints_2(env);
    for(i=0; i<Supplier; i++)
    {
    이부분 --------> constraints_2 += IloScalProd(N[i],Max_volume);
    }

    LP.add(constraints_1 <= constraints_2);

    // 3rd Constraint
    IloExpr constraints_3(env);
    for(i=0; i<Supplier; i++)
    {
    이부분 --------> constraints_3 += IloScalProd(X[i],weight);
    }

    IloExpr constraints_4(env);
    for(i=0; i<Supplier; i++)
    {
    이부분 --------> constraints_4 += IloScalProd(N[i],Max_weight);
    }

    LP.add(constraints_3 <= constraints_4);

    에러명은
    error C2665: 'IloScalProd' : none of the 14 overloads can convert parameter 1 from type 'class IloNumVar [5]'
    라고 나옵니다. ㅠ.ㅠ..

    (소스파일 첨부.......) 확인해 주시면 감사....ㅠ_ㅠ

    사용환경: cplex90, winxp
    아이콘삭제
  • 소경철2006-07-26
    IloScalProd()의 생성자를 보시면 다음과 같이 되어있는 것을 알 수 있습니다.

    public IloNumExprArg IloScalProd(const IloNumVarArray vars, const IloNumArray values)

    즉, 이 함수에는 IloNumVarArray를 사용해야 한다는 거죠...

    변수를 생성할 때 IloNumVar X[7][5]와 같이 생성하시면 안되고 다음과 같이 IloNumVarMatrix를 정의해서 변수를 생성해야 합니다.

    typedef IloArray < IloNumVarArray > IloNumVarMatrix;

    이렇게 정의된 IloNumVarMatrix를 이용하여 변수를 생성하는 로직은 다음과 같습니다.

    IloNumVarMatrix X(env, Supplier);

    int i, j, k;
    for ( i = 0; i < Supplier; i++ )
    {
    X[i] = IloNumVarArray(env, Item);

    for ( j = 0; j < Item; j++ )
    {
    X[i][j] = IloNumVar(env, 0, IloInfinity);
    }
    }

    IloNumVarMatrix N(env, Supplier);

    for ( i = 0; i < Supplier; i++ )
    {
    N[i] = IloNumVarArray(env, Truck);
    for ( k = 0; k < Truck; k++ )
    {
    N[i][k] = IloNumVar(env, 0, IloInfinity);
    }
    }
    아이콘삭제
  • 비회원2017-07-31
    I cant hear anhniytg over the sound of how awesome this article is.
    아이콘삭제

댓글 입력