Минимизировать количество ресурсов для обработки всех требований.
Вводные данные, которые у нас есть, — это список требований, которые необходимо назначить любому ресурсу из списка. ресурсов, которые можно сопоставить.
Каждое требование должно быть распределено по продолжительности в соответствии с количеством запрошенных часов и в пределах диапазона дат, указанных в запросе.
Задача
Код, которым я поделился ниже, выделяет ресурс с даты начала (Доступный диапазон (день начала)) на входе, он не находит этого из заданного диапазона дней (Доступный диапазон (день начала) Доступный диапазон (день окончания)), какую дату лучше всего использовать в качестве даты начала, чтобы можно было свести к минимуму общее количество производимых автомобилей.
Например: В приведенном ниже примере входных данных — требование 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
Код: Выделить всё
RES_LIST
мы создали копию списка ресурсов, чтобы одни и те же ресурсы можно было создавать несколько раз. ресурс можно принять за роботов, мы можем иметь несколько копий одного и того же робота, если это может уменьшить количество покупаемых роботов.
Код: Выделить всё
# Create a linear programming problem using pulp
prob = pulp.LpProblem("RES_Scheduling", pulp.LpMinimize)
# Binary variables to indicate if a res is used or not
RES_LIST = pulp.LpVariable.dicts('RES_LIST', res_list, cat='Binary')
# Binary variables to indicate if a copied res is used or not
RES_LIST_copied = pulp.LpVariable.dicts('RES_LIST_copied', [item for sublist in copied_res.values() for item in sublist],
cat='Binary')
# BInary variables to indicate assignment of res to requirement
ASSIGNMENT = pulp.LpVariable.dicts('ASSIGNMENT', (range(len(Requirements)), range(len(RES_LIST) + len(RES_LIST_copied))), cat='Binary')
# print(ASSIGNMENT)
# Objective function: Minimize the number of res used
prob += pulp.lpSum([RES_LIST[RES] for RES in RES_list]) + pulp.lpSum([RES_LIST_copied[RES] for RES in RES_LIST_copied])
# Constraint: Ensue each test need is assigned 1 RES or copied RES
for i, need in enumerate(Requirements):
prob += pulp.lpSum([ASSIGNMENT[i][j] for j, RES in enumerate(RES_List+ list(RES_LIST_copied)) if RES.split('-')[0] in need['RES']]) == 1
# Constraint: Ensure assignment variables are consistent with usage variables
for j, RES in enumerate(RES_List+ list(RES_LIST_copied)):
if RES.split('-')[0] in need['RESs']:
if '-' in RES: # If its a copied RES
prob += ASSIGNMENT[i][j]
Подробнее здесь: [url]https://stackoverflow.com/questions/78993084/python-pulp-query-allocate-task-within-timerange-to-achieve-objective-to-minim[/url]