#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] // ];