Decision Optimization

Decision Optimization

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


#Analytics
#DecisionOptimization
#DecisionOptimization
 View Only
  • 1.  problem with prod function in the model

    Posted 01/19/17 03:40 PM

    Originally posted by: Rym


    Hi

     

    Always the CPlex can't generate the prod expression in the model

     

     

    int V=1..5;

    int D=1..3;

    inr P=1..4;

     

      dvar boolean lumda[V][P];
        dexpr int O = sum( i in V, j in P) lumda[i][j];
        dvar int R[P][D] in 0..1000;
        dexpr int RWx[j in P]=prod (l in D) R[j][l];
        dexpr int  RW = sum (j in P) RWx[j] ;
        maximize RW;

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

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

    forall(j in P) 
    {cv:

    R[j][1]==sum(i in V) lumda[i][j]*cpui[i];
    R[j][2]==sum(i in V) lumda[i][j]*rami[i];
     R[j][3]==sum(i in V) lumda[i][j]*diski[i];


      

    }

     

    thanks


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 2.  Re: problem with prof function in the model

    Posted 01/20/17 03:26 AM

    Hi,

    prod leads to a non linear model so you should try CPO:

    using CP;
     
     range D=1..3;

    range P=1..4;   
     
      dvar int R[P][D] in 0..100;
     
     
     dexpr int RWx[j in P]=prod (l in D) R[j][l];
      dexpr int  RW = sum (j in P) RWx[j] ;
        maximize RW;

    works

    regards


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 3.  Re: problem with prof function in the model

    Posted 01/20/17 06:51 AM

    Originally posted by: Rym


    Thanks but i must use an ILP model. SO can i remplace the prod by an other expression without using CP ??

     

    If i modify the constraint  "cv" by

     

    int V=1..5;

    int D=1..3;

    inr P=1..4;

     

      dvar boolean lumda[V][P];
        dexpr int O = sum( i in V, j in P) lumda[i][j];
        dvar int R[P];
        dexpr int  RW = sum (j in P) R[j] ;
        maximize RW;

    subject to 

    {

    .......

    forall(j in P) 
    {cv:

    R[j]==((sum(i in V) lumda[i][j]*cpui[i])*(sum(i in V) lumda[i][j]*rami[i])*(sum(i in V) lumda[i][j]*diski[i]));


      }

     

     CPLEX can't generate the constraint

     


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 4.  Re: problem with prof function in the model

    Posted 01/20/17 08:33 AM

    Hi,

    I would recommend you to try CPO:

    using CP;
     
    range V=1..5;

    range D=1..3;

    range  P=1..4;

    int cpui[i in V]=i;
    int rami[i in V]=i;
    int diski[i in V]=i;


     

      dvar boolean lumda[V][P];
      dvar int R[P];
        dexpr int O = sum( i in V, j in P) lumda[i][j];
        dvar int RWx[P];
        dexpr int  RW = sum (j in P) RWx[j] ;
        maximize RW;

    subject to

    {


    forall(j in P)
    {cv:

    R[j]==((sum(i in V) lumda[i][j]*cpui[i])*(sum(i in V) lumda[i][j]*rami[i])*(sum(i in V) lumda[i][j]*diski[i]));

    }
      }
       

    but if you are very reluctant, you may also write your constraint in ILP and develop the product:

    forall(j in P)
    {cv:

    R[j] == sum(i1,i2,i3 in V) cpui[i1]*rami[i2]*diski[i3]*(lumda[i1][j]==1)*(lumda[i2][j]==1)*(lumda[i3][j]==1);

     

    }

    regards


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 5.  Re: problem with prof function in the model

    Posted 01/20/17 01:01 PM

    Originally posted by: Rym


    I developped the product function but the probelm becomes no convex

     

    my .mod file

     

     

    int mySeed;
    execute{
            var now = new Date();
            mySeed = Opl.srand(Math.round(now.getTime()/1000));
    }  

    int v = 2;
    range V = 1..v;
    int p=2;
    int d=3;
    range P = 1..p;
    range D = 1..d;
    int cpui[V];
    int rami[V];
    int diski[V];
    int cpuj[P];
    int ramj[P];
    int diskj[P];
    int VMmin=1;
    int VMmax=4;
    int cpum=24;
    int ramm=48;
    int diskm=900;
    string S[VMmin..VMmax]=["s","m","l","xl"];
    {string} VMTypes={S[v] | v in VMmin..VMmax};
    int VM[i in V]=1+(rand() % (VMmax - VMmin+ 1));
    string vms[i in V] =S[VM[i]];
      
        
    tuple PM
    {
      int npm;
      string nvm;
      }

     
    {PM} indexes={<i,j> | i in P,j in VMTypes}; 


    int countPVX[indexes];
    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;

       }
       
     else if(vms[i]=="m")
     {
       cpui[i]=2;
       rami[i]=4;
       diski[i]=100;
     
        
        }
        
      else if(vms[i]=="l")
      
      { cpui[i]=4;
       rami[i]=8;
       diski[i]=150;

     }   
       else
       
      {
       cpui[i]=8;

       rami[i]=16;
       diski[i]=250 ;

       
       } 
       
       
    }
    writeln(cpui);
    writeln(rami);
    writeln(diski);

    };


    execute PMS
    {
     

    for (var i in P)


       cpuj[i]=cpum;
       ramj[i]=ramm;
       diskj[i]=diskm;
       
       }

       

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

    };
     

     
    //the model/problem definition
        dvar boolean lumda[V][P];
        dexpr int O = sum( i in V, j in P) lumda[i][j];
        dvar int R[P];
        dexpr int  RW = sum (j in P) R[j] ;
        maximize RW;


    //constraint

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

        diskr: 
         forall( j in P)
           sum( i in V) diski[i]*lumda[i][j] <= diskj[j];  
           
    forall(j in P) cps:R[j] == sum(i1 in V,i2 in V,i3 in V) cpui[i1]*rami[i2]*(lumda[i1][j]==1)*(lumda[i2][j]==1)*(lumda[i3][j]==1);
     

     


    }
    execute
    {

    writeln("lumda= ",lumda);
    //writeln("minx",minx);
    //writeln("mini",ro);
    writeln("R =",R);
    writeln("RW=",RW);
    writeln("VMs= ",O);
    //writeln("PMs= ",pm);

    }


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 6.  Re: problem with prof function in the model

    Posted 01/20/17 01:09 PM

    Hi,

    you may try with

    forall(j in P) cps:R[j] == sum(i1 in V,i2 in V,i3 in V) cpui[i1]*rami[i2]*
    ((lumda[i1][j]==1) && (lumda[i2][j]==1) && (lumda[i3][j]==1));

    regards


    #DecisionOptimization
    #OPLusingCPLEXOptimizer