Python Pulp Query — распределите задачу в пределах временного диапазона для достижения цели по минимизации количества реPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python Pulp Query — распределите задачу в пределах временного диапазона для достижения цели по минимизации количества ре

Сообщение Anonymous »

Цель
Минимизировать количество ресурсов для обработки всех требований.
Вводные данные, которые у нас есть, — это список требований, которые необходимо назначить любому ресурсу из списка. ресурсов, которые можно сопоставить.
Каждое требование должно быть распределено по продолжительности в соответствии с количеством запрошенных часов и в пределах диапазона дат, указанных в запросе.
Формат диапазона дат начала и окончания w 24w211 — 2024 год. неделя 21 и день 1 (понедельник)
Задание
Код, которым я поделился ниже, выделяет ресурс с даты начала (Доступный диапазон (день начала)) при вводе он не может определить из заданного диапазона дней (Доступный диапазон (день начала) Доступный диапазон (день окончания)), какую дату лучше всего использовать в качестве даты начала, чтобы общее количество автомобилей, которые будут произведены, можно было сведено к минимуму.
Например: В приведенном ниже примере входных данных запрос 1 может быть назначен любому ресурсу и на любые 3 недели из предоставленного диапазона. Количество недель в запросе 1 составляет 3 недели (120/40), которые можно распределить от
22W211 до 22W235 или от 22W221 до 22W245 или от 22W231 до 22W255 или от 22W241 до 22W265 и т. д.
Пример ввода



Идентификатор запроса
Количество часов для выделения
Доступный диапазон (день начала)
Доступный диапазон (конечный день)
Список ресурсов, с которыми можно сопоставить требование




1
120
22W211
22W305
RES1, RES2, RES3, RES4


2
40
22W211
22W225
RES1, RES2 , RES3, RES4


3
80
22W211
22W305
RES1, RES2, RES3, RES4


4
8
21W231
21W255
RES1, RES2, RES3, RES4


5
24
21W231
21W255
RES2, RES3, RES4

6
16
21W231
21W255
RES2, RES3, RES4


7
120
22W251
22W275
RES2, RES3, RES4


8
240
22W211
22W305
RES2, RES3, RES4


9
40
22W211
22W225RES2, RES3, RES4


10
120
22W211
22W255
RES2



defsolve_group(res_pool, reqs):
# Инициализация задачи линейного программирования
prob = LpProblem (f"Minimize_ress_Group_{res_pool}", LpMinimize)

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

# Step 2.1: Define variables
# Decision variable x_ijk = 1 if res i is assigned to request j starting at week k
x = {}
for res in res_pool:
for req in reqs:
for start_day in range(req['start_day'], req['end_day'] + 2 - req['hours_required'] // 8 - (1 if req['hours_required'] % 8 > 0 else 0)  ):
x[res, req['req_id'], start_day] = LpVariable(f"x_{res}_{req['req_id']}_{start_day}", 0, 1, LpBinary)

# Step 2.2: Define binary variable for res usage
# Binary variable used_i = 1 if res i is used
used = {}
for res in res_pool:
used[res] = LpVariable(f"used_{res}", 0, 1, LpBinary)

# Step 3: Objective function - Minimize the number of ress used
prob += lpSum(used[res] for res in res_pool), "Minimize number of res"

# Step 4: Constraints
# Step 4.1: Every request must be fulfilled
for req in reqs:
prob += lpSum(x[res, req['req_id'], start_day]
for res in req['pnos']
for start_day in range(req['start_day'], req['end_day'] + 2 - req['hours_required'] // 8 - (1 if req['hours_required'] % 8 > 0 else 0))) == 1, f"Fulfill_req_{req['req_id']}"

# Step 4.2: Non-overlapping constraint - No res can be double-booked for overlapping periods
for res in res_pool:
for day in range(min(req['start_day'] for req in reqs), max(req['end_day'] for req in reqs)):
prob += lpSum(x[res, req['req_id'], start_day]
for req in reqs
for start_day in range(req['start_day'], req['end_day'] + 2 - req['hours_required'] // 8 - (1 if req['hours_required'] % 8 > 0 else 0) )
if start_day  0 else 0) ))  0 else 0) ):
prob += used[res] >= x[res, req['req_id'], start_day], f"Link_usage_{res}_{req['req_id']}_{start_day}"

# Step 5: Solve the problem for this group
prob.solve()

# Return the result (the number of res used and their assignments)
return prob, used, x
Другой пример:
Кроме того, если учесть 3 требования, требование 1 требует потребности в течение 1 недели с диапазоном 24w20 и 24w22, а требование 2, требование 3 также имеет такое же требование. В этом случае все три можно назначить одному ресурсу, req1 можно сопоставить с 24w20, req2 можно сопоставить с 24w21, а req2 можно сопоставить с 24w22. Таким образом мы минимизировали количество ресурсов, необходимых для выполнения всех требований

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

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

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

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

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

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

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