
- •Next Fit Algorithm (Поиск подходящего из последующих)
- •First Fit Algorithm (Поиск первого подходящего)
- •Worst Fit Algorithm (Поиск наименее подходящего)
- •Best Fit Algorithm (Поиск наиболее подходящего)
- •Задача о выборе заявок
- •Принцип жадного выбора
- •Оптимальность для подзадач
- •Жадный алгоритм или динамическое программирование? Задача о рюкзаке
- •Другие примеры
- •Оптимизация сборов за оформление грузовых таможенных деклараций
Московский государственный университет имени М. В. Ломоносова
Механико-математический факультет
Доклад на тему
«Задача об упаковке. Жадный алгоритм»
Подготовила
Студентка 431 группы
Ледовских Александра
Москва 2012
З
адача
об упаковке имеет много разновидностей:
линейная и двумерная упаковка, упаковка
по весу или по стоимости и другие. Многие
из этих задач имеют практическое
применение для реальной упаковки грузов,
их хранения и проблем транспортировки.
Например,
как наиболее плотно разместить на
плоскости одинаковые круги? Такая
упаковка называется шестиугольной (см.
рис.1). Она дает эффективность
.
С
рис.1
трого математически еще не разрешена задача о наиболее плотной упаковке шаров одинакового размера, хотя ответ кажется очевидным. В 1998 году Томас Каллистер Хэлес привел доказательство проверкой вовлечения истощения многих отдельных случаев, используя сложные компьютерные вычисления. Рефери сказали, что они "на 99% уверены" в правильности доказательства Хэлеса. Уложим три шара на плоской поверхности так, чтобы их центры образовали равносторонний треугольник, а сами они касались друг друга. Затем будем подкладывать к ним другие шары так, чтобы каждый новый касался двух уже уложенных. Так получится первый слой шаров. Затем уложим второй слой, помещая каждый новый шар в «глубокую яму», или углубление, образовавшееся в центре каждой треугольной группы шаров первого слоя. В законченном виде второй слой не отличается от первого, он только сдвинут в горизонтальной плоскости. Если и следующие слои строить таким же способом, то получится так называемая гранецентрированная кубическая упаковка шаров, хорошо знакомая химикам и кристаллографам. При этом шары заполняют
Мы же будем рассматривать задачу об упаковке в контейнеры, общая постановка которой формулируется так: имеется набор контейнеров определенного объема и набор предметов произвольного объема, которые в эти контейнеры требуется уложить, использовав при этом как можно меньше контейнеров. В простейшем случае пространственной ориентацией пренебрегают.
Задача эта - NP-полная, то есть для гарантированного нахождения оптимального решения нужен полный перебор. С ростом числа элементов для упаковки задача становится не разрешимой данным методом.
Вариацией метода полного перебора является метод ветвей и границ с той разницей, что мы отсеиваем подмножества допустимых решений, заведомо не содержащие оптимальных решений. Однако этот метод работает не для всех наборов данных. Можно привести примеры, в которых время выполнения будет таким же, как и для простого перебора.
Однако есть эвристические алгоритмы для нахождения подходящего решения. Возможно, оно будет и оптимальным.
Рассмотрим для решения этой задачи жадный алгоритм. Такой алгоритм делает на каждом шаге локально оптимальный выбор, допуская, что итоговое решение также окажется оптимальным. Однако это не всегда так, но для большого числа алгоритмических задач жадные алгоритмы действительно дают оптимальное решение. Нужно отметить, что вопрос о применимости жадного алгоритма в каждом классе задач решается отдельно, однако для обоснования общего решения существует теория матроидов.
Рассмотрим четыре таких алгоритма.
Next Fit Algorithm (Поиск подходящего из последующих)
1. Берем новый элемент
2. Берем новый контейнер.
3. Кладем элемент в контейнер.
4. Берем следующий элемент.
5. Если элемент помещается в контейнер, идем на шаг 3. Если элемент не помещается в контейнер, идем на шаг 2.
То есть мы просто кладем элементы в контейнер, и если некий элемент уже не помещается, берем новый контейнер. Алгоритм в большинстве случаев даст наихудшие результаты из всех рассматриваемых алгоритмов. Можно придумать и более хитрый алгоритм, но у этого алгоритма есть один плюс - он не требует просмотра прошлых контейнеров. Это может оказаться полезным, если, например, контейнеры к нам подъезжают по конвейеру.
First Fit Algorithm (Поиск первого подходящего)
1. Берем новый элемент
2. Берем новый контейнер.
3. Кладем элемент в контейнер.
4. Берем следующий элемент.
5. Если элемент помещается в контейнер, идем на шаг 3. Если элемент не помещается в контейнер, проверяем остальные контейнеры по порядку. Если находится контейнер с достаточным количеством свободного места, кладем элемент в контейнер и идем на шаг 4, иначе идем на шаг 2.
То есть кладем элементы в контейнер, и если элемент уже не помещается, пытаемся найти подходящий контейнер среди уже частично заполненных. Если места не находим, берем новый контейнер.
Worst Fit Algorithm (Поиск наименее подходящего)
1. Берем новый элемент
2. Берем новый контейнер.
3. Кладем элемент в контейнер.
4. Берем следующий элемент.
5. Если элемент помещается в контейнер, идем на шаг 3. Если элемент не помещается в контейнер, берем частично заполненный контейнер с максимумом свободного места. Если элемент помещается в контейнер, кладем элемент в контейнер и идем на шаг 4, иначе идем на шаг 2.
То есть кладем элементы в контейнер, и если элемент уже не помещается, пытаемся положить его в наименее заполненный контейнер. Если это сделать не удается, берем новый контейнер.
Best Fit Algorithm (Поиск наиболее подходящего)
1. Берем новый элемент
2. Берем новый контейнер.
3. Кладем элемент в контейнер.
4. Берем следующий элемент.
5. Если элемент помещается в контейнер, идем на шаг 3. Если элемент не помещается в контейнер, берем частично заполненный контейнер с минимумом свободного места, но в который еще можно положить данный элемент. Если такой контейнер находится, идем на шаг 3, иначе идем на шаг 2.
То есть кладем элементы в контейнер, и если элемент уже не помещается, пытаемся положить его в наиболее заполненный контейнер, но в котором еще есть достаточно места для этого элемента. Если это сделать не удается, берем новый контейнер.
Для каждого из этих алгоритмов есть вариант с предварительной сортировкой элементов по уменьшению - First Fit Decreasing, Best Fit Decreasing и т.п. То есть элементы берутся, начиная с самого крупного, что дает лучшие результаты.
Рассмотрим схему работы жадных алгоритмов на конкретных примерах.
Задача о выборе заявок
Даны n заявок на проведение занятий в некоторой аудитории. В каждой заявке указаны начало и конец занятия (si и fi для i-й заявки). Заявки с номерами i и j совместны, если интервалы [si, fi) и [sj, fj) не пересекаются (т. е. fi ≤ sj или fj ≤ si). Задача о выборе заявок состоит в том, чтобы набрать максимальное количество совместных друг с другом заявок.
Приведем жадный алгоритм, решающий данную задачу. При этом полагаем, что заявки упорядочены в порядке возрастания времени окончания.
На вход данному алгоритму подаются массивы начала и окончания занятий. Множество A состоит из номеров выбранных заявок, а j — номер последней заявки. Жадный алгоритм ищет заявку, начинающуюся не ранее окончания j-той, затем найденную заявку включает в A, а j присваивает ее номер.
Алгоритм работает за O(nlogn+n), т. е. сортировка плюс выборка. На каждом шаге выбирается наилучшее решение. Покажем, что в итоге получится оптимум.
Доказательство. Заметим, что все заявки отсортированы по неубыванию времени окончания. Заявка номер 1, очевидно, входит в оптимум (если нет, то заменим самую раннюю заявку в оптимуме на нее, от этого хуже не станет). Выкинув все заявки, противоречащие первой, получим исходную задачу с меньшим количеством заявок. Рассуждая по индукции, аналогичным образом приходим к оптимальному решению.
В общем случае нельзя сказать, можно ли получить оптимальное решение с помощью жадного алгоритма применительно к конкретной задаче. Но есть две особенности, характерные для задач, которые решаются с помощью жадных алгоритмов: принцип жадного выбора и свойство оптимальности для подзадач.