Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка эффективных алгоритмов.doc
Скачиваний:
115
Добавлен:
24.11.2019
Размер:
1.2 Mб
Скачать

8.2.3. Приближения в задаче о раскладке по ящикам

Для данной задачи существует множество эвристических алгоритмов.

FF алгоритм.

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

Стратегия состоит в том, что ящики просматриваются поочередно, пока не найдется ящик, в котором достаточно свободного места для упаковки очередного предмета.

FirstFit (Size, N, Bin)

// Size – список размеров предметов

// N – число предметов; Bin(N) – размещение различных предметов

// Used – занятый объем ящика

for i=1 to N do

Bin[i]0

endfor

For item=1 to N do

BinLoc1

while (used(BinLoc)+Size(item))>1 do

// ищем подходящий ящик

BinLocBinLoc+1

endwhile

Bin(item)BinLoc

// занимаем найденный ящик

Used[BinLoc]Used[BinLoc]+Size[item]

endfor

Пример 1. Например, так будет происходить упаковка предметов размером (0.5, 0.7, 0.3, 0.9, 0.6, 0.8, 0.1, 0.4, 0.2, 0.5) в ящики единичного объема.

В 1-ый ящик попадут (0.5, 0.3, 0.1), во второй – (0.7, 0.2), в третий (0.9), четвертый (0.6, 0.4), в пятый (0.8), и в шестой (0.5), то есть всего понадобится 6 ящиков.

Для этого алгоритма mmin ≥ Si+1, где Si – целая часть суммы объемов предметов.

FFD алгоритм.

В другом варианте этого алгоритма список предметов сначала сортируется по убыванию размера (в неубывающем порядке), а затем они раскладываются поочередно в первый подходящий ящик.

Для вышеприведенного примера этот алгоритм дает оптимальное решение.

Пример 2. Отсортированный по неубыванию список предметов (0.9, 0.8, 0.7, 0.6, 0.5, 0.5, 0.4, 0.3, 0.2, 0.1). Раскладка происходит в 5 ящиков:

1 – (0.9, 0.1) 2 – (0.8, 0.2) 3 – (0.7, 0.3)

4 – (0.6, 0.4) 5 – (0.5, 0.5)

Однако модифицированный алгоритм не всегда приводит к лучшим результатам, чем обычный.

Пример 3. Набор предметов (0.2, 0.6, 0.5, 0.2, 0.8, 0.3, 0.2, 0.2).

По первому способу упаковка произойдет в 3 ящика:

(0.2, 0.6, 0.2), (0.5, 0.3, 0.2) и (0.8, 0.2)

По второму способу для отсортированного списка (0.8, 0.6, 0.5, 0.3, 0.2, 0.2, 0.2, 0.2) получаем 4 ящика:

(0.8, 0.2), (0.6, 0.3), (0.5, 0.2, 0.2) и (0.2).

Анализ показывает, что в среднем стратегия укладки в первый подходящий ящик по отсортированному списку приводит к числу ящиков, превышающему оптимальное, в среднем на 50% (т.е. если для оптимальной укладки достаточно 10 ящиков, то результат алгоритма будет около 15). Если список предварительно не сортировать, то дополнительные расходы составят в среднем 70%, то есть при оптимальном числе ящиков 10, алгоритм сгенерирует укладку в 17 ящиков.

BF (Best Fit - наилучший остаток) алгоритм

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

Для вышеприведенного набора предметов (0.5, 0.7, 0.3, 0.9, 0.6, 0.8, 0.1, 0.4, 0.2, 0.5) упаковка данным способом приведет к минимальному числу ящиков. В первый ящик попадает предмет объемом 0.5, второй предмет (объем 0.7) в этот ящик не помещается и занимает второй ящик. Предмет объемом 0.3 может быть размещен и в первом, и во втором ящике. Свободное место, остающееся при этом в первом ящике – 0.2, а во втором – 0. Поэтому этот предмет будет размещен в ящике 2. Далее, следуя вышеприведенному алгоритму, мы получаем оптимальную упаковку, такую же, как и в примере 2 для этого набора.