Decision Optimization

Decision Optimization

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


#Analytics
#DecisionOptimization
#DecisionOptimization
 View Only
  • 1.  I cannot debugg the following OPL code

    Posted 12/23/13 11:32 AM

    Originally posted by: Abdelkader


    Hi all,

    Could someone debugg the following opl code to run on ibm ilog cplex  studio 12.5. it was perfectly runningon opl studio 3.7 before to migrate to ibm ilog cplex  studio 12.5.

     

    //DATA
    int NbProducts=...; 
    int NbMachines=...;
     
    range Products= 1..NbProducts;
    range Machines= 1..NbMachines;
     
    int NombreSeqCC[Products]= ...;
     
    range NumSeqCC1= 1..NombreSeqCC[1];
    range NumSeqCC2= 1..NombreSeqCC[2];
     
    int NbPochesNumSeqCC1[NumSeqCC1]=...;
    int NbPochesNumSeqCC2[NumSeqCC2]=...;
     
    int NbtotalPochesCC1= sum(i in NumSeqCC1) NbPochesNumSeqCC1[i];
    int NbtotalPochesCC2= sum(i in NumSeqCC2) NbPochesNumSeqCC2[i];
     
    range NumPochesNumSeqCC1= 1..NbtotalPochesCC1;
    range NumPochesNumSeqCC2= 1..NbtotalPochesCC2;
     
    int M1= (NbtotalPochesCC1+ NbtotalPochesCC2 + 1) div 2;
    int M2= (NbtotalPochesCC1 + NbtotalPochesCC2) div 2;
     
    range m1= 1..M1;
    range m2= 1..M2;
     
    //DECISION VARIABLES
    dvar boolean z1Seq1[NumPochesNumSeqCC1, m1]; //in 0..1;
    dvar boolean z1Seq2[NumPochesNumSeqCC2, m1]; //in 0..1;
    dvar boolean z2Seq1[NumPochesNumSeqCC1, m2]; //in 0..1;
    dvar boolean z2Seq2[NumPochesNumSeqCC2, m2]; //in 0..1;
     
    dvar float+ StartTime1[NumPochesNumSeqCC1,Machines];
    dvar float+ StartTime2[NumPochesNumSeqCC2,Machines];
    dvar float+ ProcessTime1[NumPochesNumSeqCC1];
    dvar float+ ProcessTime2[NumPochesNumSeqCC2];
     
    dvar float+ InterSequenceTime1[NumPochesNumSeqCC1]; //setup1
    dvar float+ InterSequenceTime2[NumPochesNumSeqCC2]; //setup2
     
    int delta1=...;
    int delta2=...;
    int DurationCV=...;
    int Transfer1=...;
    int Transfer2=...;
    int DurationEtap[1..2]=...;
     
    float MinProcessTime1[NumPochesNumSeqCC1]=...;
    float MaxProcessTime1[NumPochesNumSeqCC1]=...;
    float MinProcessTime2[NumPochesNumSeqCC2]=...;
    float MaxProcessTime2[NumPochesNumSeqCC2]=...;
     
    int MaxSojourn[1..2]=...;
     
    float Max1;
    float Max2;
     
    int InitialStart1[1..2]=...; 
    int InitialStart2[1..2]=...; 
     
    int MinInterSequence1=...;
    int MaxInterSequence1=...;
    int MinInterSequence2=...;
    int MaxInterSequence2=...;
     
    int Indice1[1..NombreSeqCC[1]]=...;
    int Indice2[1..NombreSeqCC[2]]=...;
     
    //OBJECTIVE
    minimize
    StartTime1[NbtotalPochesCC1,3] + ProcessTime1[NbtotalPochesCC1]+ StartTime2[NbtotalPochesCC2,3]+ 
    ProcessTime2[NbtotalPochesCC2]; 
     
     
     
    //CONSTRAINTS
    subject to{ 
    Max1 = (sum(i in NumPochesNumSeqCC1) (StartTime1[i,3] - StartTime1[i,1] - DurationCV)/ NbtotalPochesCC1);
    Max2 = (sum(i in NumPochesNumSeqCC2) (StartTime2[i,3] - StartTime2[i,1] - DurationCV)/ NbtotalPochesCC2);
     
     
    forall(i in NumPochesNumSeqCC1)
    sum(j in m1) z1Seq1[i,j] + sum(j in m2) z2Seq1[i,j] == 1; //=
     
    forall(i in NumPochesNumSeqCC2)
    sum(j in m1) z1Seq2[i,j] + sum(j in m2) z2Seq2[i,j] == 1; //=
     
     
    forall(j in m1)
    sum (i in NumPochesNumSeqCC1) z1Seq1[i,j]+ sum (i in NumPochesNumSeqCC2) z1Seq2[i,j]==1; //=
    forall(j in m2)
    sum (i in NumPochesNumSeqCC1) z2Seq1[i,j]+ sum (i in NumPochesNumSeqCC2) z2Seq2[i,j]==1; //=
     
     
    forall(i in 1..NbtotalPochesCC1-1){ 
       forall(t in 1..M1-1)
           z1Seq1[i+1,t+1]<= sum(j in 1..t) z1Seq1[i,j]+ sum(j in 1..t) z2Seq1[i,j];
    }
    forall(i in 1..NbtotalPochesCC1-1){ 
       forall(t in 1..M2)
           z2Seq1[i+1,t]<= sum(j in 1..t)(z1Seq1[i,j]) + sum(j in 1..t)(z2Seq1[i,j])- z2Seq1[i,t];
    }
    forall(i in 1..NbtotalPochesCC2-1){ 
       forall(t in 1..M1-1)
          z1Seq2[i+1,t+1]<= sum(j in 1..t)(z1Seq2[i,j]) + sum(j in 1..t)(z2Seq2[i,j]);
    }
    forall(i in 1..NbtotalPochesCC2-1){ 
       forall(t in 1..M2)
          z2Seq2[i+1,t]<= sum(j in 1..t)(z1Seq2[i,j]) + sum(j in 1..t)(z2Seq2[i,j])- z2Seq2[i,t];      
       z1Seq1[1,1]+z1Seq2[1,1]==1; //=
    }
     
    forall(i in NumPochesNumSeqCC1)
       StartTime1[i,1] = sum(j in m1) (delta1 + DurationCV*(j-1))*z1Seq1[i,j]+ 
       sum(j in m2) (delta2 + DurationCV*(j-1))*z2Seq1[i,j];
    forall(i in NumPochesNumSeqCC2)
       StartTime2[i,1]= sum(j in m1) (delta1 + DurationCV*(j-1))*z1Seq2[i,j]+
       sum(j in m2) (delta2 + DurationCV*(j-1))*z2Seq2[i,j];   
       
    forall(i in NumPochesNumSeqCC1)
       StartTime1[i,2] >= StartTime1[i,1]+DurationCV+Transfer1;
    forall(i in NumPochesNumSeqCC2)
       StartTime2[i,2] >= StartTime2[i,1]+DurationCV+Transfer1;
     
    forall(i in NumPochesNumSeqCC1)
       StartTime1[i,3] >= StartTime1[i,2]+DurationEtap[1]+Transfer2;
    forall(i in NumPochesNumSeqCC2)
       StartTime2[i,3] >= StartTime2[i,2]+DurationEtap[2]+Transfer2;
     
     
    forall(i in 1..NbtotalPochesCC1-1)
       StartTime1[i+1,2] >= StartTime1[i,2]+DurationEtap[1];
    forall(i in 1..NbtotalPochesCC2-1)
       StartTime2[i+1,2] >= StartTime2[i,2]+DurationEtap[2];
     
    forall(k in 1..NombreSeqCC[1])
       forall(i in 1..NbPochesNumSeqCC1[k]-1)
          StartTime1[Indice1[k] + i+1,3] = StartTime1[Indice1[k]+i,3] + ProcessTime1[Indice1[k]+i];
                  
    forall(k in 1..NombreSeqCC[2])
       forall(i in 1..NbPochesNumSeqCC2[k]-1)
          StartTime2[Indice2[k] +i +1,3] = StartTime2[Indice2[k] +i,3] + ProcessTime2[Indice2[k]+i];
      
    forall(k in 1..NombreSeqCC[1]-1)
       StartTime1[Indice1[k] + NbPochesNumSeqCC1[k]+1,3]== 
       StartTime1[Indice1[k] + NbPochesNumSeqCC1[k],3]+
       ProcessTime1[Indice1[k]+NbPochesNumSeqCC1[k]]+
       InterSequenceTime1[Indice1[k]+NbPochesNumSeqCC1[k]];     
    forall(k in 1..NombreSeqCC[2]-1)
       StartTime2[Indice2[k] + NbPochesNumSeqCC2[k]+1,3]==
       StartTime2[Indice2[k] + NbPochesNumSeqCC2[k],3]+ 
       ProcessTime2[Indice2[k]+NbPochesNumSeqCC2[k]]+
       InterSequenceTime2[Indice2[k]+NbPochesNumSeqCC2[k]];   
          
     
    forall(i in NumPochesNumSeqCC1)
       MinProcessTime1[i] <= ProcessTime1[i] <= MaxProcessTime1[i];   
    forall(i in NumPochesNumSeqCC2)
       MinProcessTime2[i] <= ProcessTime2[i] <= MaxProcessTime2[i];
       
    forall(i in NumPochesNumSeqCC1)
    StartTime1[i,3] - StartTime1[i,1] - DurationCV <= MaxSojourn[1];
    forall(i in NumPochesNumSeqCC2)
    StartTime2[i,3] - StartTime2[i,1] - DurationCV <= MaxSojourn[2];
     
     
    InitialStart1[1] <= StartTime1[1,3] <= InitialStart1[2];
    InitialStart2[1] <= StartTime2[1,3] <= InitialStart2[2];
     
     
    forall(i in 2..NbtotalPochesCC1)
    MinInterSequence1 <= InterSequenceTime1[i] <= MaxInterSequence1;
    forall(i in 2..NbtotalPochesCC2)
    MinInterSequence2 <= InterSequenceTime2[i] <= MaxInterSequence2;
     
    };
     
    display StartTime1;
    display StartTime2;
    display ProcessTime1;
    display ProcessTime2;
     
    display InterSequenceTime1;
    display InterSequenceTime2;
     
    display (StartTime1[NbtotalPochesCC1,3]+ProcessTime1[NbtotalPochesCC1]);
    display (StartTime2[NbtotalPochesCC2,3]+ProcessTime2[NbtotalPochesCC2]);
     
    display Max1;
    display Max2;
     
    display (StartTime1[1,3]-InitialStart1[1]);
     

    ------------------------------------

     

    I got many errors when running cplex studio 12.5

     

    THANKS IN ADVANCE.

     

     


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 2.  Re: I cannot debugg the following OPL code

    Posted 12/25/13 02:47 PM

    Hi,

    I translated it.

     

    //DATA
    int NbProducts=...;
    int NbMachines=...;
     
    range Products= 1..NbProducts;
    range Machines= 1..NbMachines;
     
    int NombreSeqCC[Products]= ...;
     
    range NumSeqCC1= 1..NombreSeqCC[1];
    range NumSeqCC2= 1..NombreSeqCC[2];
     
    int NbPochesNumSeqCC1[NumSeqCC1]=...;
    int NbPochesNumSeqCC2[NumSeqCC2]=...;
     
    int NbtotalPochesCC1= sum(i in NumSeqCC1) NbPochesNumSeqCC1[i];
    int NbtotalPochesCC2= sum(i in NumSeqCC2) NbPochesNumSeqCC2[i];
     
    range NumPochesNumSeqCC1= 1..NbtotalPochesCC1;
    range NumPochesNumSeqCC2= 1..NbtotalPochesCC2;
     
    int M1= (NbtotalPochesCC1+ NbtotalPochesCC2 + 1) div 2;
    int M2= (NbtotalPochesCC1 + NbtotalPochesCC2) div 2;
     
    range m1= 1..M1;
    range m2= 1..M2;
     
    //DECISION VARIABLES
    dvar boolean z1Seq1[NumPochesNumSeqCC1, m1]; //in 0..1;
    dvar boolean z1Seq2[NumPochesNumSeqCC2, m1]; //in 0..1;
    dvar boolean z2Seq1[NumPochesNumSeqCC1, m2]; //in 0..1;
    dvar boolean z2Seq2[NumPochesNumSeqCC2, m2]; //in 0..1;
     
    dvar float+ StartTime1[NumPochesNumSeqCC1,Machines];
    dvar float+ StartTime2[NumPochesNumSeqCC2,Machines];
    dvar float+ ProcessTime1[NumPochesNumSeqCC1];
    dvar float+ ProcessTime2[NumPochesNumSeqCC2];
     
    dvar float+ InterSequenceTime1[NumPochesNumSeqCC1]; //setup1
    dvar float+ InterSequenceTime2[NumPochesNumSeqCC2]; //setup2
     
    int delta1=...;
    int delta2=...;
    int DurationCV=...;
    int Transfer1=...;
    int Transfer2=...;
    int DurationEtap[1..2]=...;
     
    float MinProcessTime1[NumPochesNumSeqCC1]=...;
    float MaxProcessTime1[NumPochesNumSeqCC1]=...;
    float MinProcessTime2[NumPochesNumSeqCC2]=...;
    float MaxProcessTime2[NumPochesNumSeqCC2]=...;
     
    int MaxSojourn[1..2]=...;
     
    float Max1=...;
    float Max2=...;
     
    int InitialStart1[1..2]=...;
    int InitialStart2[1..2]=...;
     
    int MinInterSequence1=...;
    int MaxInterSequence1=...;
    int MinInterSequence2=...;
    int MaxInterSequence2=...;
     
    int Indice1[1..NombreSeqCC[1]]=...;
    int Indice2[1..NombreSeqCC[2]]=...;
     
    //OBJECTIVE
    minimize
    StartTime1[NbtotalPochesCC1,3] + ProcessTime1[NbtotalPochesCC1]+ StartTime2[NbtotalPochesCC2,3]+
    ProcessTime2[NbtotalPochesCC2];
     
     
     
    //CONSTRAINTS
    subject to{
    Max1 == (sum(i in NumPochesNumSeqCC1) (StartTime1[i,3] - StartTime1[i,1] - DurationCV)/ NbtotalPochesCC1);
    Max2 == (sum(i in NumPochesNumSeqCC2) (StartTime2[i,3] - StartTime2[i,1] - DurationCV)/ NbtotalPochesCC2);
     
     
    forall(i in NumPochesNumSeqCC1)
    sum(j in m1) z1Seq1[i,j] + sum(j in m2) z2Seq1[i,j] == 1; //=
     
    forall(i in NumPochesNumSeqCC2)
    sum(j in m1) z1Seq2[i,j] + sum(j in m2) z2Seq2[i,j] == 1; //=
     
     
    forall(j in m1)
    sum (i in NumPochesNumSeqCC1) z1Seq1[i,j]+ sum (i in NumPochesNumSeqCC2) z1Seq2[i,j]==1; //=
    forall(j in m2)
    sum (i in NumPochesNumSeqCC1) z2Seq1[i,j]+ sum (i in NumPochesNumSeqCC2) z2Seq2[i,j]==1; //=
     
     
    forall(i in 1..NbtotalPochesCC1-1){
       forall(t in 1..M1-1)
           z1Seq1[i+1,t+1]<= sum(j in 1..t) z1Seq1[i,j]+ sum(j in 1..t) z2Seq1[i,j];
    }
    forall(i in 1..NbtotalPochesCC1-1){
       forall(t in 1..M2)
           z2Seq1[i+1,t]<= sum(j in 1..t)(z1Seq1[i,j]) + sum(j in 1..t)(z2Seq1[i,j])- z2Seq1[i,t];
    }
    forall(i in 1..NbtotalPochesCC2-1){
       forall(t in 1..M1-1)
          z1Seq2[i+1,t+1]<= sum(j in 1..t)(z1Seq2[i,j]) + sum(j in 1..t)(z2Seq2[i,j]);
    }
    forall(i in 1..NbtotalPochesCC2-1){
       forall(t in 1..M2)
          z2Seq2[i+1,t]<= sum(j in 1..t)(z1Seq2[i,j]) + sum(j in 1..t)(z2Seq2[i,j])- z2Seq2[i,t];      
       z1Seq1[1,1]+z1Seq2[1,1]==1; //=
    }
     
    forall(i in NumPochesNumSeqCC1)
       StartTime1[i,1] == sum(j in m1) (delta1 + DurationCV*(j-1))*z1Seq1[i,j]+
       sum(j in m2) (delta2 + DurationCV*(j-1))*z2Seq1[i,j];
    forall(i in NumPochesNumSeqCC2)
       StartTime2[i,1]== sum(j in m1) (delta1 + DurationCV*(j-1))*z1Seq2[i,j]+
       sum(j in m2) (delta2 + DurationCV*(j-1))*z2Seq2[i,j];   
       
    forall(i in NumPochesNumSeqCC1)
       StartTime1[i,2] >= StartTime1[i,1]+DurationCV+Transfer1;
    forall(i in NumPochesNumSeqCC2)
       StartTime2[i,2] >= StartTime2[i,1]+DurationCV+Transfer1;
     
    forall(i in NumPochesNumSeqCC1)
       StartTime1[i,3] >= StartTime1[i,2]+DurationEtap[1]+Transfer2;
    forall(i in NumPochesNumSeqCC2)
       StartTime2[i,3] >= StartTime2[i,2]+DurationEtap[2]+Transfer2;
     
     
    forall(i in 1..NbtotalPochesCC1-1)
       StartTime1[i+1,2] >= StartTime1[i,2]+DurationEtap[1];
    forall(i in 1..NbtotalPochesCC2-1)
       StartTime2[i+1,2] >= StartTime2[i,2]+DurationEtap[2];
     
    forall(k in 1..NombreSeqCC[1])
       forall(i in 1..NbPochesNumSeqCC1[k]-1)
          StartTime1[Indice1[k] + i+1,3] == StartTime1[Indice1[k]+i,3] + ProcessTime1[Indice1[k]+i];
                  
    forall(k in 1..NombreSeqCC[2])
       forall(i in 1..NbPochesNumSeqCC2[k]-1)
          StartTime2[Indice2[k] +i +1,3] == StartTime2[Indice2[k] +i,3] + ProcessTime2[Indice2[k]+i];
     
    forall(k in 1..NombreSeqCC[1]-1)
       StartTime1[Indice1[k] + NbPochesNumSeqCC1[k]+1,3]==
       StartTime1[Indice1[k] + NbPochesNumSeqCC1[k],3]+
       ProcessTime1[Indice1[k]+NbPochesNumSeqCC1[k]]+
       InterSequenceTime1[Indice1[k]+NbPochesNumSeqCC1[k]];     
    forall(k in 1..NombreSeqCC[2]-1)
       StartTime2[Indice2[k] + NbPochesNumSeqCC2[k]+1,3]==
       StartTime2[Indice2[k] + NbPochesNumSeqCC2[k],3]+
       ProcessTime2[Indice2[k]+NbPochesNumSeqCC2[k]]+
       InterSequenceTime2[Indice2[k]+NbPochesNumSeqCC2[k]];   
          
     
    forall(i in NumPochesNumSeqCC1)
       MinProcessTime1[i] <= ProcessTime1[i] <= MaxProcessTime1[i];   
    forall(i in NumPochesNumSeqCC2)
       MinProcessTime2[i] <= ProcessTime2[i] <= MaxProcessTime2[i];
       
    forall(i in NumPochesNumSeqCC1)
    StartTime1[i,3] - StartTime1[i,1] - DurationCV <= MaxSojourn[1];
    forall(i in NumPochesNumSeqCC2)
    StartTime2[i,3] - StartTime2[i,1] - DurationCV <= MaxSojourn[2];
     
     
    InitialStart1[1] <= StartTime1[1,3] <= InitialStart1[2];
    InitialStart2[1] <= StartTime2[1,3] <= InitialStart2[2];
     
     
    forall(i in 2..NbtotalPochesCC1)
    MinInterSequence1 <= InterSequenceTime1[i] <= MaxInterSequence1;
    forall(i in 2..NbtotalPochesCC2)
    MinInterSequence2 <= InterSequenceTime2[i] <= MaxInterSequence2;
     
    };

    execute
    {
     
    writeln( StartTime1);
    writeln( StartTime2);
    writeln( ProcessTime1);
    writeln( ProcessTime2);
     
    writeln( InterSequenceTime1);
    writeln( InterSequenceTime2);
     
    writeln( (StartTime1[NbtotalPochesCC1][3]+ProcessTime1[NbtotalPochesCC1]));
    writeln( (StartTime2[NbtotalPochesCC2][3]+ProcessTime2[NbtotalPochesCC2]));
     
    writeln( Max1);
    writeln( Max2);
     
    writeln( (StartTime1[1][3]-InitialStart1[1]));

    }


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 3.  Re: I cannot debugg the following OPL code

    Posted 12/25/13 03:27 PM

    Originally posted by: Abdelkader


    Hi Alex,

     

    I've got your reply and so many thanks to the woork you've done. 

    I'll copy it and will run it. Hopefully it will work. I'll let you know if it is ok.

    Once again many thnaks to your contribution.

     

    Best wishes and merry christmas,

    Abdelkader


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 4.  Re: I cannot debugg the following OPL code

    Posted 12/25/13 03:52 PM

    Originally posted by: Abdelkader


    Hi Alex,

     

    I've run the code and the only found errors (or buggs) are related to

    float Max1=...;

    float Max2=...;

    .......

    Max1 == (sum(i in NumPochesNumSeqCC1) (StartTime1[i,3] - StartTime1[i,1] - DurationCV)/ NbtotalPochesCC1);
    Max2 == (sum(i in NumPochesNumSeqCC2) (StartTime2[i,3] - StartTime2[i,1] - DurationCV)/ NbtotalPochesCC2);

     

    But when I ignore these lines, the code seems to work with some warnings but it is running. 

    The problem is that these two floats are complusory otherwise the model isn't what I'm working in;

     

    Have you an idea ?

    Cheers,

     

     

     

     

    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 5.  Re: I cannot debugg the following OPL code

    Posted 12/25/13 05:13 PM

    Hi,

    can you attach the .dat you are using ?

    regards


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 6.  Re: I cannot debugg the following OPL code

    Posted 12/25/13 05:54 PM

    Originally posted by: Abdelkader


    Hi,

     

    I've attached the file as requested. The error messages are about float Max1 and Float Max2 where the message in french is:

    ``la donnée élémentaire externe "Max1" n'a pas été défine''. The same for Max2.

    For summary: these are the entire message errors, I also  have attached a printed screen

     

     

    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 7.  Re: I cannot debugg the following OPL code

    Posted 12/25/13 07:10 PM

    Originally posted by: Abdelkader


    Hi again,

     

    I've tried an alternative solution to fix the problem by replacing float Max1 and floatMax2 as dvar float Max1 end dvar float Max2. I run the code and no error at the end.

    Is it right to do such a change ?

    Thanks,

     

    Abdelkader

     


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 8.  Re: I cannot debugg the following OPL code

    Posted 12/26/13 01:29 AM

    Hi

    it depends whether Max1 and Max2 are decision variables or not.

    But you're right, they look like decision variables, since if not why displaying them at the end ?

    Regards


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 9.  Re: I cannot debugg the following OPL code

    Posted 12/26/13 04:21 AM

    Originally posted by: Abdelkader


    Hi Alex,

    Very nice. I spent the night starting my experimental tests.

    I don't know if you've taken a look to the .dat and the screen shot files I've attached in a pervious reply.

    If you did, what do you think? Is it OK to declare Max1 and Max2 as dvar float ?

     

    Any way many thanks to ypur contribution fixing this issue. I was stuck before you gave me your solution.

    Good guy you are.

     

    Take care and keep in touch,

     

    Abdelkader

     

     


    #DecisionOptimization
    #OPLusingCPLEXOptimizer