Подбор оптимального графика

Подскажите, пожалуйста, как лучше подойти к решению вопроса (в Excel или при помощи Python) подбора оптимального графика смен сотрудников?

Нам известно расписание и план работ на следующую неделю. Как оптимизировать смены для решения наибольшего количества задач, при условии что мы можем сдвигать смены в промежутке времени.

Подробнее в файле.

Я подходил к решению задачи со стороны Solver в Excel и при помощи жадного алгоритма в Python, но, к сожалению, не сдвинулся с мёртвой точки.

Заранее благодарю за помощь.

Подробности


Ответы (1 шт):

Автор решения: AlexseiA

Возможный вариант:

let
   #"22" = {{1, 1, 0, 0, 1, 1, 0}, {0, 1, 1, 0, 0, 1, 1}, {0, 0, 1, 1, 0, 0, 1}, {1, 0, 0, 1, 1, 0, 0}},
   #"53" = {{1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1}, {1, 0, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 1, 1, 1}, {1, 1, 1, 0, 0, 1, 1}, {1, 1, 1, 1, 0, 0, 1}},
   #"35" = {{1, 1, 1, 0, 0, 0, 1}, {0, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 0}, {1, 0, 0, 0, 1, 1, 1}},
   target = {2, 6, 5, 4, 3, 3, 1},
   func = (lst as list) as list => List.Transform(List.Zip(lst), List.Sum),
   fio = {"Иванов", "Сидоров", "Григорьев", "Петров", "Романов", "Анатольевна"},
   tbl = #table(fio, {{#"53", #"53", #"22", #"35", #"35", #"22"}}),
   xpand = (i, tblbl) =>
       if i = List.Count(fio)
       then tblbl
       else @xpand(i + 1, Table.ExpandListColumn(tblbl, fio{i})),
   exec = Table.SelectRows(xpand(0, tbl), (x) => func(Record.FieldValues(x)) = target),
   idx = Table.AddIndexColumn(exec, "num", 1),
   sol = Table.UnpivotOtherColumns(idx, {"num"}, "name", "days"),
   to_list = Table.ToList(sol, (x) => List.FirstN(x, 2) & x{2}),
   solutions = Table.UnpivotOtherColumns(
       Table.FromRows(to_list, {"sol#", "name"} & {"пн", "вт", "ср", "чт", "пт", "сб", "вс"}),
       {"sol#", "name"}, "day", "bit"
   )
in
   solutions

→ Ссылка