Decision Optimization

Decision Optimization

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


#Analytics
#DecisionOptimization
#DecisionOptimization
 View Only
  • 1.  Cplex generate negative numbers

    Posted 03/02/17 06:39 AM

    Originally posted by: Rym


    Cplex generate negative numberz when my contraints oblige all the values to be positive. Thanks

     

     

    The model:

     

    float Rwa=0.145614029;
    int fo =5;
    int v = 5;
    range V = 1..v;
    int p=5;
    range P = 1..p;
    int d=3;
    range D=1..d;
    string vms[V]= ["l", "x" ,"x" ,"x" ,"m"];
    //string PMs[1..p] = ...;
    //int counts = ...;
    //int countm = ...;
    //int countl = ...;
    //int countxl = ...;
    int cpui[V] =  [4, 8, 8, 8, 2];
    float rami[V]=[15,30,30,30,7.5] ;
    int diski[V] =  [80,160,160,160,32];
    int cpuj[P];
    float ramj[P];
    int diskj[P];
    int VMmin=1;
    int VMmax=4;
    string S[VMmin..VMmax]=["s","m","l","x"];
    {string} VMTypes={S[v] | v in VMmin..VMmax};
    int OSmod=0;
    int NbSS=0;
    int NbSM=0;
    int NbSL=0;
    int NbSXL=0;
    float Trs=0;
    float Trm=0;
    float Trl=0;
    float Trxl=0;
    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;


     
      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];
    dvar boolean phy[P];
    //dexpr int O = sum( i in V, j in P) lumda[i][j];
    dvar float  Rj2[j in P,l in D];
    dvar float  Rj[j in P,l in D] in 0..1 ;
    dvar float ro[P] in 0..1;
    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]==ro[j]))*(Rj[j][k]-ro[j]);
    dexpr float Rk=sum(j in P,k in D) Rj2[j][k];
    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];
            forall(j in P) 
    {cv:

    Rj[j][1]==(cpum-(sum(i in V) lumda[i][j]*cpui[i]))/cpum;
    Rj[j][2]==(ramm-(sum(i in V) lumda[i][j]*rami[i]))/ramm;
     Rj[j][3]==(diskm-(sum(i in V) lumda[i][j]*diski[i]))/diskm;
          } 
                  forall(j in P,k in D)
    { cps: ro[j]<=Rj[j][k];

    }        
            
            glob:
      fo <= sum (i in V, j in P) lumda[i][j];
      

      cpx:   forall(j in P,k in D) Rj[j][k]>=0;
         cpd:forall(j in P,k in D) Rj2[j][k]>=0;

             
     rwco: 
    Rk<=Rwa; 

    rkx:
    forall(j in P,k in D)  (!(Rj[j][k]==ro[j])) => (Rj2[j][k]==(Rj[j][k]-ro[j])); 
    forall(j in P,k in D)  ((Rj[j][k]==ro[j])) => (Rj2[j][k]==0);   
    }
          


    execute
    {

    writeln("RWa",Rwa);
    writeln("RWk",Rk);
    writeln("RW=",RWx);
    writeln("Rj2=",Rj2);
    writeln("Rj=",Rj);
    writeln("ro=",ro);

     

      }

     

     

    The result:

     

     [90 90 90 90 90]
     [375 375 375 375 375]
     [1520 1520 1520 1520 1520]
    // solution (optimal) with objective 1
    RWa0.145614029
    RWk0.145614029
    RW=0.145614029
    Rj2= [[0.05614 0.089474 -2.7756e-17]
             [-2.0292e-9 -2.0292e-9 -2.0292e-9]
             [-2.7756e-17 -2.7756e-17 -2.7756e-17]
             [-2.7756e-17 -2.7756e-17 -2.7756e-17]
             [-2.7756e-17 -2.7756e-17 -2.7756e-17]]
    Rj= [[0.66667 0.7 0.61053]
             [1 1 1]
             [1 1 1]
             [1 1 1]
             [1 1 1]]
    ro= [0.61053 1 1 1 1]

     

    Thanks

     

     

     

     

     


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 2.  Re: Cplex generate negative numbers

    Posted 03/02/17 06:56 AM

    Hi,

    this is because of tolerances.

    You should consider those tiny negative values as 0.

    See tech note https://www-01.ibm.com/support/docview.wss?uid=swg21400045 CPLEX appears to return a solution that violates some constraints or bounds

    regards


    #DecisionOptimization
    #OPLusingCPLEXOptimizer