1pi1sumwu
Постановка задачи
1) Дано
работ и станок.2) Для каждой работы известны её дедлайн
и вес . Время выполнения всех работ равно .Требуется минимизировать
, то есть суммарный вес всех просроченных работ.Алгоритм
Идея алгоритма состоит в том, чтобы на шаге
строить оптимальное расписание для первых работ с наименьшими дедлайнами.Будем считать, что работы отсортированны в порядке неуменьшения их дедлайнов. Пусть мы уже рассмотрели первые
работ, тогда множество содержит только те работы, которые мы успеваем выполнить в порядке неуменьшения их дедлайнов при оптимальном составлении расписания . Рассмотрим работу . Если мы успеваем выполнить данную работу до ее дедлайна, то добавим ее во множество , тем самым получив . Если же работу выполнить до дедлайна мы не успеваем, то найдем в работу с наименьшим весом и заменим ее на работу .Таким образом, рассмотрев все работы, мы получим
— множество работ, которые мы успеваем выполнить до наступления их дедлайнов, причем вес просроченных работ будет наименьшим. От порядка выполнения просроченных работ ничего не зависит, поэтому расположить в расписании их можно произвольным образом.Псевдокод
Предполагаем, что перед началом выполнения алгоритма выполняется, что
. Все работы, дедлайн которых равен , мы в любом случае выполнить без штрафа не успеем, поэтому их изначально можно отнести к просроченным.— множество непросроченных работ, — текущее время.
for to if else найти такое , что
Доказательство корректности
Покажем, что алгоритм строит корректное расписание.
Если мы успеваем выполнить очередную работу, то, очевидно, от ее добавления, расписание не может стать некорректным. В противном случае мы пытаемся заменить одну работу из множества
на текущую. Но это так же не может сделать наше расписание некорректным. Это следует из того, что мы рассматриваем работы в порядке неуменьшениях их дедлайнов. Пусть мы заменяем работу на работу . Но , и следовательно, если мы успевали выполнить работу , то успеем выполнить и работу .
Теперь докажем, что построенное данным алгоритмом расписание оптимально.
Пусть
множество непросроченных работ в оптимальном расписании. Так же пусть — первая работа из множества , которая не входит в , а — первая работа из не содержащаяся в . Мы можем предполагать существование этих работ, потому что не может содержать как подмножество, иначе это противоречило бы построению . С другой стороны, если , то должно быть тоже оптимальным, и правильность алгоритма доказана.Для доказательства покажем, что мы можем заменить работу
на работу в оптимальном расписании, не увеличивая минимизируемую функцию.Рассмотрим два случая:
1)
:Так как работа
не содержится в , то либо она не была добавлена при ее рассмотрении, либо была заменена работой, рассмотренной позднее. В любом случае это означает, что . Так же по определению все работы должны содержаться и в . Но тогда заменив в оптимальном расписании на , мы сохраним корректность расписания и не увеличим минимизируемую функцию.2)
:Так как мы рассматриваем работы в порядке неубывания их дедлайнов, то, следовательно,
, и замена работы на в оптимальном расписании не может сделать его некорректным. Тогда для доказательства нам осталось показать, что .Пусть
— работа, замененная работой в процессе построения , и пусть — последовательность работ, которые были исключены из после замены , причем работа была заменена работой . . Будем говорить, что "работа подавляет ", где , если . В таком случае получаем, что , потому что в противном случае работа была бы исключена из раньше чем .Если в последовательности
существует подпоследовательность такая, что подавляет для всех и , то получаем, что , что доказывает оптимальность расписания .Если же такой подпоследовательности не существует, то найдем наименьшее
такое, что не существует работы , которая бы подавляла работу , и было бы меньше . По определению и и из факта, что , получаем, что после добавления во множество работы , ни одна из работ, рассмотренных ранее, не будет удалена из , а так же все эти работы содержатся и в оптимальном расписании , поскольку .Покажем, что данный факт приведет нас к противоречию.
Пусть
это множество после замены работы на . Если , то в оптимальном расписании мы можем заменить работу на , поскольку . Но так как , то все работы из множества могут быть выполнены до их дедлайнов, что противоречит построению . Следовательно, . Тогда аналогично предыдущему случаю получаем, что все работы из множества могут быть выполнены вовремя. Кроме того, все работы из так же могут быть выполнены вовремя, что следует из построения .Время работы
Время работы алгоритма зависит от того, насколько быстро мы будем добавлять и удалять работы из множества двоичная куча и красно-черное дерево.
, а также как быстро мы будем искать работу с минимальным весом. Если в качестве множества использовать структуру данных, умеющую выполнять данные операции за , то время работы всего алгоритма будет составлять . Например, такими структурами данных являютсяЛитература
- Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 96 стр. — ISBN 978-3-540-69515-8