Создайте ограничение в Python Pulp, чтобы ограничить последовательную полосу от 1 до 1 - PullRequest
0 голосов
/ 27 января 2019

Я хотел бы добавить ограничение к моей задаче оптимизации, которую я строю с использованием целлюлозы.Ограничение должно подсчитывать количество «полос» ненулевых чисел, т. Е.

[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,чего я хотел бы избежать.похоже, что ограничение не регистрируется, хотя ошибок нет.Есть ли какие-либо рекомендации относительно других подходов к добавлению этого ограничения в мою задачу линейной оптимизации?

1 Ответ

0 голосов
/ 28 января 2019

В машинном планировании это иногда называют: ограничить количество запусков.Для этого есть несколько интересных формулировок.

В этом особом случае у нас есть только три периода времени (это прямо указано в вопросе).Таким образом, единственный шаблон, который нам нужно запретить: [1,0,1].Пусть x[t] будет нашей двоичной переменной.Затем мы можем ввести срез:

 x[0]-x[1]+x[2] <= 1

Это запретит [1,0,1], но разрешит любой другой шаблон.

Здесь показан другой подход .

...