Планирование цеха OR-TOOLS — разделение более длительных задач и их объединение между сменамиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Планирование цеха OR-TOOLS — разделение более длительных задач и их объединение между сменами

Сообщение Anonymous »

Используя OR-TOOLS CP-SAT, я обнаружил проблему с вторжением задач между другими задачами. В моей модели есть станки, работающие в 1,2,3 смены и не работающие по выходным.

Код: Выделить всё

#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))
Некоторые задачи длиннее, чем 1 или даже 2 смены, поэтому я решил разделить их по времени наладки и каждую 1 часть как отдельную задачу, например. одна операция в рабочем порядке с 15 шт = 16 задач. Тогда я ожидаю, что каждая задача из этой операции будет планироваться одна за другой, не мешая другим задачам из других рабочих заданий.
Чтобы добиться этого, я использовал 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»