Decision Optimization

Decision Optimization

Delivers prescriptive analytics capabilities and decision intelligence to improve decision-making.

 View Only
Expand all | Collapse all

opperator != in dexpr

Archive User

Archive UserWed January 11, 2017 05:16 AM

  • 1.  opperator != in dexpr

    Posted Wed January 11, 2017 05:16 AM

    Originally posted by: Rym


    Hi,

     

     

    I want to write the following expression as an objective function but i can't write the != operator:

     

    the expression is :

    int p=50;
    int d=3;
    range P = 1..p;
    range D = 1..d;
    int R[1..p][1..d]=...;

    dexpr float RW = sum (j in P, d in D, k in D,d diff k) R[j][d]-min(R[j][k]); 

     

    in other words:  W =∑∑(Rji −Rjk),i ̸= k;

    Thanks 


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 2.  Re: opperator != in dexpr

    Posted Wed January 11, 2017 05:37 AM

    Hi,

    int p=50;
    int d=3;
    range P = 1..p;
    range D = 1..d;
    int R[i in 1..p][j in 1..d]=i*j;

    dexpr float RW = sum (j in P, d in D, k in D:d != k)
     (R[j][d]-min(k in 1..2)(R[j][k]));

    subject to
    {
    }

    execute
    {
    writeln(RW);
    }

    works fine.

    regards


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 3.  Re: opperator != in dexpr

    Posted Wed January 11, 2017 06:37 AM

    Originally posted by: Rym


    I think that i have a problem in the composition of the problem: I want to minimize the  quantity of resource wastage in all physical machines (j) j:1..p. Within each physical machine, there is a set of virtual machines (i).i:1..v

    The physical machine is composed with different resources (cpuj,ramj,diskj).

    The virtual machine is composed with different resources (cpui,rami,diski).

    The quantity of resource wastage is calculated as follow: ∑(Rji −Rjk),i ̸= k;

    The decision variable is lumda [i][j]: the virtual machine i is hosted in phyiscal machine j.

    Hwo to incorporate the R[P][D] matrix in the model ???

    The R[P][D]--> sum (j in p) (R[j][1]=cpuj[j];R[j][1]=ramj[j];R[j][3]=diskj[j]);

     

    The following model is correct ?


    int v = ...;
    range V = 1..v;
    int p=50;
    int d=3;
    range P = 1..p;
    range D = 1..d;
    string vms[1..v]=... ;
    int cpuj[P];
    int ramj[P];
    int diskj[P];
    int cpui[V];
    int rami[V];
    int diski[V];
    int VMmin=1;
    int VMmax=4;
    string S[VMmin..VMmax]=["s","m","l","xl"];
    {string} VMTypes={S[v] | v in VMmin..VMmax};

    tuple PM
    {
      int npm;
      string nvm;
      }

    execute VMS
    {
    var ofilevms = new IloOplOutputFile("resvmss.txt");
     writeln("vms=",vms);
    for (var i in vms)
    { ofilevms.write("'",vms[i],"',");

    if(vms[i]=="s")

      {
       cpui[i]=1;
       rami[i]=2;
       diski[i]=50;
       counts++;
       }
       
     else if(vms[i]=="m")
     {
       cpui[i]=2;
       rami[i]=4;
       diski[i]=105;
       countm++;
        
        }
        
      else if(vms[i]=="l")
      
      { cpui[i]=4;
       rami[i]=7;
       diski[i]=150;
       countl++;
     }   
       else
       
      {
       cpui[i]=8;
       rami[i]=14;
       diski[i]=250 ;
       countxl++;
       
       } 
       
       
    }
    writeln(cpui);
    writeln(rami);
    writeln(diski);

    };


    execute PMS
    {
     

    for (var i in P)


       cpuj[i]=21;
       ramj[i]=40;
       diskj[i]=1000;
       
       }

       

    writeln(cpuj);
    writeln(ramj);
    writeln(diskj);

    };

     

    //the model/problem definition

    dvar boolean lumda[V][P];
    dexpr W=(R[j][d]-min(R[j][k]));
    dexpr int O = sum( i in V, j in P) lumda[i][j];
    dexpr int ODPVMType[vtype in VMTypes]=sum( i in V, j in P:vms[i]==vtype) lumda[i][j];
    dexpr int OP = sum( j in P) phy[j];
    dexpr float RW = sum (i in V,j in P,d in D, k in D:d!=k) lumda[i][j]*W.
    minimize RW;

     


    subject to{ 
    //une machine virtuelle est hébergée par au plus une seule pm
      limit:
       forall( i in V)
         sum( j in P ) lumda[i][j] <= 1;
        

    //la quantité de cpu consommée par les vms ne depasse pas la quantité de cpu de la pm j
       cpur:
        forall( j in P)
          sum( i in V) cpui[i]*lumda[i][j] <= cpuj[j];
            

    //la quantité de ram consommée par les vms ne depasse pas la quantité de ram de la pm j
        ramr:
         forall( j in P)
           sum( i in V) rami[i]*lumda[i][j] <= ramj[j];

    //la quantité de disk consommée par les vms ne depasse pasla quantité de disk de la pm 

        diskr: 
         forall( j in P)
           sum( i in V) diski[i]*lumda[i][j] <= diskj[j];
           

     

     

     

     


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 4.  Re: opperator != in dexpr

    Posted Wed January 11, 2017 07:17 AM

    Hi,

    about

    How to incorporate the R[P][D] matrix in the model ???

    The R[P][D]--> sum (j in p) (R[j][1]=cpuj[j];R[j][1]=ramj[j];R[j][3]=diskj[j]);

    Have you tried to use the ternary operator ?

    Let me give you a small example:

    int A[i in 1..3][j in 1..3][k in 1..3]
     =(i==1)?(j+k):((i==2)?(j*k):(j-k));
     
     execute
     {
     writeln(A);
     }
     
     assert forall(j,k in 1..3)
         A[1][j][k]==j+k;
        
    assert forall(j,k in 1..3)
         A[2][j][k]==j*k;
        
         assert forall(j,k in 1..3)
         A[3][j][k]==j-k;

    regards

     


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 5.  Re: opperator != in dexpr

    Posted Wed January 11, 2017 07:50 AM

    Originally posted by: Rym


    It's really complicated Alex, i'am thinking simply:


    dvar boolean lumda[V][P];

    dexpr int O = sum( i in V, j in P) lumda[i][j];
    dexpr int ODPVMType[vtype in VMTypes]=sum( i in V, j in P:vms[i]==vtype) lumda[i][j];
    dexpr int R[j in p][1]=cpuj[j];
    dexpr int R[j in p][1]=ramj[j];
    dexpr int R[j in p][1]=diskj[j];
    dexpr float RW = sum (i in V,j in P,d in D,k in D:d!=k) lumda[i][j]*(R[j][d]-(min(k=1..2)(R[j][k])));
    minimize RW;

     

    First, i have errors   somewhere  :


    Le nom "R" a déjà été défini.    testrw.mod   
    Dépendance en boucle pour la déclaration de "R".   
    Le type int ne peut pas être utilisé pour l'indexation.    Impossible de charger le modèle.    testrw        Inconnu    Problème OPL
    Le nom "R" a déjà été défini.    

     

     


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 6.  Re: opperator != in dexpr

    Posted Wed January 11, 2017 07:57 AM

    Hi,

    you cannot write

    dexpr int R[j in p][1]=cpuj[j];
    dexpr int R[j in p][1]=ramj[j];
    dexpr int R[j in p][1]=diskj[j];

    because you use R again and again but you could write

    dexpr int R1[j in p]=cpuj[j];
    dexpr int R2[j in p]=ramj[j];
    dexpr int R3[j in p]=diskj[j];

    and then with the ternary operator you get R out of R1,R2 and R3

    regards


    #DecisionOptimization
    #OPLusingCPLEXOptimizer