Минимизировать количество ресурсов для обработки всех требований.
Вводные данные, которые у нас есть, — это список требований, которые необходимо назначить любому ресурсу из списка. ресурсов, которые можно сопоставить.
Каждое требование должно быть распределено по продолжительности в соответствии с количеством запрошенных часов и в пределах диапазона дат, указанных в запросе.
Формат диапазона дат начала и окончания 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