- •Содержание
- •Введение.
- •1. Основы анализа алгоритмов
- •1.1. Сравнительные оценки алгоритмов
- •1.2. Элементарные операции в формальной системе
- •1.3. Классы входных данных
- •1.4. Классификация алгоритмов по виду функции трудоемкости
- •1.5. Классификация скоростей роста. Асимптотический анализ функций
- •1. Оценка (тета)
- •2. Оценка о (о большое)
- •3. Оценка (Омега)
- •1.6. Эффективность рекурсивных алгоритмов
- •1.7. Анализ программ
- •1.8. Вопросы для самоконтроля
- •Классификация алгоритмов по виду функции трудоемкости.
- •2. Алгоритмы поиска и выборки
- •2.1. Последовательный поиск
- •2.2. Двоичный поиск
- •2.3. Задача выборки
- •2.4. Вопросы для самоконтроля
- •3.Алгоритмы сортировки
- •3.1. Сортировка трех чисел по месту
- •3.2. Сортировка вставками
- •3.3. Пузырьковая сортировка
- •3.4. Сортировка Шелла.
- •3.5. Корневая сортировка
- •3.6. Сортировка методом индексов
- •3.7. Быстрая сортировка (алгоритм Хоара)
- •3.8. Вопросы для самоконтроля
- •Сортировка Шелла.
- •Сортировка методом индексов.
- •4. Алгоритмы на графах
- •4.1. Основные понятия теории графов
- •4.2. Структуры данных для представления графов
- •4.3. Алгоритмы обхода вершин графа
- •4.3.1. Обход в глубину
- •4.3.2. Обход в ширину
- •4.4. Поиск остовного дерева минимального веса
- •4.4.1. Алгоритм Дейкстры – Прима
- •4.4.2. Алгоритм Крускала
- •4.5. Алгоритм поиска кратчайшего пути
- •4.6. Вопросы для самоконтроля
- •Структуры данных для представления графов.
- •5. Численные методы
- •5.1. Вычисление значений многочленов
- •5.2. Умножение матриц
- •5.2.1 Стандартный алгоритм умножения матриц
- •5.2.2. Умножение матриц по Винограду
- •5.2.3. Умножение матриц по Штрассену
- •5.3. Вопросы для самоконтроля
- •Стандартный алгоритм умножения матриц.
- •6. Алгоритмы сравнения с образцами
- •6.1. Сравнение строк
- •6.2. Алгоритм Кнута – Морриса – Пратта
- •6.3. Алгоритм Бойера - Мура
- •6.4. Вопросы для самоконтроля
- •7. Вычислительная геометрия
- •7.1. Основные понятия
- •7.2. Векторное произведение векторов
- •7.2.1. Ориентированная площадь треугольника
- •7 .3. Задача о выпуклой оболочке
- •7.3.1. Алгоритм Грэхема
- •7.3.2. Алгоритм Джарвиса
- •7.3.3. Рекурсивный алгоритм
- •7.4. Вопросы для самоконтроля
- •8. Задачи класса np
- •8.1. Примеры np-полных задач
- •8.1.1. Задача о коммивояжере
- •8.1.2. Задача о раскраске графа
- •8.1.3. Раскладка по ящикам
- •8.1.4 Упаковка рюкзака
- •8.1.5. Задача о суммах элементов подмножества
- •8.1.6. Задача о планировании работ
- •8.2. Приближенные эвристические решения nр-полных задач.
- •8.2.1. Жадные приближенные алгоритмы
- •8.2.2. Приближения в задаче коммивояжера
- •8.2.3. Приближения в задаче о раскладке по ящикам
- •8.2.4. Приближения в задаче об упаковке рюкзака
- •8.3. Вопросы для самопроверки
- •Приближения в задаче об упаковке рюкзака.
- •9. Динамическое программирование
- •Часть1--------------------
- •10. Метод ветвей и границ
- •Вопросы к зачету
- •Классификация алгоритмов по виду функции трудоемкости.
- •Приближения в задаче об упаковке рюкзака.
- •Динамическое программирование
- •Метод ветвей и границ. Литература
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
BinLoc1
while (used(BinLoc)+Size(item))>1 do
// ищем подходящий ящик
BinLocBinLoc+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 для этого набора.