Я хотел бы добавить ограничение к моей задаче оптимизации, которую я строю с использованием целлюлозы.Ограничение должно подсчитывать количество «полос» ненулевых чисел, т. Е.
[1,1,1,1,0] = 1 because there us 1 group of 1s
[1,1,1,0,1] = 2 because there are 2 group of 1s
[1,0,1,0,1] = 3 because there are 3 group of 1s
Ограничение должно ограничивать группу # 1 или 0 (если массив равен всем 0)
В качестве некоторого контекста моей проблемы, это проблема планирования с 3 временными интервалами (столбцами).Есть 2 человека, которых мы рассматриваем, и 2 возможных должности, на которых они могли бы работать (ряды).my_array = что-то вроде
([x1,x2,x3], [x4, x5, x6], [x7, x9, x9], [x10, x11, x12])
Строка 0 = человек 1, рабочая роль A. Строка 1 = человек 2 рабочая роль A. Строка 3 = человек 1 рабочая роль B. Строка 3 = человек 2 рабочая роль B.Если 1, человек работает, если 0 человек не работает.
Я хотел бы узнать сумму часов, в течение которых человек работает в разных ролях (например, для человека 1, сумма роли 0 и строки 2).), имеют только 1 последовательную серию из 1 или 0. Не более того.
Я добавил это ограничение:
for p in range(num_people):
prob += len([ sum( 1 for _ in group ) for key, group in itertools.groupby(sum(my_array[p+x*num_people] for x in range(num_positions))) if key ]) == 1
Однако выходные данные задачи оптимизации содержат строки, в которых отдельный человек работает непоследовательными строками.то есть
([1,0,0], [1, 1, 0], [0, 0, 1], [0, 0, 0])
Суммируя строку 0 + строку 2 и строку 1 + строку 3, мы получаем
([1,0,1], [1, 1, 0])
Здесь человек 1 работает с временным интервалом 0 и временным интервалом 2, но не с временным интервалом 1,чего я хотел бы избежать.похоже, что ограничение не регистрируется, хотя ошибок нет.Есть ли какие-либо рекомендации относительно других подходов к добавлению этого ограничения в мою задачу линейной оптимизации?