Global Data Science Forum

 View Only
  • 1.  CPLEX cannot extract expression

    Posted Wed March 02, 2022 09:16 AM
    Hello I got errors in my latency constraint section and function section where it says "CPLEX cannot extract expression" below i attached the code , can anyone help me, Thankss !!
    This is my code :
    // définir les intervalles

    range T=1..3 ;
    range A=1..7 ;
    range H=1..12 ;
    range S=1..9 ;
    range C=1..350 ;
    range S1=1..9 ;
    range S2=1..9;

    // définir les données externes

    int Ns=...; // capacité de production
    int Ms=...; // capacité du pt de stockage
    int nbrepdtsstock=...; // nombre des produits par pt de stockage

    //définir les variables de décision

    dvar float Ca[A][T][H] in 0..infinity;// Cadence de production du produit p à la date et à l'unité u
    dvar float l[A][S][H] in 0..infinity ;// Niveau d'inventaire du produit p à la date t et au point de stockage s
    dvar float xACS in 0..infinity; // nombre de tonnes d'ACS produites par l'atelier sulfurique
    dvar float yACP29 in 0..infinity; // nombre de tonnes d'ACP29% produites par l'atelier phosphorique
    dvar float zACP54 in 0..infinity;// nombre de tonnes d'ACP54% produites par l'atelier phosphorique
    dvar float w in 0..infinity; // nombre de tonnes d'engrais produits par l'atelier des engrais
    dvar float F[T][S1][S2][H] in 0..infinity; // Flux de transfert du stock s1 au stock s2 du produit p à la date t
    dvar float d[C][A] in 0..infinity; // demande du client c du produit p par mois
    dvar boolean v [A][T][H] in 0..1;// l'unité u des engrais produit le type p à la date t
    dvar boolean h [T][S][H] in 0..1; // le produit p existe au point de stockage s à la date t

    // définir la fonction objective

    maximize sum (p in T, u in A, t in H) (Ca[p][u][t]) ;

    // Définir les contraintes

    subject to
    {
    // Somme des cadences de production des produits d'une unité <= la capacité de production
    forall ( t in H, u in A)
    {
    sum(p in T) (Ca[t][u][p]) <= Ns;
    }

    // Somme des inventaires des produits d'un point de stockage <= la capacité du point de stockage
    forall ( t in H, s in S)
    {
    sum(p in T) (l[p][s][t]) <= Ms;
    }

    // Pas 2 produits le même jour t pour la même unité u

    forall ( t in H, u in A)
    {
    sum(p in T) (v[t][u][p]) <= 1;
    }

    // Stock non mixte : Limitation du nombre de produits par stock

    forall ( t in H, s in S)
    {
    sum(p in T) (h[t][s][p]) <=nbrepdtsstock ;
    }

    // Conservation des flux

    forall ( t in H, u in A , p in T , s1 in S1 , s2 in S2 , s in S : s1!=s2)
    {
    (l[t ][p][s]) == sum(p in T) (Ca[t][u][p]) + sum(p in T) (F[t][p][s1][s2] )+(l[t-1][p][s]);

    }

    // Demande stisfaite à 100%

    forall(p in T)
    {
    sum (t in H , u in A )(Ca[t][u][p] ) >= sum (c in C , p in T) (d[c] [p]) ;
    }


    // Recette

    w==xACS+2*yACP29 ;

    }

    ------------------------------
    Younes Liaakobi
    ------------------------------


  • 2.  RE: CPLEX cannot extract expression

    Posted Thu March 03, 2022 11:23 AM
    Edited by Irv Lustig Thu March 03, 2022 11:23 AM
    You may have some indexing problems.  Here is the first one I found, but you may have others.

    You have the following:

    dvar float Ca[A][T][H] in 0..infinity;// Cadence de production du produit p à la date et à l'unité u
    ...
    maximize sum (p in T, u in A, t in H) (Ca[p][u][t]) ;
    ​


    So you changed which sets are indexing the variable.  You have the sets A/T/H indexing Ca, but your objective expression is using T/A/H .  You need to be consistent.  This problem may exist elsewhere in your code.

    ------------------------------
    Irv Lustig
    Certified Analytics Professional
    INFORMS Fellow
    Optimization Principal
    Princeton Consultants
    ------------------------------