Использование переменной в качестве необязательного размера в задаче планирования интервала dvar CP

#optimization #scheduling #cplex #constraint-programming

#оптимизация #планирование #cplex #программирование ограничений

Вопрос:

Я хотел бы включить переменную продолжительность в качестве необязательного размера моей задачи выбора интервала dvar. В данный момент я использую параметр duration [j][m], который я хотел бы изменить в переменную. Я хотел бы изменить это на длительность 2, которая зависит от заказа, который будет предоставлен, и скорости производства PR, на данный момент я назвал эту продолжительность 2. Так что продолжительность [j][m] не определена заранее.

Мне трудно определить это либо в файле dat, либо в файле mod. Кажется, я не могу определить длительность 2 как функцию порядка x[j] и PR [j][m]. В файле dat я определил порядок [j] и скорость производства PR[j][m], разделение двух должно привести к длительности2. Я также определил результат duration2 в файле dat. Однако я бы хотел, чтобы это произошло автоматически, только изменив порядок[j]

Кто-нибудь знает, как я мог бы это сделать?

модификация.

  using CP;  // Number of Machines  int nbMachines = ...; range Machines = 1..nbMachines;   // Number of Jobs int nbProds = ...; range Products = 1..nbProds; int order[Products]=...; //order for products 1,2,3 int PR[Products,Machines] = ...;//production rate int duration2[Products,Machines] = ...;  int duration[Products,Machines] = ...; int release = ...; int due = ...; int cost= ...; int JobId[j in Products] = j;   //dvar int  duration[Products,Machines]; dvar interval task[j in Products] in release..due; dvar interval opttask[j in Products][m in Machines] optional size duration[j][m]; dvar sequence tool[m in Machines] in all(j in Products) opttask[j][m] types JobId;  //SetUp Time matrices tuple Matrix { int job1; int job2; int time; };  {Matrix} transitionTimes ={lt;1,1,2gt;,lt;1,2,6gt;,lt;1,3,5gt;,lt;2,1,2gt;,lt;2,2,1gt;,lt;2,3,1gt;,lt;3,1,2gt;,lt;3,2,3gt;,lt;3,3,0gt;}; //ALT//{Matrix} transitionTimes ={ lt;i,j, ftoi(abs(i-j))gt; | i in Jobs, j in Jobs };  execute {  cp.param.FailLimit = 5000; }   // Minimize the max timespan dexpr int makespan = max(j in Products, m in Machines)endOf(opttask[j][m]); dexpr int SchedCost = makespan*cost*nbMachines; minimize SchedCost;  subject to {  // Each job needs one unary resource of the alternative set s (28)  forall(j in Products){  c1:alternative(task[j], all(m in Machines) opttask[j][m]);  }     forall(m in Machines){  c2:noOverlap(tool[m],transitionTimes,true);  }   };  execute {  writeln(task); };  

дат.

 nbMachines = 2; nbProds = 3;  duration = [   [5,6],   [4,3],  [5,8]  ];  release = 1; // release date of all products due = 30; // due date for all products cost = 12; // machine cost per day per machine   order = [100,200,300]; // order size of products 1, 2 and 3 //Production rate of product 1,2,3 on machine 1 and 2 PR = [  [20,25], [50,20], [10,25], ];  //duration2 = order[Products]/PR[Products,Machines]; //duration2 = [  // [5,4],  // [4,10], // [30,12] // ];