Decision Optimization

Decision Optimization

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

 View Only
  • 1.  Flow control

    Posted Wed October 25, 2017 10:38 AM

    Originally posted by: user1234567


    I have 2 parts in my code: The first one is used for assignment , and the second is used for scheduling. 

    I get this result: 0E0 !! When i should get a result which is better than the monolevel part (without division into 2 parts).

    when i run it in one part (before deviding it into two parts), it works well.

     

    First part: (.MOD)

     using CP;
     
    int L = 1000;
     
    tuple paramsT{
    int nbJobs;
    int nbMchs;
    int nbOper;
    int nbOpertotal;
    };
     
    paramsT Params = ...;
    int nbJobs = Params.nbJobs;
    int nbMchs = Params.nbMchs;
    int nbOper = Params.nbOper;
    int nbOpertotal = Params.nbOpertotal;
     
     
    range Jobs = 1..nbJobs;
    range Mchs = 1..nbMchs; 
    range Oper = 1..nbOper; 
    range Opertotal = 1..nbOpertotal; 
     
     
    tuple Operation {
      int id;    // Operation id
      int jobId; // Job id
      int pos;   // Position in job
    };
     
    tuple Mode {
      int opId; // Operation id
      int jobId;
      int mch;  // Machine
      int pt;   // Processing time
    };
     
    {Operation} Ops   = ...;
    {Mode}      Modes = ...;
     
     
     
    // Position of last operation of job j
    int jlast[j in Jobs] = max(o in Ops: o.jobId==j) o.pos;
     
    dvar interval ops  [Ops]; 
    dvar interval modes[md in Modes] optional size md.pt;
    dvar sequence mchs[m in Mchs] in all(md in Modes: md.mch == m) modes[md];
     
    dvar int c[i in Jobs][j in Oper][k in Mchs] in 0..1000 ;
    dvar int s[i in Jobs][j in Oper][k in Mchs] in 0..1000;
    int p[i in Jobs][j in Oper][k in Mchs];
     
     
    int c1[i in Jobs];
     
    dvar int r[u in Opertotal][k in Mchs];
     
     dvar boolean X[i in Jobs][j in Oper][k in Mchs];
     dvar int+ e[i in Jobs][j in Oper][k in Mchs];
     dvar boolean y[i1 in Jobs][j1 in Oper][i2 in Jobs][j2 in Oper][k in Mchs];
     
     
    execute {
      cp.param.FailLimit = 10000;
    }
     
    minimize staticLex(max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]),-sum(i in Jobs,j in Oper, k in Mchs) s[i][j][k]);
    subject to {
     
     
     
    forall (i in Jobs, j in Oper,o in Ops, md in Modes: md.jobId==i && md.opId==j && md.opId == o.id)
    sum (k in Mchs) X[i][j][k] == 1;
     
    forall (i in Jobs, j in Oper, k in Mchs)
      sum (i in Jobs, j in Oper) X[i][j][k] <= e[i][j][k];
     
    forall (i in Jobs,j in Oper, o in Ops, k in Mchs, 
    md in Modes: md.jobId==i && md.opId == j && md.mch == k && o.id==md.opId)
    ctc1:s[i][j][k] == startOf (modes[md]);
     
     
     
    forall (i in Jobs, j in Oper, o in Ops, k in Mchs, md in Modes: md.jobId == i && md.opId == j && md.mch == k && o.id==md.opId)
    ctc2:c[i][j][k] == endOf (modes[md]);  
     
    //C10
     forall (i in Jobs,j in Oper, o in Ops: o.pos==jlast[i])
     endOf(ops[o]) >= sum (k in Mchs) c[i][j][k];
     
      //C11
      forall (i in Jobs, o in Ops: o.pos==jlast[i])
      max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]) >=  endOf(ops[o]);
     
    //C12
    forall (i in Jobs,j in Oper, k in Mchs)
      c[i][j][k] >= 0;
     
    forall (i in Jobs, j in Oper, k in Mchs)
      s[i][j][k] >= 0;  
     
    forall (i in Jobs, j in Oper, k in Mchs)
      p[i][j][k] >= 0;  
     
     
      forall (j in Jobs, o1 in Ops, o2 in Ops: o1.jobId==j && o2.jobId==j && o2.pos==1+o1.pos)
     
      endOf (ops[o1]) <= startOf (ops[o2]);
     
    //Operations on a given machine m cannot overlap      
         forall (m in Mchs)
        noOverlap(mchs[m]);
     
     //Alternative machines for a given operation o    
      forall (o in Ops)
        alternative(ops[o], all(md in Modes: md.opId==o.id) modes[md]);
    }
     
     
    main {
    //Model for first essay
    var Modelt1Source = new IloOplModelSource("main-Bilevel-instance-brandimarte-10,6-MK01.mod");
    var Modelt1Def = new IloOplModelDefinition(Modelt1Source);
      var oplmodel1 = new IloOplModel(Modelt1Def, cp);
      var Modelt1data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
      oplmodel1.addDataSource(Modelt1data);
      oplmodel1.generate();
    cp.solve();
    var obj = cp.getObjValue();
    writeln("The Value of the Objective Function Value is (Total Cost): ", obj);
    writeln("Solving CPU Elapsed Time  in (Seconds): ", cp.getCpTime()); 
    oplmodel1.postProcess(); 
     
    var cp=new IloCp();
    //Model for second essay
     
    var Modelt2Source = new IloOplModelSource("Bilevel-instance-brandimarte-10,6-MK01.mod");
    var Modelt2Def = new IloOplModelDefinition(Modelt2Source);
      var oplmodel2 = new IloOplModel(Modelt2Def, cp2);
      var Modelt2data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
      oplmodel2.addDataSource(Modelt2data);
      oplmodel2.generate();
      writeln("cp solve gives",cp.solve()); 
     

     

    Second part: (.MOD)

     using CP;
     
    int L = 1000;
     
    tuple paramsT{
    int nbJobs;
    int nbMchs;
    int nbOper;
    int nbOpertotal;
    };
     
    paramsT Params = ...;
    int nbJobs = Params.nbJobs;
    int nbMchs = Params.nbMchs;
    int nbOper = Params.nbOper;
    int nbOpertotal = Params.nbOpertotal;
     
     
    range Jobs = 1..nbJobs;
    range Mchs = 1..nbMchs; 
    range Oper = 1..nbOper; 
    range Opertotal = 1..nbOpertotal; 
     
     
    tuple Operation {
      int id;    // Operation id
      int jobId; // Job id
      int pos;   // Position in job
    };
     
    tuple Mode {
      int opId; // Operation id
      int jobId;
      int mch;  // Machine
      int pt;   // Processing time
    };
     
    {Operation} Ops   = ...;
    {Mode}      Modes = ...;
     
     
     
    // Position of last operation of job j
    int jlast[j in Jobs] = max(o in Ops: o.jobId==j) o.pos;
     
    dvar interval ops  [Ops]; 
    dvar interval modes[md in Modes] optional size md.pt;
    dvar sequence mchs[m in Mchs] in all(md in Modes: md.mch == m) modes[md];
     
    dvar int c[i in Jobs][j in Oper][k in Mchs] in 0..1000 ;
    dvar int s[i in Jobs][j in Oper][k in Mchs] in 0..1000;
    int p[i in Jobs][j in Oper][k in Mchs];
     
     
    int c1[i in Jobs];
     
    dvar int r[u in Opertotal][k in Mchs];
     
     dvar boolean X[i in Jobs][j in Oper][k in Mchs];
     dvar int+ e[i in Jobs][j in Oper][k in Mchs];
     dvar boolean y[i1 in Jobs][j1 in Oper][i2 in Jobs][j2 in Oper][k in Mchs];
     
     
    execute {
      cp.param.FailLimit = 10000;
    }
     
    minimize staticLex(max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]),-sum(i in Jobs,j in Oper, k in Mchs) s[i][j][k]);
    subject to {
     
     
     
    forall (i in Jobs, j in Oper,o in Ops, md in Modes: md.jobId==i && md.opId==j && md.opId == o.id)
    sum (k in Mchs) X[i][j][k] == 1;
     
    forall (i in Jobs, j in Oper, k in Mchs)
      sum (i in Jobs, j in Oper) X[i][j][k] <= e[i][j][k];
     
    forall (i in Jobs,j in Oper, o in Ops, k in Mchs, 
    md in Modes: md.jobId==i && md.opId == j && md.mch == k && o.id==md.opId)
    ctc1:s[i][j][k] == startOf (modes[md]);
     
     
     
    forall (i in Jobs, j in Oper, o in Ops, k in Mchs, md in Modes: md.jobId == i && md.opId == j && md.mch == k && o.id==md.opId)
    ctc2:c[i][j][k] == endOf (modes[md]);  
     
    //C10
     forall (i in Jobs,j in Oper, o in Ops: o.pos==jlast[i])
     endOf(ops[o]) >= sum (k in Mchs) c[i][j][k];
     
      //C11
      forall (i in Jobs, o in Ops: o.pos==jlast[i])
      max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]) >=  endOf(ops[o]);
     
    //C12
    forall (i in Jobs,j in Oper, k in Mchs)
      c[i][j][k] >= 0;
     
    forall (i in Jobs, j in Oper, k in Mchs)
      s[i][j][k] >= 0;  
     
    forall (i in Jobs, j in Oper, k in Mchs)
      p[i][j][k] >= 0;  
     
     
      forall (j in Jobs, o1 in Ops, o2 in Ops: o1.jobId==j && o2.jobId==j && o2.pos==1+o1.pos)
     
      endOf (ops[o1]) <= startOf (ops[o2]);
     
    //Operations on a given machine m cannot overlap      
         forall (m in Mchs)
        noOverlap(mchs[m]);
     
     //Alternative machines for a given operation o    
      forall (o in Ops)
        alternative(ops[o], all(md in Modes: md.opId==o.id) modes[md]);
    }
     
     
    main {
    //Model for first essay
    var Modelt1Source = new IloOplModelSource("main-Bilevel-instance-brandimarte-10,6-MK01.mod");
    var Modelt1Def = new IloOplModelDefinition(Modelt1Source);
      var oplmodel1 = new IloOplModel(Modelt1Def, cp);
      var Modelt1data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
      oplmodel1.addDataSource(Modelt1data);
      oplmodel1.generate();
    cp.solve();
    var obj = cp.getObjValue();
    writeln("The Value of the Objective Function Value is (Total Cost): ", obj);
    writeln("Solving CPU Elapsed Time  in (Seconds): ", cp.getCpTime()); 
    oplmodel1.postProcess(); 
     
    var cp=new IloCp();
    //Model for second essay
     
    var Modelt2Source = new IloOplModelSource("Bilevel-instance-brandimarte-10,6-MK01.mod");
    var Modelt2Def = new IloOplModelDefinition(Modelt2Source);
      var oplmodel2 = new IloOplModel(Modelt2Def, cp2);
      var Modelt2data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
      oplmodel2.addDataSource(Modelt2data);
      oplmodel2.generate();
      writeln("cp solve gives",cp.solve()); 
     

     

    .DAT:

     Params = <10, 6, 3, 115>;

    Ops = {
      <1,1,0>,
      <2,1,1>,
      <3,1,2>,
      <4,1,3>,
      <5,1,4>,
      <6,1,5>,
       
      <7,2,0>,
      <8,2,1>,
      <9,2,2>,
      <10,2,3>,
      <11,2,4>,
      
      <12,3,0>,
      <13,3,1>,
      <14,3,2>,
      <15,3,3>,
      <16,3,4>,
      
      <17,4,0>,
      <18,4,1>,
      <19,4,2>,
      <20,4,3>,
      <21,4,4>,
     
      <22,5,0>,
      <23,5,1>,
      <24,5,2>,
      <25,5,3>,
      <26,5,4>,
      <27,5,5>,
      
      <28,6,0>,
      <29,6,1>,
      <30,6,2>,
      <31,6,3>,
      <32,6,4>,
      <33,6,5>,
      
      <34,7,0>,
      <35,7,1>,
      <36,7,2>,
      <37,7,3>,
      <38,7,4>,
      
      <39,8,0>,
      <40,8,1>,
      <41,8,2>,
      <42,8,3>,
      <43,8,4>,
      
      <44,9,0>,
      <45,9,1>,
      <46,9,2>,
      <47,9,3>,
      <48,9,4>,
      <49,9,5>,

      <50,10,0>,
      <51,10,1>,
      <52,10,2>,
      <53,10,3>,
      <54,10,4>,
      <55,10,5>,

     
     
    };

    Modes = {

    //job 1
      <1,1,1,5>,
      <1,1,3,4>,
      
      <2,1,5,3>,
      <2,1,3,5>,
      <2,1,2,1>,
       
      <3,1,3,4>,
      <3,1,6,2>,
        
      <4,1,6,5>,
      <4,1,2,6>,
      <4,1,1,1>,
     
      <5,1,3,1>,
      
      <6,1,6,6>,
      <6,1,3,6>,
      <6,1,4,3>,
        
     //job 2
      <7,2,2,6>,
      
      <8,2,3,1>,
     
      <9,2,1,2>, 
      
      <10,2,2,6>, 
      <10,2,4,6>, 

      <11,2,6,5>, 
      <11,2,2,6>, 
      <11,2,1,1>, 
     
    //job 3

      <12,3,2,6>,
      
      <13,3,3,4>,
      <13,3,6,2>,
      
      <14,3,6,5>,
      <14,3,2,6>,
      <14,3,1,1>,

      <15,3,3,4>,
      <15,3,2,6>,
      <15,3,6,6>,

      <16,3,1,1>,
      <16,3,5,5>,

    //job 4

      <17,3,6,5>,
      <17,3,2,6>,
      <17,3,1,1>,
      
      <18,3,2,6>,

      <19,3,3,1>,
      
      <20,3,5,3>,
      <20,3,3,5>,
      <20,3,2,1>,

      <21,3,3,4>,
      <21,3,6,2>,

    //job 5

      <22,5,5,3>,
      <22,5,3,5>,
      <22,5,2,1>,

      <23,5,6,5>,
      <23,5,2,6>,
      <23,5,1,1>,
      
      <24,5,2,6>,
      
      <25,5,1,5>,
      <25,5,3,4>,

      <26,5,2,6>,
      <26,5,4,6>,
      
      <27,5,3,4>,
      <27,5,2,6>,
      <27,5,6,6>,

    //job 6

      <28,6,3,4>,
      <28,6,6,2>,

      <29,6,1,2>,
      
      <30,6,3,4>,
      <30,6,2,6>,
      <30,6,6,6>,
      
      <31,6,2,6>,

      <32,6,6,5>,
      <32,6,2,6>,
      <32,6,1,1>,
      
      <33,6,1,3>,
      <33,6,4,2>,

    //job 7

      <34,7,6,1>,
      
      <35,7,1,3>,
      <35,7,4,2>,

      <36,7,3,4>,
      <36,7,2,6>,
      <36,7,6,6>,

      <37,7,2,6>,
      <37,7,5,1>,
      <37,7,1,6>,

      <38,7,3,1>,
      
      //job 8

      <39,8,3,4>,
      <39,8,6,2>,
      
      <40,8,3,4>,
      <40,8,2,6>,
      <40,8,6,6>, 
      
      <41,8,6,5>,
      <41,8,2,6>,
      <41,8,1,1>,
      
      <42,8,2,6>, 
      
      <43,8,2,6>,    
      <43,8,4,6>, 
        
      //job 9
     
      <44,9,6,1>,
      
      <45,9,1,1>,
      <45,9,5,5>,
      
      <46,9,6,6>,
      <46,9,3,6>,
      <46,9,4,3>,
      
      <47,9,1,2>, 
      
      <48,9,3,4>,    
      <48,9,2,6>, 
      <48,9,6,6>,   
     
      <49,9,2,6>, 
      <49,9,4,6>,   
      
        //job 10
     
      <50,10,3,4>,
      <50,10,6,2>,
      
      <51,10,3,4>,
      <51,10,2,6>,
      <51,10,6,6>,
      
      <52,10,5,3>,
      <52,10,3,5>,
      <52,10,2,1>,
      
      <53,10,6,1>, 
      
      <54,10,2,6>,    
      <54,10,4,6>, 
     
      <55,10,1,3>, 
      <55,10,4,2>,   
    };

     

    Please help me to get a feasible result. Thank you.


    #CPLEXOptimizers
    #DecisionOptimization


  • 2.  Re: Flow control

    Posted Wed October 25, 2017 11:19 AM

    Originally posted by: user1234567


    The program should make the assignment first (in part 2). Then, according to this assignment, it should generate the corresonding scheduling (in part 1). 


    #CPLEXOptimizers
    #DecisionOptimization


  • 3.  Re: Flow control



  • 4.  Re: Flow control

    Posted Thu October 26, 2017 04:26 PM

    Originally posted by: user1234567


    No, it's not helpful unfortunately! i relied on your link to do this work. But, it doesn't work.

    Please try to focus on my example and tell me why it doesn't work.

    I tried to reduce the number of constraints:

    .MOD (first model)

     using CP;
     
    int L = 1000;
     
    tuple paramsT{
    int nbJobs;
    int nbMchs;
    int nbOper;
    int nbOpertotal;
    };
     
    paramsT Params = ...;
    int nbJobs = Params.nbJobs;
    int nbMchs = Params.nbMchs;
    int nbOper = Params.nbOper;
    int nbOpertotal = Params.nbOpertotal;
     
     
    range Jobs = 1..nbJobs;
    range Mchs = 1..nbMchs; 
    range Oper = 1..nbOper; 
    range Opertotal = 1..nbOpertotal; 
     
     
    tuple Operation {
      int id;    // Operation id
      int jobId; // Job id
      int pos;   // Position in job
    };
     
    tuple Mode {
      int opId; // Operation id
      int jobId;
      int mch;  // Machine
      int pt;   // Processing time
    };
     
    {Operation} Ops   = ...;
    {Mode}      Modes = ...;
     
     
     
    // Position of last operation of job j
    int jlast[j in Jobs] = max(o in Ops: o.jobId==j) o.pos;
     
    dvar interval ops  [Ops]; 
    dvar interval modes[md in Modes] optional size md.pt;
    dvar sequence mchs[m in Mchs] in all(md in Modes: md.mch == m) modes[md];
     
    dvar int c[i in Jobs][j in Oper][k in Mchs] in 0..1000 ;
    dvar int s[i in Jobs][j in Oper][k in Mchs] in 0..1000;
    int p[i in Jobs][j in Oper][k in Mchs];
     
     
    int c1[i in Jobs];
     
    dvar int r[u in Opertotal][k in Mchs];
     
     dvar boolean X[i in Jobs][j in Oper][k in Mchs];
     dvar int+ e[i in Jobs][j in Oper][k in Mchs];
     dvar boolean y[i1 in Jobs][j1 in Oper][i2 in Jobs][j2 in Oper][k in Mchs];
     
     
    execute {
      cp.param.FailLimit = 10000;
    }
     
    minimize staticLex(max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]),-sum(i in Jobs,j in Oper, k in Mchs) s[i][j][k]);
    subject to {


    //Operations on a given machine m cannot overlap      
         forall (m in Mchs)
        noOverlap(mchs[m]);
     
     //Alternative machines for a given operation o    
      forall (o in Ops)
        alternative(ops[o], all(md in Modes: md.opId==o.id) modes[md]);    
    }
     
    execute {
      for (var m in Modes) {
        if (modes[m].present)
          writeln("Operation " + m.opId + "of job" +m.jobId+ " on machine " + m.mch + " starting at " + modes[m].start+ "and ends at" +modes[m].end);
          
           
      }
    }
     
    tuple solutionT{
    int operation;
    int job;
    int machine;
    int start;
    int end;
    };
    {solutionT} solution = {<m.opId, m.jobId, m.mch, startOf(modes[m]), endOf(modes[m])> | m in Modes};

     

    .MOD (second model)

     using CP;
     
    int L = 1000;
     
    tuple paramsT{
    int nbJobs;
    int nbMchs;
    int nbOper;
    int nbOpertotal;
    };
     
    paramsT Params = ...;
    int nbJobs = Params.nbJobs;
    int nbMchs = Params.nbMchs;
    int nbOper = Params.nbOper;
    int nbOpertotal = Params.nbOpertotal;
     
     
    range Jobs = 1..nbJobs;
    range Mchs = 1..nbMchs; 
    range Oper = 1..nbOper; 
    range Opertotal = 1..nbOpertotal; 
     
     
    tuple Operation {
      int id;    // Operation id
      int jobId; // Job id
      int pos;   // Position in job
    };
     
    tuple Mode {
      int opId; // Operation id
      int jobId;
      int mch;  // Machine
      int pt;   // Processing time
    };
     
    {Operation} Ops   = ...;
    {Mode}      Modes = ...;
     
     
     
    // Position of last operation of job j
    int jlast[j in Jobs] = max(o in Ops: o.jobId==j) o.pos;
     
    dvar interval ops  [Ops]; 
    dvar interval modes[md in Modes] optional size md.pt;
    dvar sequence mchs[m in Mchs] in all(md in Modes: md.mch == m) modes[md];
     
    dvar int c[i in Jobs][j in Oper][k in Mchs] in 0..1000 ;
    dvar int s[i in Jobs][j in Oper][k in Mchs] in 0..1000;
    int p[i in Jobs][j in Oper][k in Mchs];
     
     
    int c1[i in Jobs];
     
    dvar int r[u in Opertotal][k in Mchs];
     
     dvar boolean X[i in Jobs][j in Oper][k in Mchs];
     dvar int+ e[i in Jobs][j in Oper][k in Mchs];
     dvar boolean y[i1 in Jobs][j1 in Oper][i2 in Jobs][j2 in Oper][k in Mchs];
     
     
    execute {
      cp.param.FailLimit = 10000;
    }
     
    minimize staticLex(max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]),-sum(i in Jobs,j in Oper, k in Mchs) s[i][j][k]);
    subject to {
     
      //Precedence constraint
      forall (j in Jobs, o1 in Ops, o2 in Ops: o1.jobId==j && o2.jobId==j && o2.pos==1+o1.pos)
      endBeforeStart(ops[o1],ops[o2]); 
     
         
    }
     
    execute {
      for (var m in Modes) {
        if (modes[m].present)
          writeln("Operation " + m.opId + "of job" +m.jobId+ " on machine " + m.mch + " starting at " + modes[m].start+ "and ends at" +modes[m].end);
          
           
      }
    }
     
    main {
    //Model for first essay
    var Modelt1Source = new IloOplModelSource("Bilevel-instance-brandimarte-10,6-MK01.mod");
    var Modelt1Def = new IloOplModelDefinition(Modelt1Source);
      var oplmodel1 = new IloOplModel(Modelt1Def, cp);
      var Modelt1data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
      oplmodel1.addDataSource(Modelt1data);
      oplmodel1.generate();
    cp.solve();
    var obj = cp.getObjValue();
    writeln("The Value of the Objective Function Value is (Total Cost): ", obj);
    writeln("Solving CPU Elapsed Time  in (Seconds): ", cp.getCpTime()); 
    oplmodel1.postProcess(); 
     
    var cp=new IloCp();
    //Model for second essay
     
    var Modelt2Source = new IloOplModelSource("main-Bilevel-instance-brandimarte-10,6-MK01.mod");
    var Modelt2Def = new IloOplModelDefinition(Modelt2Source);
      var oplmodel2 = new IloOplModel(Modelt2Def, cp2);
      var Modelt2data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
      oplmodel2.addDataSource(Modelt2data);
      oplmodel2.generate();
      writeln("cp solve gives",cp.solve()); 
     

     

    .DAT (Data for the 2 models)

     Params = <10, 6, 3, 115>;

    Ops = {
      <1,1,0>,
      <2,1,1>,
      <3,1,2>,
      <4,1,3>,
      <5,1,4>,
      <6,1,5>,
       
      <7,2,0>,
      <8,2,1>,
      <9,2,2>,
      <10,2,3>,
      <11,2,4>,
      
      <12,3,0>,
      <13,3,1>,
      <14,3,2>,
      <15,3,3>,
      <16,3,4>,
      
      <17,4,0>,
      <18,4,1>,
      <19,4,2>,
      <20,4,3>,
      <21,4,4>,
     
      <22,5,0>,
      <23,5,1>,
      <24,5,2>,
      <25,5,3>,
      <26,5,4>,
      <27,5,5>,
      
      <28,6,0>,
      <29,6,1>,
      <30,6,2>,
      <31,6,3>,
      <32,6,4>,
      <33,6,5>,
      
      <34,7,0>,
      <35,7,1>,
      <36,7,2>,
      <37,7,3>,
      <38,7,4>,
      
      <39,8,0>,
      <40,8,1>,
      <41,8,2>,
      <42,8,3>,
      <43,8,4>,
      
      <44,9,0>,
      <45,9,1>,
      <46,9,2>,
      <47,9,3>,
      <48,9,4>,
      <49,9,5>,

      <50,10,0>,
      <51,10,1>,
      <52,10,2>,
      <53,10,3>,
      <54,10,4>,
      <55,10,5>,

     
     
    };

    Modes = {

    //job 1
      <1,1,1,5>,
      <1,1,3,4>,
      
      <2,1,5,3>,
      <2,1,3,5>,
      <2,1,2,1>,
       
      <3,1,3,4>,
      <3,1,6,2>,
        
      <4,1,6,5>,
      <4,1,2,6>,
      <4,1,1,1>,
     
      <5,1,3,1>,
      
      <6,1,6,6>,
      <6,1,3,6>,
      <6,1,4,3>,
        
     //job 2
      <7,2,2,6>,
      
      <8,2,3,1>,
     
      <9,2,1,2>, 
      
      <10,2,2,6>, 
      <10,2,4,6>, 

      <11,2,6,5>, 
      <11,2,2,6>, 
      <11,2,1,1>, 
     
    //job 3

      <12,3,2,6>,
      
      <13,3,3,4>,
      <13,3,6,2>,
      
      <14,3,6,5>,
      <14,3,2,6>,
      <14,3,1,1>,

      <15,3,3,4>,
      <15,3,2,6>,
      <15,3,6,6>,

      <16,3,1,1>,
      <16,3,5,5>,

    //job 4

      <17,3,6,5>,
      <17,3,2,6>,
      <17,3,1,1>,
      
      <18,3,2,6>,

      <19,3,3,1>,
      
      <20,3,5,3>,
      <20,3,3,5>,
      <20,3,2,1>,

      <21,3,3,4>,
      <21,3,6,2>,

    //job 5

      <22,5,5,3>,
      <22,5,3,5>,
      <22,5,2,1>,

      <23,5,6,5>,
      <23,5,2,6>,
      <23,5,1,1>,
      
      <24,5,2,6>,
      
      <25,5,1,5>,
      <25,5,3,4>,

      <26,5,2,6>,
      <26,5,4,6>,
      
      <27,5,3,4>,
      <27,5,2,6>,
      <27,5,6,6>,

    //job 6

      <28,6,3,4>,
      <28,6,6,2>,

      <29,6,1,2>,
      
      <30,6,3,4>,
      <30,6,2,6>,
      <30,6,6,6>,
      
      <31,6,2,6>,

      <32,6,6,5>,
      <32,6,2,6>,
      <32,6,1,1>,
      
      <33,6,1,3>,
      <33,6,4,2>,

    //job 7

      <34,7,6,1>,
      
      <35,7,1,3>,
      <35,7,4,2>,

      <36,7,3,4>,
      <36,7,2,6>,
      <36,7,6,6>,

      <37,7,2,6>,
      <37,7,5,1>,
      <37,7,1,6>,

      <38,7,3,1>,
      
      //job 8

      <39,8,3,4>,
      <39,8,6,2>,
      
      <40,8,3,4>,
      <40,8,2,6>,
      <40,8,6,6>, 
      
      <41,8,6,5>,
      <41,8,2,6>,
      <41,8,1,1>,
      
      <42,8,2,6>, 
      
      <43,8,2,6>,    
      <43,8,4,6>, 
        
      //job 9
     
      <44,9,6,1>,
      
      <45,9,1,1>,
      <45,9,5,5>,
      
      <46,9,6,6>,
      <46,9,3,6>,
      <46,9,4,3>,
      
      <47,9,1,2>, 
      
      <48,9,3,4>,    
      <48,9,2,6>, 
      <48,9,6,6>,   
     
      <49,9,2,6>, 
      <49,9,4,6>,   
      
        //job 10
     
      <50,10,3,4>,
      <50,10,6,2>,
      
      <51,10,3,4>,
      <51,10,2,6>,
      <51,10,6,6>,
      
      <52,10,5,3>,
      <52,10,3,5>,
      <52,10,2,1>,
      
      <53,10,6,1>, 
      
      <54,10,2,6>,    
      <54,10,4,6>, 
     
      <55,10,1,3>, 
      <55,10,4,2>,   
    };

     

    First, cplex should make the assignment of operations : 

         forall (m in Mchs)
        noOverlap(mchs[m]);
     
      forall (o in Ops)
        alternative(ops[o], all(md in Modes: md.opId==o.id) modes[md]);  

     

    Then, it should make the corresponding scheduling of these assignments by the command: 

      forall (j in Jobs, o1 in Ops, o2 in Ops: o1.jobId==j && o2.jobId==j && o2.pos==1+o1.pos)
      endBeforeStart(ops[o1],ops[o2]); 

     

    That's why i devided these commands into 2 models.

     

    Here, cplex displays the result 12 which is not correct, because when i write all the constraints in one model, i get the result 42.

    So, does cplex considers the 2 models, and excecutes them correctly ? Or is there any mistake in my code ?

     

    Thank you.


    #CPLEXOptimizers
    #DecisionOptimization


  • 5.  Re: Flow control

    Posted Fri October 27, 2017 01:48 AM

    Hi,

    in the second part of your main you wrote

    var Modelt2Source = new IloOplModelSource("main-Bilevel-instance-brandimarte-10,6-MK01.mod");
    var Modelt2Def = new IloOplModelDefinition(Modelt2Source);
      var oplmodel2 = new IloOplModel(Modelt2Def, cp2);
      var Modelt2data = new IloOplDataSource("Bilevel-instance-brandimarte-10,6-MK01 (Data).dat");
      oplmodel2.addDataSource(Modelt2data);
      oplmodel2.generate();
      writeln("cp solve gives",cp.solve()); 

    which looks a bit strange:

    writeln("cp solve gives",cp2.solve()); 

    would be better right ?

    Plus here you try to solve model1 and then solve model2 but not keep anything from the first model when you solve the second model. Is that what you try to do ?

    regards


    #CPLEXOptimizers
    #DecisionOptimization


  • 6.  Re: Flow control

    Posted Fri October 27, 2017 05:20 AM

    Originally posted by: user1234567


    Yes, you are right cp2 instead of cp. I corrected it. But, still the same result.

    The program should firstly assign each operation to one of its eligible machines. Then, should schedule these assigned operations.But, there is a link between these 2 models because the second model should rely on the first model in order to make the corresponding scheduling. In other words, the second model have to call the first model in oder to get the suitable result.

    In the normal examples of IBM Ilog cplex, the assignment and the scheduling are made in one model (so this is monolevel). But, here i'm trying to solve a bilevel problem. That's why i divided the model into 2 models (one for assignment, one for scheduling).

    So, what's wrong here ?


    #CPLEXOptimizers
    #DecisionOptimization


  • 7.  Re: Flow control

    Posted Fri October 27, 2017 06:18 AM

    Hi,

    you need to relate the second model with the first.

    And up to now you do not. You need to write that in the flow control: take this from solution in the first model and use that as input for the second model

    regards


    #CPLEXOptimizers
    #DecisionOptimization


  • 8.  Re: Flow control

    Posted Sun November 12, 2017 11:13 AM

    Originally posted by: user1234567


    This bilevel model Is correct ? I get the result of cmax = 902. Whereas, the (LB,UB) of the current instance (.DAT) is 756. So, it's a bit strange that i get a result of 902 with an exact method.

    what is wrong in my model ? Is there any(some) mistakes in the first or the second model ? Thank you

    //First model:

    using CP;
     
    int L = 1000;
     
    tuple paramsT{
    int nbJobs;
    int nbMchs;
    int nbOper;
    int nbOpertotal;
    };
     
    paramsT Params = ...;
    int nbJobs = Params.nbJobs;
    int nbMchs = Params.nbMchs;
    int nbOper = Params.nbOper;
    int nbOpertotal = Params.nbOpertotal;
     
     
    range Jobs = 1..nbJobs;
    range Mchs = 1..nbMchs; 
    range Oper = 1..nbOper; 
    range Opertotal = 1..nbOpertotal; 
     
     
    tuple Operation {
      int id;    // Operation id
      int jobId; // Job id
      int pos;   // Position in job
    };
     
    tuple Mode {
      int opId; // Operation id
      int jobId;
      int mch;  // Machine
      int pt;   // Processing time
    };
     
    {Operation} Ops   = ...;
    {Mode}      Modes = ...;
     
     
     
    // Position of last operation of job j
    int jlast[j in Jobs] = max(o in Ops: o.jobId==j) o.pos;
     
    dvar interval ops  [Ops]; 
    dvar interval modes[md in Modes] optional size md.pt;
    dvar sequence mchs[m in Mchs] in all(md in Modes: md.mch == m) modes[md];
     
    dvar int c[i in Jobs][j in Oper][k in Mchs] in 0..1000 ;
    dvar int s[i in Jobs][j in Oper][k in Mchs] in 0..1000;
    int p[i in Jobs][j in Oper][k in Mchs];
     
     
    int c1[i in Jobs];
     
    dvar int r[u in Opertotal][k in Mchs];
     
     dvar boolean X[i in Jobs][j in Oper][k in Mchs];
     dvar int+ e[i in Jobs][j in Oper][k in Mchs];
     dvar boolean y[i1 in Jobs][j1 in Oper][i2 in Jobs][j2 in Oper][k in Mchs];
     
     
    execute {
      cp.param.FailLimit = 10000;
    }
     
    minimize staticLex(max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]),-sum(i in Jobs,j in Oper, k in Mchs) s[i][j][k]);
    subject to {
     
     
     
    forall (i in Jobs, j in Oper,o in Ops, md in Modes: md.jobId==i && md.opId==j && md.opId == o.id)
    sum (k in Mchs) X[i][j][k] == 1;
     
    forall (i in Jobs, j in Oper, k in Mchs)
      sum (i in Jobs, j in Oper) X[i][j][k] <= e[i][j][k];
     
    forall (i in Jobs,j in Oper, o in Ops, k in Mchs, 
    md in Modes: md.jobId==i && md.opId == j && md.mch == k && o.id==md.opId)
    ctc1:s[i][j][k] == startOf (modes[md]);
     
     
     
    forall (i in Jobs, j in Oper, o in Ops, k in Mchs, md in Modes: md.jobId == i && md.opId == j && md.mch == k && o.id==md.opId)
    ctc2:c[i][j][k] == endOf (modes[md]);

     
     
     
    //C10
     forall (i in Jobs,j in Oper, o in Ops: o.pos==jlast[i])
     endOf(ops[o]) >= sum (k in Mchs) c[i][j][k];
     
      //C11
      forall (i in Jobs, o in Ops: o.pos==jlast[i])
      max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]) >=  endOf(ops[o]);
     
    //C12
    forall (i in Jobs,j in Oper, k in Mchs)
      c[i][j][k] >= 0;
     
    forall (i in Jobs, j in Oper, k in Mchs)
      s[i][j][k] >= 0;  
     
    forall (i in Jobs, j in Oper, k in Mchs)
      p[i][j][k] >= 0;  
     
     
     
     
     
      forall (j in Jobs, o1 in Ops, o2 in Ops: o1.jobId==j && o2.jobId==j && o2.pos==1+o1.pos)
     
      endOf (ops[o1]) <= startOf (ops[o2]);
      
      
     
        
      forall (o in Ops)
        alternative(ops[o], all(md in Modes: md.opId==o.id) modes[md]);
         
         forall (m in Mchs)
        noOverlap(mchs[m]);
      
     
     
    }
     
    execute {
      for (var m in Modes) {
        if (modes[m].present)
          writeln("Operation " + m.opId + "of job" +m.jobId+ " on machine " + m.mch + " starting at " + modes[m].start+ "and ends at" +modes[m].end);
          
           
      }
    }
     
    tuple solutionT{
    int operation;
    int job;
    int machine;
    int start;
    int end;
    };
    {solutionT} solution = {<m.opId, m.jobId, m.mch, startOf(modes[m]), endOf(modes[m])> | m in Modes};

     

    //Second model (main):

     using CP;
     
    int L = 1000;
     
    tuple paramsT{
    int nbJobs;
    int nbMchs;
    int nbOper;
    int nbOpertotal;
    };
     
    paramsT Params = ...;
    int nbJobs = Params.nbJobs;
    int nbMchs = Params.nbMchs;
    int nbOper = Params.nbOper;
    int nbOpertotal = Params.nbOpertotal;
     
     
    range Jobs = 1..nbJobs;
    range Mchs = 1..nbMchs; 
    range Oper = 1..nbOper; 
    range Opertotal = 1..nbOpertotal; 
     
     
    tuple Operation {
      int id;    // Operation id
      int jobId; // Job id
      int pos;   // Position in job
    };
     
    tuple Mode {
      int opId; // Operation id
      int jobId;
      int mch;  // Machine
      int pt;   // Processing time
    };
     
    {Operation} Ops   = ...;
    {Mode}      Modes = ...;
     
     
     
    // Position of last operation of job j
    int jlast[j in Jobs] = max(o in Ops: o.jobId==j) o.pos;
     
    dvar interval ops  [Ops]; 
    dvar interval modes[md in Modes] optional size md.pt;
    dvar sequence mchs[m in Mchs] in all(md in Modes: md.mch == m) modes[md];
     
    dvar int c[i in Jobs][j in Oper][k in Mchs] in 0..1000 ;
    dvar int s[i in Jobs][j in Oper][k in Mchs] in 0..1000;
    int p[i in Jobs][j in Oper][k in Mchs];
     
     
    int c1[i in Jobs];
     
    dvar int r[u in Opertotal][k in Mchs];
     
     dvar boolean X[i in Jobs][j in Oper][k in Mchs];
     dvar int+ e[i in Jobs][j in Oper][k in Mchs];
     dvar boolean y[i1 in Jobs][j1 in Oper][i2 in Jobs][j2 in Oper][k in Mchs];
     
     
    execute {
      cp.param.FailLimit = 10000;
    }
     
    minimize staticLex(max(i in Jobs, o in Ops: o.pos==jlast[i]) endOf(ops[o]),-sum(i in Jobs,j in Oper, k in Mchs) s[i][j][k]);
    subject to {
     
      //Precedence constraint
      forall (j in Jobs, o1 in Ops, o2 in Ops: o1.jobId==j && o2.jobId==j && o2.pos==1+o1.pos)
      endBeforeStart(ops[o1],ops[o2]); 
     
      forall (k in Mchs, i1 in Jobs, i2 in Jobs, j1 in Oper, j2 in Oper, o1 in Ops, o2 in Ops:  o2.pos==1+o1.pos && o1.jobId == i1 &&
       o1.id == j1 && o2.jobId == i2 && o2.id == j2, md1,md2 in Modes:  md1.mch == k && md1.opId == o1.id &&
        md2.mch==k && md2.opId==o2.id )
        sum (i1 in Jobs, j1 in Jobs:j1 in Oper) y[i1][j1][i2][j2][k] <= 1 ;
        
        forall (k in Mchs, i1 in Jobs, i2 in 0..0, j1 in Oper, j2 in 1..1, o1 in Ops, o2 in Ops:  o2.pos==1+o1.pos && o1.jobId == i1 &&
       o1.id == j1 && o2.jobId == i2 && o2.id == j2, md1,md2 in Modes:  md1.mch == k && md1.opId == o1.id &&
        md2.mch==k && md2.opId==o2.id )
        sum (i1 in Jobs, j1 in Jobs) y[i1][j1][i2][j2][k] <= 1 ;        
     
        
        forall (i2 in Jobs, j2 in Oper, k in Mchs )
         sum (i1 in Jobs, j1 in Jobs:j1 in Oper) y[i1][j1][i2][j2][k]
         <= sum (i1 in Jobs, j1 in Jobs:j2 in Oper && j1 in Oper) y[i2][j2][i1][j1][k] ;      
         
         
         
         //C8
     forall (i1,i2 in Jobs, j1,j2 in Oper, k in Mchs, md1 in Modes: md1.jobId == i1 && md1.opId == j1)
     c[i1][j1][k] >=  c[i2][j2][k] + y[i1][j1][i2][j2][k] * md1.pt - L*(1-sum(k in Mchs) y[i1][j1][i2][j2][k])  ;
    }
     
    execute {
      for (var m in Modes) {
        if (modes[m].present)
          writeln("Operation " + m.opId + "of job" +m.jobId+ " on machine " + m.mch + " starting at " + modes[m].start+ "and ends at" +modes[m].end);
          
           
      }
    }
     
    main {
    //Model for first essay
    var Modelt1Source = new IloOplModelSource("Bilevel-Hurink-10,10-la20.mod");
    var Modelt1Def = new IloOplModelDefinition(Modelt1Source);
      var oplmodel1 = new IloOplModel(Modelt1Def, cp);
      var Modelt1data = new IloOplDataSource("Bilevel-Hurink-10,10-la20 (Data).dat");
      oplmodel1.addDataSource(Modelt1data);
     
      oplmodel1.generate();
       
    cp.solve();
    var obj = cp.getObjValue();
    writeln("The Value of the Objective Function Value is (Total Cost): ", obj);
    writeln("Solving CPU Elapsed Time  in (Seconds): ", cp.getCpTime()); 
    oplmodel1.postProcess(); 
     
    var cp=new IloCp();
    //Model for second essay
     
    var Modelt2Source = new IloOplModelSource("main-Bilevel-Hurink-10,10-la20.mod");
    var Modelt2Def = new IloOplModelDefinition(Modelt2Source);
      var oplmodel2 = new IloOplModel(Modelt2Def, cp2);
     
      Modelt2data.y = oplmodel1.X.solutionValue; // transfer solution of model1 to input for model2
     
      var Modelt2data = new IloOplDataSource("Bilevel-Hurink-10,10-la20 (Data).dat");
      oplmodel2.addDataSource(Modelt2data);
      oplmodel2.generate();
      writeln("cp solve gives",cp2.solve()); 
     
    }

     

     

    //.DAT

     Params = <10, 10, 3, 115>;

    Ops = {
      <1,1,0>,
      <2,1,1>,
      <3,1,2>,
      <4,1,3>,
      <5,1,4>, 
      <6,1,5>,
      <7,1,6>,
      <8,1,7>,
      <9,1,8>,
      <10,1,9>,
      
      <11,2,0>,
      <12,2,1>,
      <13,2,2>,
      <14,2,3>,
      <15,2,4>, 
      <16,2,5>,
      <17,2,6>,
      <18,2,7>,
      <19,2,8>,
      <20,2,9>,
     
      <21,3,0>,
      <22,3,1>,
      <23,3,2>,
      <24,3,3>,
      <25,3,4>,
      <26,3,5>,
      <27,3,6>,
      <28,3,7>,
      <29,3,8>,
      <30,3,9>,
      
      <31,4,0>,
      <32,4,1>,
      <33,4,2>,
      <34,4,3>,
      <35,4,4>,
      <36,4,5>,
      <37,4,6>,
      <38,4,7>,
      <39,4,8>,
      <40,4,9>,
      
      <41,5,0>,
      <42,5,1>,
      <43,5,2>,
      <44,5,3>,
      <45,5,4>,
      <46,5,5>,
      <47,5,6>,
      <48,5,7>,
      <49,5,8>,
      <50,5,9>,
      
      <51,6,0>,
      <52,6,1>,
      <53,6,2>,
      <54,6,3>,
      <55,6,4>,
      <56,6,5>,
      <57,6,6>,
      <58,6,7>,
      <59,6,8>,
      <60,6,9>,
      
      <61,7,0>,
      <62,7,1>,
      <63,7,2>,
      <64,7,3>,
      <65,7,4>,
      <66,7,5>,
      <67,7,6>,
      <68,7,7>,
      <69,7,8>,
      <70,7,9>,
      
      <71,8,0>,
      <72,8,1>,
      <73,8,2>,
      <74,8,3>,
      <75,8,4>,
      <76,8,5>,
      <77,8,6>,
      <78,8,7>,
      <79,8,8>,
      <80,8,9>,
      
      <81,9,0>,
      <82,9,1>,
      <83,9,2>,
      <84,9,3>,
      <85,9,4>,
      <86,9,5>,
      <87,9,6>,
      <88,9,7>,
      <89,9,8>,
      <90,9,9>,
      
      <91,10,0>,
      <92,10,1>,
      <93,10,2>,
      <94,10,3>,
      <95,10,4>,
      <96,10,5>,
      <97,10,6>,
      <98,10,7>,
      <99,10,8>,
      <100,10,9>
    };

    Modes = {  

    //job 1
      <1,1,7,9>,
      
      <2,1,2,81>,
       
      <3,1,5,55>,
        
      <4,1,3,40>,
     
      <5,1,9,32>,
      <5,1,8,32>,
      
      <6,1,4,37>,
      
      <7,1,1,6>,
      
      <8,1,6,19>,
      
      <9,1,10,81>,
      
      <10,1,8,40>,
        
     //job 2
     
      <11,2,8,21>,
      
      <12,2,3,70>,
     
      <13,2,10,65>,
      <13,2,6,65>, 
      
      <14,2,5,64>, 

      <15,2,2,46>,   
      
      <16,2,6,65>,
      
      <17,2,9,25>,
      <17,2,6,25>,
      
      <18,2,1,77>, 
      
      <19,2,4,55>, 
      
      <20,2,7,15>, 
       
    //job 3

      <21,3,3,85>,
      
      <22,3,6,37>,
      <22,3,10,37>,
      
      <23,3,1,40>,

      <24,3,4,24>,

      <25,3,2,44>,

      <26,3,7,83>,  
      
      <27,3,5,89>, 
      
      <28,3,9,31>,
      
      <29,3,8,84>, 
      <29,3,4,84>, 
      
      <30,3,10,29>, 
       
    //job 4

      <31,4,5,80>,
      
      <32,4,7,77>,
      <32,4,3,77>,

      <33,4,8,56>,
      
      <34,4,1,8>,

      <35,4,3,30>,
      
      <36,4,6,59>,
      
      <37,4,4,38>,
      
      <38,4,2,80>,
      
      <39,4,10,41>,
      
      <40,4,9,97>,

    //job 5

      <41,5,1,91>,

      <42,5,7,40>,
      
      <43,5,5,88>,
      <43,5,1,88>,
      
      <44,5,2,17>,

      <45,5,3,71>,
      
      <46,5,4,50>,
      <46,5,3,50>,
      
      <47,5,10,59>,
      
      <48,5,9,80>,
      
      <49,5,6,56>,
      <49,5,9,56>,
      
      <50,5,8,7>,

    //job 6

      <51,6,3,8>,
      <51,6,8,8>,

      <52,6,7,9>,
      
      <53,6,4,58>,
      
      <54,6,6,77>,

      <55,6,2,29>,
      
      <56,6,9,96>,
      
      <57,6,1,45>,
      
      <58,6,10,10>,
      
      <59,6,5,54>,
      
      <60,6,8,36>, 

    //job 7

      <61,7,5,70>,
      
      <62,7,4,92>,

      <63,7,2,98>,
      
      <64,7,6,87>,

      <65,7,7,99>,
      
      <66,7,8,27>,
      
      <67,7,9,86>,

      <68,7,10,96>,
      
      <69,7,1,28>,

      <70,7,3,73>,

      //job 8

      <71,8,2,95>,
      
      <72,8,8,92>,
      <72,8,3,92>,
      
      <73,8,4,85>,
      
      <74,8,5,52>,
        
      <75,8,7,81>,  

      <76,8,10,32>,  
      
      <77,8,9,39>,  
        
      <78,8,1,59>,  
         
      <79,8,3,41>,  
          
      <80,8,6,56>,  

      //job 9
     
      <81,9,4,60>,
      
      <82,9,9,45>,
      <82,9,5,45>,
      
      <83,9,1,88>,
      
      <84,9,3,12>,
      
      <85,9,2,7>,
      
      <86,9,6,22>,
      
      <87,9,5,93>,
      
      <88,9,10,49>,
      
      <89,9,8,69>,
      
      <90,9,7,27>,  

        //job 10
     
      <91,10,1,21>,
      
      <92,10,3,61>,
      
      <93,10,4,68>,
      <93,10,5,68>,
      
      <94,10,6,26>,
      
      <95,10,7,82>,
      
      <96,10,10,71>,
      
      <97,10,9,44>,
      
      <98,10,5,99>,
      
      <99,10,8,33>,
      
      <100,10,2,84>
      
    };


    #CPLEXOptimizers
    #DecisionOptimization


  • 9.  Re: Flow control

    Posted Sun November 12, 2017 11:29 AM

    Originally posted by: user1234567


    Sorry, the (LB,UB)=(857, 864). So, is it normal to get the result 902 with an exact method ?


    #CPLEXOptimizers
    #DecisionOptimization