First-fit-decreasing (FFD) — это алгоритм упаковки контейнеров . Его входные данные — список элементов разных размеров. Его выход — упаковка — разбиение элементов на контейнеры фиксированной емкости, так что сумма размеров элементов в каждом контейнере не превышает емкость. В идеале мы хотели бы использовать как можно меньше контейнеров, но минимизация количества контейнеров — это NP-трудная задача, поэтому мы используем приблизительно оптимальную эвристику .
Описание
Алгоритм FFD работает следующим образом.
Расположите предметы от большего к меньшему.
Откройте новый пустой контейнер, контейнер №1.
Для каждого предмета от самого большого к самому маленькому найдите первую ячейку, в которую этот предмет помещается, если таковая имеется.
Если такой контейнер найден, поместите новый предмет в него.
В противном случае откройте новый пустой контейнер и положите в него новый предмет.
Эквивалентное описание алгоритма FFD выглядит следующим образом.
Расположите предметы от большего к меньшему.
Пока остались следующие пункты:
Откройте новый пустой контейнер.
Для каждого элемента от наибольшего к наименьшему:
Если он помещается в текущую корзину, вставьте его.
В стандартном описании мы циклически обходим элементы один раз, но оставляем много открытых ячеек. В эквивалентном описании мы циклически обходим элементы много раз, но оставляем только одну открытую ячейку каждый раз.
Анализ производительности
Производительность FFD анализировалась в несколько этапов. Ниже обозначает количество бинов, используемых FFD для входного набора S и емкость бинов C.
В 1973 году Д.С. Джонсон доказал в своей докторской диссертации [1] , что для любого примера S и емкости C.
В 1985 году Б. С. Бэкер [2] дал несколько более простое доказательство и показал, что аддитивная константа не больше 3.
Юэ Миньи [3] доказал это в 1991 году, а в 1997 году усовершенствовал этот анализ совместно с Ли Жунхэном. [4]
В 2007 году Дьёрдь Доса [5] доказал тесную границу и представил пример, для которого .
Пример наихудшего случая
Пример нижней границы, приведенный Досой, выглядит следующим образом: Рассмотрим две конфигурации ячеек:
;
.
Если в оптимальном решении имеется 4 копии и 2 копии , FFD вычислит следующие ячейки:
4 контейнера с конфигурацией ,
1 контейнер с конфигурацией ,
1 контейнер с конфигурацией ,
1 контейнер с конфигурацией ,
1 один последний контейнер с конфигурацией ,
То есть всего 8 ячеек, тогда как оптимум имеет только 6 ячеек. Таким образом, верхняя граница узкая, потому что .
Этот пример можно распространить на все размеры : [5] в оптимальной конфигурации имеется 9 k +6 ячеек: 6 k +4 типа B 1 и 3 k +2 типа B 2. Но для FFD требуется не менее 11 k +8 ячеек, что составляет .
Производительность с делимыми размерами элементов
Важным частным случаем упаковки в контейнеры является тот случай, когда размеры элементов образуют делимую последовательность (также называемую факторизованной ). Частный случай делимых размеров элементов возникает при распределении памяти в компьютерных системах, где размеры элементов являются степенями 2. В этом случае FFD всегда находит оптимальную упаковку. [6] : Теор.2
Свойства монотонности
Вопреки интуиции, не является монотонной функцией C. [7] : Рис.4 Аналогично, не является монотонной функцией размеров элементов в S : возможно, что элемент уменьшится в размере, но количество ячеек увеличится.
Однако алгоритм FFD обладает свойством «асимптотической монотонности», определяемым следующим образом. [7] : Лем.2.1
Для каждого экземпляра S и целого числа m пусть MinCap( S,m ) будет наименьшей емкостью C такой, что
Для каждого целого числа m пусть MinRatio( m ) будет инфимумом чисел r ≥1 таким образом, что для всех входных наборов S , . Это величина, на которую нам нужно «раздуть» ячейки, чтобы FFD достиг оптимального количества ячеек.
Тогда для каждого входа S и для каждого r ≥ MinRatio( m ), . Это показывает, в частности, что инфимум в приведенном выше определении можно заменить минимумом.
Примеры
Например, предположим, что входные данные следующие:
44, 24, 24, 22, 21, 17, 8, 8, 6, 6.
Вместимостью 60, FFD упаковывает 3 контейнера:
44, 8, 8;
24, 24, 6, 6;
22, 21, 17.
Но при емкости 61 FFD вмещает 4 контейнера:
44, 17;
24, 24, 8;
22, 21, 8, 6;
6.
Это происходит потому, что при емкости 61 число 17 помещается в первый контейнер и, таким образом, блокирует путь к следующим 8, 8.
В качестве другого примера [8] : Пример 5.1 предположим, что входы следующие: 51, 28, 28, 28, 27, 25, 12, 12, 10, 10, 10, 10, 10, 10, 10, 10. При емкости 75 FFD упаковывает 4 контейнера:
51, 12, 12
28, 28, 10
28, 27, 10, 10
25, 10, 10, 10, 10, 10
Но при вместимости 76 ему понадобится 5 контейнеров:
51, 25
28, 28, 12
28, 27, 12
10, 10, 10, 10, 10, 10, 10
10
Рассмотрим приведенный выше пример с емкостью 60. Если 17 станет 16, то результирующая упаковка будет следующей:
44, 16;
24, 24, 8;
22, 21, 8, 6;
6.
Модифицированный первый подходящий-убывающий
Модифицированное уменьшение первого соответствия (MFFD) [9] улучшает FFD для элементов, превышающих половину ячейки, классифицируя элементы по размеру на четыре класса: большой, средний, маленький и крошечный, что соответствует элементам с размером > 1/2 ячейки, > 1/3 ячейки, > 1/6 ячейки и более мелким элементам соответственно. Затем он проходит через пять фаз:
Выделите контейнер для каждого крупного предмета, расположив его от большего к меньшему.
Продвигайтесь вперед по корзинам. На каждой: Если наименьший оставшийся средний предмет не помещается, пропустите эту корзину. В противном случае поместите наибольший оставшийся средний предмет, который помещается.
Пройдите назад через те ячейки, которые не содержат средний предмет. На каждой: Если два самых маленьких оставшихся маленьких предмета не помещаются, пропустите эту ячейку. В противном случае поместите самый маленький оставшийся маленький предмет и самый большой оставшийся маленький предмет, который помещается.
Пройдите вперед через все ячейки. Если наименьший оставшийся предмет любого размера не помещается, пропустите эту ячейку. В противном случае поместите наибольший помещающийся предмет и оставьте его в этой ячейке.
Используйте FFD, чтобы упаковать оставшиеся предметы в новые контейнеры.
Этот алгоритм был впервые изучен Джонсоном и Гэри [9] в 1985 году, где они доказали, что . Эта граница была улучшена в 1995 году Юэ и Чжаном [10], которые доказали, что .
Другие варианты
Best-fit-decreasing (BFD) очень похож на FFD, за исключением того, что после сортировки списка он обрабатывается с помощью best-fit bin packing . Его асимптотическое отношение аппроксимации такое же, как у FFD - 11/9.
Реализации
Python: Пакет prtpy содержит реализацию метода уменьшения по первому подходящему множеству.
^ Ли, Ронгхэн; Юэ, Миньи (август 1997 г.). «Доказательство FFD(L) < -OPT(L) + 7/9». Chinese Science Bulletin . 42 (15): 1262– 1265. Bibcode : 1997ChSBu..42.1262L. doi : 10.1007/BF02882754. S2CID 93280100.
^ ab Dósa, György (2007). "The Tight Bound of First Fit Decreasing bin-Packing Algorithm is FFD(I) ≤ 11/9OPT(I) + 6/9". В Chen Bo; Mike Paterson; Zhang Guochuan (ред.). Combinatorics, Algorithms, Probabilistic and Experimental Methodologies . First International Symposium, ESCAPE 2007, Hangzhou, China, April 7–9, 2007. Lecture Notes in Computer Science. Vol. 4614. pp. 1– 11. doi :10.1007/978-3-540-74450-4_1. ISBN978-3-540-74449-8.
^ Коффман, Э. Г.; Гарей, М. Р.; Джонсон, Д. С. (1987-12-01). «Упаковка контейнеров с делимыми размерами предметов». Журнал сложности . 3 (4): 406– 428. doi :10.1016/0885-064X(87)90009-4. ISSN 0885-064X.
^ ab Coffman, EG Jr.; Garey, MR; Johnson, DS (1978-02-01). «Применение упаковки контейнеров к многопроцессорному планированию». SIAM Journal on Computing . 7 (1): 1– 17. doi :10.1137/0207001. ISSN 0097-5397.
^ Хуан, Синь; Лу, Пиньян (2021-07-18). «Алгоритмическая структура для аппроксимации распределения максиминной доли домашних дел». Труды 22-й конференции ACM по экономике и вычислениям . EC '21. Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. стр. 630–631 . arXiv : 1907.04505 . doi : 10.1145/3465456.3467555. ISBN978-1-4503-8554-1. S2CID 195874333.
^ ab Джонсон, Дэвид С.; Гари, Майкл Р. (октябрь 1985 г.). «Теорема 7160 для упаковки контейнеров». Журнал сложности . 1 (1): 65– 106. doi : 10.1016/0885-064X(85)90022-6 .