Decision Optimization

Decision Optimization

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


#Analytics
#DecisionOptimization
#DecisionOptimization
 View Only
  • 1.  Count objectif function

    Posted 02/21/16 06:08 PM

    Originally posted by: Rym


    Hello

     

    I'm beginner with OPL, i don't have an idea how to express  and write the following statement:(I tried several ways but I still get a "Fail")

    Befor ,I summarize a bit my model:

     

    First  i have an array "vms' (size:nvm) and I filled it randomly in [S,M,L,XL]. My objective function is responsible to calculate the number of success among  nvm.

     

    So , now my problem is who to calculate the number of success for each type  "s","m","l","xl" from the result of my objective function.

    my model and data(attach).

     

     

    thanks

     

     

     


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 2.  Re: Count objectif function

    Posted 02/22/16 03:12 AM

    Hi,

    what you could try id to add after

    dexpr int OD = sum( i in V, j in P) lumda[i][j];

    the following code:

    {string} VMTypes={S[v] | v in VMmin..VMmax};
    dexpr int ODPerVMType[vtype in VMTypes]=
    sum( i in V, j in P:vms[i]==vtype) lumda[i][j];

    and then in the display in postprocessing:

    execute
    {

     
      writeln ("nombre de demande satisfaites=",OD);
      writeln ("nombre de demande satisfaites par type de VM=",ODPerVMType);
      writeln ("nombre de machines utils?es=",OP);
      writeln("diski[]=",cpui);
      writeln("rami[]=",rami);
      writeln("diski[]=",diski);
          
      }

    regards

     

    PS:

    You may also be interested in https://www.linkedin.com/pulse/best-kept-secret-can-help-alex-fleischer?trk

     


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 3.  Re: Count objectif function

    Posted 02/22/16 09:30 AM

    Originally posted by: Rym


    Thanks Alex . It' done

     

    But i still asking how can i access to a variable in my PostProcess from my main script:

     

    Here in my main script, i want to generate my mastermodel 5 times then, at each ittération i call my PostPrecess script and calculate the TrS at each one.When i quit loop "for ", I want to calculate the average of variable "TrS"

     

    my model is attached.

     

    thanks


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 4.  Re: Count objectif function

    Posted 02/22/16 02:39 PM

    Hi,

    you may have a look at the following:

    /*********************************************
     * OPL 12.5 Model
     * Author: Rim
     * Creation Date: 5 févr. 2016 at 00:31:15
     *********************************************/
    int TrS;
    int TrM;
    int TrL;
    int TrXL;
    int fo =...;
    int counts;
    int countm;
    int countl;
    int countxl;
    int v = ...;
    range V=1..v;
    int p = ...;
    range P = 1..p;
    int cpuj[P] = ...;
    int ramj[P] = ...;
    int diskj[P] = ...;
    int cpui[V];
    int rami[V];
    int diski[V];
    int VMmin=1;
    int VMmax=4;
    int VM[i in V]=VMmin+rand(VMmax-VMmin+1);
    string S[VMmin..VMmax]=["s","m","l","xl"];
    string vms[i in V]=S[VM[i]];

     execute
    {
     writeln("vms=",vms);
    for (var i in vms)
    {

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

      {
       cpui[i]=1;
       rami[i]=2;
       diski[i]=225;
       counts++;
       }
       
     else if(vms[i]=="m")
     {
       cpui[i]=2;
       rami[i]=4;
       diski[i]=550;
       countm++;
        
        }
        
      else if(vms[i]=="l")
     
      { cpui[i]=4;
       rami[i]=7;
       diski[i]=1100;
       countl++;
     }   
       else
       
      {
       cpui[i]=8;
       rami[i]=14;
       diski[i]=2200;
       countxl++;
       
       }
       
       
    }
    writeln ("cpui[]=",cpui);
    writeln ("rami[]=",rami);
    writeln ("diski[]=",diski);
    writeln("le nombre de vms en S est égal à  ",counts);
    writeln("le nombre de vms en M est égal à  ",countm);
    writeln("le nombre de vms en L est égal à  ",countl);
    writeln("le nombre de vms en XL est égal à  ",countxl);
     
    };
     

    //the model/problem definition

    dvar boolean lumda[V][P];
    dexpr int O = sum( i in V, j in P) lumda[i][j];
    {string} VMTypes={S[v] | v in VMmin..VMmax};
    dexpr int ODPerVMType[vtype in VMTypes]=sum( i in V, j in P:vms[i]==vtype) lumda[i][j];
    maximize O;

    //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];
           
           
           }
           
    float TrSF;      
     
    execute
    {

    TrS=ODPerVMType["s"];
    TrM=ODPerVMType["m"];
    TrL=ODPerVMType["l"];
    TrXL=ODPerVMType["xl"];

    TrSF=(counts-TrS)/counts;
    TrMF=(countm-TrM)/countm;
    TrLF=(countl-TrL)/countl;
    TrXLF=(countxl-TrXL)/countxl;

    writeln("*** "," ",TrSF," ",TrMF," ",TrLF," ",TrXLF,"***");
     
      }
     
     main {
     
       var status = 0;
       thisOplModel.generate();
       // This is an epsilon value to check if reduced cost is strictly negative
    var ofile = new IloOplOutputFile("res.txt");
    var min=20;
    var max=50;
    var mix=max-min+1;


    for(var j=1;j<=100;j=j+(min+(Opl.rand(mix))))
    {
    var sumTrSF=0;
    for (var i=0; i<=5;i++)
    {

      writeln("######Ittération numéro ", i,"#######");
      writeln("");
        // Retrieving model definition, engine and data elements from this OPL model
       // to reuse them later
       var masterDef = thisOplModel.modelDefinition;
       var masterCplex = cplex;
       var masterData = thisOplModel.dataElements;   
       // Creating the master-model
       var masterOpl = new IloOplModel(masterDef, masterCplex);
       masterData.v=j;
       masterOpl.addDataSource(masterData);
       writeln("solving with ",j,"  vms");
       masterOpl.generate();
       var O;
          if ( masterCplex.solve() )
           {
            masterOpl.postProcess();
            sumTrSF+=masterOpl.TrSF;
            O = masterCplex.getObjValue();
            
          }
           else
          {
             writeln("No solution to master problem!");
          }
          
         
       // Preparing sub-model source, definition and engine
       var subSource = new IloOplModelSource("mod2.mod");
       var subDef = new IloOplModelDefinition(subSource);
       var subCplex = new IloCplex();
     
          // Ceating the sub model
         var subOpl = new IloOplModel(subDef,subCplex);
               // Using data elements from the master model.
    var subData = new IloOplDataElements();

    subData.fo = O;
    writeln("Nouveau valeur de fo est égal à  ", O);
    subData.v = masterOpl.v;    
    subData.p = masterOpl.p;  
    subData.cpui = masterOpl.cpui;
    subData.rami = masterOpl.rami;    
    subData.diski = masterOpl.diski;
    subData.cpuj = masterOpl.cpuj;
    subData.ramj = masterOpl.ramj;    
    subData.diskj = masterOpl.diskj;
    subData.vms = masterOpl.vms;
          
    writeln("sum of TrMs=",sumTrSF);
    }

    }
          

    }  
     
     
          

     

    regards


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 5.  Re: Count objectif function

    Posted 02/23/16 05:35 AM

    Originally posted by: Rym


    Thanks Alex :)


    #DecisionOptimization
    #OPLusingCPLEXOptimizer