Объявление переменной ошибки измерения в pyomo

#python #model #pyomo

#python #Модель #pyomo

Вопрос:

Я вроде как новичок в pyomo, и я изо всех сил пытаюсь объявить свои переменные решения и получаю ошибку : ValueError: The value=('6', (2, 3, 4)) has dimension 4 and is not valid for Set y_index which has dimen=3 . Мои данные выглядят так:

Список сотрудников:

 N = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
 

Набор выходных для сотрудников (ключи: идентификатор сотрудника, значения: набор выходных)

 EmployeeWE = {'0':[(2, 3),(9, 10),(16, 17),(23, 24)],
 '1':[(2, 3),(9, 10),(16, 17),(23, 24)],
 '2':[(2, 3),(9, 10),(16, 17),(23, 24)],
 '3':[(2, 3),(9, 10),(16, 17),(23, 24)],
 '4':[(2, 3),(9, 10),(16, 17),(23, 24)],
 '5':[(2, 3),(9, 10),(16, 17),(23, 24)],
 '6':[(2, 3,4),(9, 10,11),(16, 17,18),(23, 24,25)],
 '7':[(2, 3,4),(9, 10,11),(16, 17,18),(23, 24,25)],
 '8':[(2, 3),(9, 10),(16, 17),(23, 24)],
 '9':[(2, 3),(9, 10),(16, 17),(23, 24)]}
 

Как вы можете видеть для сотрудников 3 и 4, определение выходных дней для них отключено на 3 дня. Итак, что я сделал, так это:

 from pyomo.environ import *
model = ConcreteModel()

#Set declaration: 
model.n = Set(initialize = N)
#model.WE = ??? -> no clue of how to declare a dictionary with a list of tupples

#Var
model.y = Var(((employees, weekends) for employees in model.n for weekends in EmployeeWE[employees]), within=Binary, initialize=0)
 

Итак, я предполагаю, что ошибка исходит от 2 сотрудников с разным набором выходных, но как я могу это исправить? Для объявления переменной мне нужно знать, работает ли сотрудник n или нет в выходные i. Под выходными я подразумеваю индекс ( 1, начиная с 1) списка групп в словаре. Например, для набора выходных ID сотрудника 1:

1:(2,3), 2:(9,10), 3:(16,17), 4:(23,24) и так далее для каждого сотрудника. Спасибо!

Ответ №1:

Вот код, который я использовал для решения своей проблемы

 unique_WE = sorted(set(itertools.chain.from_iterable(EmployeeWE .values())))
map_I_WE = {k: v for k, v in enumerate(unique_WE)}

map_WE_I = {map_I_WE[k]: k for k in map_I_WE}
I = list(map_I_WE.keys())
map_N_I = defaultdict(list)
for n in EmployeeWE :
    for w in EmployeeWE [n]:
        map_N_I[n].append(map_WE_I[w])
        
model.I = Set(initialize = I)        
model.N_I = Set(within=model.N * model.I, 
                initialize=[(n, i) for n in map_N_I for i in map_N_I[n]])