Код: Выделить всё
#intervals for non-working time depending on shift model:
#1 shifts 2 PM - 6 & weekends, 2 shifts 10 PM - 6 AM & weekends, 3 shifts weekends
i = 0
for machine in machine_data:
for mach_id, mach in enumerate(machine):
if mach[1] == 0 and mach[3] == 1:
if mach[2] == 1:
for cal_id, cal in enumerate(cal_data):
for shift_id, shift in enumerate(cal):
start = int(shift[0])
size = int(shift[1]) - int(shift[0])
end = int(shift[1])
i = i + 1
name = str(mach[0]) + '_' + str(mach[2]) + '_' + str(i) + '_weekend'
machine_to_intervals[mach[0]].append(model.NewIntervalVar(start, size, end, name))
elif mach[2] == 2:
#print('2:')
for cal_id, cal in enumerate(cal_data):
for shift_id, shift in enumerate(cal):
start = int(shift[2])
size = int(shift[3]) - int(shift[2])
end = int(shift[3])
i = i + 1
name = str(mach[0]) + '_' + str(mach[2]) + '_' + str(i) + '_weekend'
machine_to_intervals[mach[0]].append(model.NewIntervalVar(start, size, end, name))
elif mach[2] == 3:
for cal in cal_data:
for shift_id, shift in enumerate(cal):
if shift[4] > 0:
start = int(shift[4])
size = int(shift[5]) - int(shift[4])
end = int(shift[5])
i = i + 1
name = str(mach[0]) + '_' + str(mach[2]) + '_' + str(i) + '_weekend'
machine_to_intervals[mach[0]].append(model.NewIntervalVar(start, size, end, name))
Чтобы добиться этого, я использовал OnlyEnforceIf, поставить в очередь все задачи, не относящиеся к данной операции (активности), перед запуском первой задачи в этой активности или после завершения последней задачи в этой активности. Я также определил целевую модель.Minimize(splitMin), чтобы минимизировать расстояние между первой и последней задачей в разделенном действии.
Код: Выделить всё
split_minimize = []
for i in range(len(splitdf)):
order = splitdf.iloc[i]['WorkOrder']
activity = splitdf.iloc[i]['Activity']
wc = splitdf.iloc[i]['WC_INT']
order_id = splitdf.iloc[i]['WO_INT']
#first and last row with the same split activity
ord_pl_min = splitdf.iloc[i]['MinROW#']
ord_pl_max = splitdf.iloc[i]['MaxROW#']
spltMin = all_tasks[order_id, ord_pl_max].end - all_tasks[order_id, ord_pl_min].start
split_minimize.append(spltMin)
for job_id, job in enumerate(jobs_data):
for task_id, task in enumerate(job):
zName = "z%i_%i_%i" % (i, job_id, task_id)
z = model.NewBoolVar(zName)
model.Add(all_tasks[job_id, task_id].end < all_tasks[order_id, ord_pl_min].start).OnlyEnforceIf(z)
model.Add(all_tasks[job_id, task_id].start > all_tasks[order_id, ord_pl_max].end).OnlyEnforceIf(z.Not())
Расписание для одной машины, работающей в 2 смены.
Я предполагаю, что OnlyEnforceIf - это " мягкое» ограничение. Я пытался использовать AddCircuit, потому что думал, что он сможет создать правильную очередь, но мне это не удалось. Не могли бы вы мне подсказать, что мне сделать, чтобы эти задачи были вместе?
Подробнее здесь: https://stackoverflow.com/questions/782 ... m-together