Decision Optimization

Decision Optimization

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


#Analytics
#DecisionOptimization
#DecisionOptimization
 View Only
  • 1.  Convexity problem

    Posted 02/28/17 07:45 AM

    Originally posted by: Rym


    My model contains many constrains where i had a convex probelm and i don't know why: Any suggestions ?

    The error message:    CPLEX Error  5002: 'rwco' is not convex.   

     

     

    float Rwa=...;
    int fo =...;
    int v = ...;
    range V = 1..v;
    int p=10;
    range P = 1..p;
    int d=3;
    range D=1..d;
    string vms[1..v] = ...;
    int cpui[1..v] = ...;
    float rami[1..v]= ... ;
    int diski[1..v] = ...;
    int cpuj[1..p] = ...;
    float ramj[1..p]= ... ;
    int diskj[1..p] = ...;
    int VMmin=1;
    int VMmax=4;
    string S[VMmin..VMmax]=["s","m","l","x"];
    {string} VMTypes={S[v] | v in VMmin..VMmax};
    tuple PM
    {
      int npm;
      string nvm;
      }
    {PM} indexes={<i,j> | i in P,j in VMTypes};  

    int countPVX[indexes];
    int cpum=90;
    float ramm=375;
    int diskm=1520;


     
      

     

    //the model/problem definition

    dvar boolean lumda[V][P];
    dvar boolean phy[P];
    dexpr float R1[j in P]= (cpum-(sum(i in V) lumda[i][j]*cpui[i]))/cpum;
    dexpr float R2[j in P]= (ramm-(sum(i in V) lumda[i][j]*rami[i]))/ramm;

    dexpr float R3[j in P]= (diskm-(sum(i in V) lumda[i][j]*diski[i]))/diskm;

    dexpr float Rj[j in P,l in D]=(l==1)?R1[j]:((l==2)?R2[j]:(R3[j]));
    dexpr float minx[j in P] = minl(Rj[j][1],(minl(Rj[j][2],Rj[j][3])));
    dexpr int OP = sum( j in P) phy[j];
    minimize OP;


    //constraints


    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 la 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 la 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 la la quantité de disk de la pm 

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

     

    //quand est ce que pm prends un

         phyone:
           forall ( i in V, j in P)
          lumda[i][j]<= phy[j] ;

    //quand est ce que pm prends zero

        phynull:
          forall (j in P)
            phy[j]<= sum (i in V) lumda[i][j];
     

          glob:
      fo <= sum (i in V, j in P) lumda[i][j];       
            
                rwco:
    sum(j in P,k in D)(!(Rj[j][k]==minx[j]))*(Rj[j][k]-minx[j])<=Rwa;
       
    }

    Thanks

     

     


    #DecisionOptimization
    #MathematicalProgramming-General


  • 2.  Re: Convexity problem

    Posted 02/28/17 08:12 AM

    Hi

    can you also attach your .dat ?

    regards


    #DecisionOptimization
    #MathematicalProgramming-General


  • 3.  Re: Convexity problem

    Posted 02/28/17 08:27 AM

    Originally posted by: Rym


    The model+Data:


    float Rwa=0.0830409357;
    int fo =5;
    int v = 5;
    range V = 1..v;
    int p=10;
    range P = 1..p;
    int d=3;
    range D=1..d;
    string vms[V]= ["m","m","l","x","l"];
    int cpui[V] = [2,2,4,8,4];
    float rami[V]=  [7.5,7.5,15,30,15];
    int diski[V] =  [32,32,80,160,80];
    int cpuj[P] =  [90,90,90,90,90,90,90,90,90,90];
    float ramj[P]=  [375,375,375,375,375,375,375, 375,375, 375] ;
    int diskj[P] =  [1520,1520,1520,1520,1520,1520,1520,1520,1520,1520];
    int VMmin=1;
    int VMmax=4;
    string S[VMmin..VMmax]=["s","m","l","x"];
    {string} VMTypes={S[v] | v in VMmin..VMmax};
    tuple PM
    {
      int npm;
      string nvm;
      }
    {PM} indexes={<i,j> | i in P,j in VMTypes};  
    int countPVX[indexes];
    int cpum=90;
    float ramm=375;
    int diskm=1520;

     
      

    //the model/problem definition
    dvar boolean lumda[V][P];
    dvar boolean phy[P];
    dexpr float R1[j in P]= (cpum-(sum(i in V) lumda[i][j]*cpui[i]))/cpum;
    dexpr float R2[j in P]= (ramm-(sum(i in V) lumda[i][j]*rami[i]))/ramm;
    dexpr float R3[j in P]= (diskm-(sum(i in V) lumda[i][j]*diski[i]))/diskm;
    dexpr float Rj[j in P,l in D]=(l==1)?R1[j]:((l==2)?R2[j]:(R3[j]));
    dexpr float minx[j in P] = minl(Rj[j][1],(minl(Rj[j][2],Rj[j][3])));
    dexpr float RWx=sum(j in P,k in D)(!(Rj[j][k]==minx[j]))*(Rj[j][k]-minx[j]);
    dexpr int OP = sum( j in P) phy[j];
    minimize OP;

    //constraints

    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 la 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 la 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 la la quantité de disk de la pm 
        diskr: 
         forall( j in P)
           sum( i in V) diski[i]*lumda[i][j] <= diskj[j];
           

    //quand est ce que pm prends un
         phyone:
           forall ( i in V, j in P)
          lumda[i][j]<= phy[j] ;
    //quand est ce que pm prends zero
        phynull:
          forall (j in P)
            phy[j]<= sum (i in V) lumda[i][j];

          glob:
      fo <= sum (i in V, j in P) lumda[i][j];       
            
                rwco:
    sum(j in P,k in D)(!(Rj[j][k]==minx[j]))*(Rj[j][k]-minx[j])<=Rwa;
       
    }

    execute
    {

    writeln("PM=",OP);
    writeln("RW=",RWx);
    }


    #DecisionOptimization
    #MathematicalProgramming-General


  • 4.  Re: Convexity problem

    Posted 02/28/17 08:53 AM

    Hi,

    instead of

                rwco:
    sum(j in P,k in D)(!(Rj[j][k]==minx[j]))*(Rj[j][k]-minx[j])<=Rwa;

    can you try to add

    dvar float  Rj2[j in P,l in D];

    in the variable section and then in the subject to block

     rwco:
    sum(j in P,k in D) Rj2[j][k]<=Rwa;

     
    forall(j in P,k in D)  (!(Rj[j][k]==minx[j])) => (Rj2[j][k]==(Rj[j][k]-minx[j]));
    forall(j in P,k in D)  ((Rj[j][k]==minx[j])) => (Rj2[j][k]==0); 

    ?

    regards

     

     


    #DecisionOptimization
    #MathematicalProgramming-General


  • 5.  Re: Convexity problem

    Posted 02/28/17 09:13 AM

    Originally posted by: Rym


    Thanks Alex,  It's working . But can you explain me where is the proble in my last model. Thanks


    #DecisionOptimization
    #MathematicalProgramming-General


  • 6.  Re: Convexity problem

    Posted 02/28/17 09:27 AM

    Let me give you a small example:

    dvar boolean b;
     dvar int x in 0..100;
     maximize b;
     subject to
     {
     ct:b*x<=10;
     }

    gives

    error 5002 ct is not convex

    That was your model.

    And now after the fix you have

    dvar boolean b;
     dvar int x in 0..100;
     dvar int bx;
     
     maximize b;
     subject to
     {
     (b==0) => (bx==0);
     (b==1) => (bx==x);
     
     ct:bx<=10;
     }

    which works fine.

    Regards

     


    #DecisionOptimization
    #MathematicalProgramming-General


  • 7.  Re: Convexity problem

    Posted 02/28/17 09:45 AM

    Originally posted by: Rym


    Thanks a lot Alex :)


    #DecisionOptimization
    #MathematicalProgramming-General