Как реализовать предварительное планирование рабочих заданий в Python, используя ограничения доступности машины и приориPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как реализовать предварительное планирование рабочих заданий в Python, используя ограничения доступности машины и приори

Сообщение Anonymous »

На основе этих данных мне нужно создать программу Python, которая выполняет загрузку с использованием процедуры прямого планирования, то есть прямого планирования, целью которого является размещение заказа в следующем доступном слоте.

Продолжить Имея в виду, что один и тот же заказ не может быть размещен на нескольких машинах одновременно; другими словами, заказ может быть назначен только одной машине в час.
Это будут таблицы входных данных, предоставляемые программе:
number_of_machines = 4

#In this case we chose 15 but it should be a large enough number to cover all the required schedules
maximum_number_of_hours = 15

# The limit hours for each Work Order are provided
order_and_deadline = [
["Order A", 10],
["Order B", 11],
["Order C", 13],
["Order D", 14]
]

# The sequences of priorities given as rows in a routing sheet are provided
routing_sheet = [
["Order A", "Order B", "Order C", "Order D"],
[["Machine 1", 3], ["Machine 3", 2], ["Machine 4", 2], ["Machine 2", 1]],
[["Machine 2", 2], ["Machine 2", 2], ["Machine 1", 3], ["Machine 3", 2]],
[["Machine 3", 2], ["Machine 4", 3], ["Machine 3", 2], ["Machine 1", 3]],
[["Machine 4", 1], ["Machine 1", 1], ["Machine 2", 3], ["Machine 4", 4]],
]

# Create the header row for the scheduling table
schedule_table = [["Hour"] + [f"Machine {i+1}" for i in range(number_of_machines)] + ["Deadline"]]

Чем левее столбец находится в маршрутной таблице, тем более высокий приоритет имеет заказ.

Последний столбец в маршрутной таблице «Срок» — это заполняется, когда заказы достигают времени окончания.
Имейте в виду, что один и тот же заказ не может быть размещен на нескольких машинах одновременно, то есть его можно назначать только одной машине в час. .
Процедура следующая:
Сначала найдите столбец с наивысшим приоритетом, в данном случае «Заказ А», и поскольку Schedule_table пуста, простоев не будет.

Затем разместите все Заказы в соответствующие часы и машины, как указано в таблице маршрутизации, и это будет выглядеть так:
schedule_table = [
['Hour', 'Machine 1', 'Machine 2', 'Machine 3', 'Machine 4', 'Deadline'],
[1, 'Order A', None, None, None, None],
[2, 'Order A', None, None, None, None],
[3, 'Order A', None, None, None, None],
[4, None, 'Order A', None, None, None],
[5, None, 'Order A', None, None, None],
[6, None, None, 'Order A', None, None],
[7, None, None, 'Order A', None, None],
[8, None, None, None, 'Order A', None],
[9, None, None, None, None, None],
[10, None, None, None, None, 'Order A'],
[11, None, None, None, None, 'Order B'],
[12, None, None, None, None, None],
[13, None, None, None, None, 'Order C'],
[14, None, None, None, None, 'Order D'],
[15, None, None, None, None, None]
]

Затем я перейду к следующему столбцу в порядке приоритета, в данном случае «Порядок Б». Но теперь, когда слоты «Заказа А» уже заполнены, мне нужно будет попытаться разместить «Заказ Б» на следующих свободных местах. Это будет выглядеть так:
schedule_table = [
['Hour', 'Machine 1', 'Machine 2', 'Machine 3', 'Machine 4', 'Deadline'],
[1, 'Order A', None, 'Order B', None, None],
[2, 'Order A', None, 'Order B', None, None],
[3, 'Order A', None, None, None, None],
[4, None, 'Order A', None, None, None],
[5, None, 'Order A', None, None, None],
[6, None, 'Order B', 'Order A', None, None],
[7, None, 'Order B', 'Order A', None, None],
[8, None, None, None, 'Order A', None],
[9, None, None, None, 'Order B', None],
[10, None, None, None, 'Order B', 'Order A'],
[11, None, None, None, 'Order B', 'Order B'],
[12, None, None, None, None, None],
[13, None, None, None, None, 'Order C'],
[14, None, None, None, None, 'Order D'],
[15, None, None, None, None, None]
]

Далее я перейду к следующему столбцу в порядке приоритета: «Порядок C». Но поскольку «Заказ А» и «Заказ Б» уже размещены, мне нужно попробовать разместить «Заказ В» на следующих свободных местах. Это будет выглядеть так:
schedule_table = [
['Hour', 'Machine 1', 'Machine 2', 'Machine 3', 'Machine 4', 'Deadline'],
[1, 'Order A', None, 'Order B', 'Order C', None],
[2, 'Order A', None, 'Order B', 'Order C', None],
[3, 'Order A', None, None, None, None],
[4, 'Order C', 'Order A', None, None, None],
[5, 'Order C', 'Order A', None, None, None],
[6, 'Order C', 'Order B', 'Order A', None, None],
[7, None, 'Order B', 'Order A', None, None],
[8, None, None, 'Order C', 'Order A', None],
[9, None, None, 'Order C', 'Order B', None],
[10, None, 'Order C', None, 'Order B', 'Order A'],
[11, None, 'Order C', None, 'Order B', 'Order B'],
[12, None, 'Order C', None, None, None],
[13, None, None, None, None, 'Order C'],
[14, None, None, None, None, 'Order D'],
[15, None, None, None, None, None]
]

Наконец, я бы перешел к следующему столбцу в порядке приоритета: «Порядок D». Но поскольку «Заказ A», «Заказ B» и «Заказ C» уже размещены, мне нужно попробовать разместить «Заказ D» на следующих доступных местах. Это будет выглядеть так:
schedule_table = [
['Hour', 'Machine 1', 'Machine 2', 'Machine 3', 'Machine 4', 'Deadline'],
[1, 'Order A', 'Order D', 'Order B', 'Order C', None],
[2, 'Order A', None, 'Order B', 'Order C', None],
[3, 'Order A', None, 'Order D', None, None],
[4, 'Order C', 'Order A', 'Order D', None, None],
[5, 'Order C', 'Order A', None, None, None],
[6, 'Order C', 'Order B', 'Order A', None, None],
[7, 'Order D', 'Order B', 'Order A', None, None],
[8, 'Order D', None, 'Order C', 'Order A', None],
[9, 'Order D', None, 'Order C', 'Order B', None],
[10, None, 'Order C', None, 'Order B', 'Order A'],
[11, None, 'Order C', None, 'Order B', 'Order B'],
[12, None, 'Order C', None, 'Order D', None],
[13, None, None, None, 'Order D', 'Order C'],
[14, None, None, None, 'Order D', 'Order D'],
[15, None, None, None, 'Order D', None]
]

После применения логики для управления доступными слотами на машинах и распределения заказов окончательная таблица планирования (которая является ожидаемым результатом) должна выглядеть следующим образом:
#Correct Output:

schedule_table = [
['Hour', 'Machine 1', 'Machine 2', 'Machine 3', 'Machine 4', 'Deadline'],
[1, 'Order A', 'Order D', 'Order B', 'Order C', None],
[2, 'Order A', None, 'Order B', 'Order C', None],
[3, 'Order A', None, 'Order D', None, None],
[4, 'Order C', 'Order A', 'Order D', None, None],
[5, 'Order C', 'Order A', None, None, None],
[6, 'Order C', 'Order B', 'Order A', None, None],
[7, 'Order D', 'Order B', 'Order A', None, None],
[8, None, None, 'Order C', 'Order A', None],
[9, None, None, 'Order C', 'Order B', None],
[10, None, 'Order C', None, 'Order B', 'Order A'],
[11, None, 'Order C', None, 'Order B', 'Order B'],
[12, 'Order B', 'Order C', None, 'Order D', None],
[13, None, None, None, 'Order D', 'Order C'],
[14, None, None, None, 'Order D', 'Order D'],
[15, None, None, None, 'Order D', None]
]

Это мой код, но эта логика не работает, поскольку она плохо организует заказы.:
# Input data
number_of_machines = 4
maximum_number_of_hours = 15

order_and_deadline = [
["Order A", 10],
["Order B", 11],
["Order C", 13],
["Order D", 14]
]

routing_sheet = [
["Order A", "Order B", "Order C", "Order D"],
[["Machine 1", 3], ["Machine 3", 2], ["Machine 4", 2], ["Machine 2", 1]],
[["Machine 2", 2], ["Machine 2", 2], ["Machine 1", 3], ["Machine 3", 2]],
[["Machine 3", 2], ["Machine 4", 3], ["Machine 3", 2], ["Machine 1", 3]],
[["Machine 4", 1], ["Machine 1", 1], ["Machine 2", 3], ["Machine 4", 4]],
]

# Create the header row for the scheduling table
schedule_table = [["Hour"] + [f"Machine {i+1}" for i in range(number_of_machines)] + ["Deadline"]]

# Initialize an empty schedule
schedule = [[None for _ in range(number_of_machines)] for _ in range(maximum_number_of_hours)]

# Mapping machine name to machine index
machine_index_map = {
"Machine 1": 0,
"Machine 2": 1,
"Machine 3": 2,
"Machine 4": 3,
}

# Assigning orders based on routing sheet
for order_index in range(len(routing_sheet[0])): # Loop through each order
order = routing_sheet[0][order_index]
machines_and_times = routing_sheet[1:][order_index] # Get routing info for the order

current_hour = 0
for machine, duration in machines_and_times:
machine_idx = machine_index_map[machine]
for _ in range(duration): # Schedule for the given duration
# Find the next available slot for the current machine and hour
while schedule[current_hour][machine_idx] is not None:
current_hour += 1
schedule[current_hour][machine_idx] = order
current_hour += 1

# Add deadlines to the schedule
for order, deadline in order_and_deadline:
schedule[deadline - 1].append(order)

# Add schedule to the scheduling table
for hour in range(1, maximum_number_of_hours + 1):
schedule_table.append([hour] + schedule[hour - 1] + [None] * (len(order_and_deadline) - len(schedule[hour - 1])))

# Final scheduling table output
for row in schedule_table: print(row)


Подробнее здесь: https://stackoverflow.com/questions/790 ... chine-avai
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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