
- •1.Побудова і аналіз алгоритмів
- •1.1.Формалізація алгоритмів.
- •1.2.Покрокове проектування алгоритмів.
- •1.3.Характеристики алгоритму
- •1.4.Складність алгоритму
- •1.5.Ефективність алгоритмів
- •1.6.Правила аналізу складності алгоритмів.
- •2.Алгоритми сортування
- •2.1.Задача сортування
- •2.2.Сортування вибіркою
- •2.2.1.Сортування простою вибіркою
- •2.2.2.Обмінне сортування простою вибіркою
- •2.2.3.Бульбашкове сортування
- •2.2.4.Сортування Шелла
- •2.3.Сортування включенням
- •2.3.1.Сортування простим включенням
- •2.3.2.Бульбашкове сортування включенням
- •2.3.3.Турнірне сортування
- •2.3.4.Сортування впорядкованим бінарним деревом
- •2.3.5.Сортування частково впорядкованим деревом
- •2.4.Сортування розподілом
- •2.4.1.Порозрядне цифрове сортування
- •2.4.2.Швидке сортування Хоара
- •2.5.Сортування злиттям
- •2.5.1.Сортування попарним злиттям
- •2.6.Рандомізація
- •3.Алгоритми пошуку
- •3.1.Послідовний (лінійний) пошук
- •3.2.Бінарний пошук
- •3.3.Метод інтерполяції
- •3.4.Метод „золотого перерізу”
- •3.5.Алгоритми пошуку послідовностей
- •3.5.1.Прямий алгоритм пошуку
- •3.5.2.Алгоритм Кнута, Моріса, Пратта
- •3.5.3.Алгоритм Боуєра та Мура
- •4.Методи швидкого доступу до даних
- •4.1.Хешування даних
- •4.1.1.Методи розв’язання колізій
- •4.1.2.Переповнення таблиці і повторне хешування
- •4.1.3.Оцінка якості хеш-функції
- •4.2.Організація даних для прискорення пошуку за вторинними ключами
- •4.2.1.Інвертовані індекси
- •4.2.2.Бітові карти
- •5.Мережеві алгоритми
- •5.1.Представлення мереж
- •5.2.Операції з вузлами і зв’язками
- •5.2.1.Обхід мережі
- •5.2.2.Найменші стовбурні дерева
- •5.3.Найкоротший маршрут
- •5.3.1.Інші задачі пошуку найкоротшого маршруту
- •5.3.1.1.Двох-точковий найкоротший маршрут
- •5.3.1.2.Обчислення найкоротшого маршруту для всіх пар
- •5.3.1.3.Штрафи за повороти
- •5.3.2.Застосування методу пошуку найкоротшого маршруту
- •5.3.2.1.Розбиття на райони
- •5.3.2.2.Складання плану робіт
- •5.3.2.3.Планування колективної роботи
- •5.4.Максимальний потік
- •5.4.1.Застосування максимальних потоків
- •5.4.1.1.Непересічні шляхи
- •5.4.1.2.Розподіл робіт
- •6.Методи розробки алгоритмів
- •6.1.Метод частинних цілей
- •6.2.Динамічне програмування
- •6.3.Метод сходження
- •6.4.Дерева розв’язків
- •6.4.1.Мінімаксний пошук
- •6.4.2.Покращення пошуку в дереві гри
- •6.4.3.Метод відпрацювання назад
- •6.5.Програмування з поверненнями назад
- •6.5.1.Метод спроб та помилок
- •6.5.2.Реалізація пошуку з поверненням
- •6.5.3.Альфа-бета відсікання
- •6.5.4.Метод гілок і границь
- •6.6.Евристичні алгоритми
- •6.7.Імовірнісні алгоритми
- •6.8.Генетичні алгоритми
- •6.8.1.Розв’язок діофантового рівняння.
- •6.8.2.Програмна реалізація
6.5.4.Метод гілок і границь
Метод гілок і границь є ще одним з методів відсікання гілок в дереві рішень, щоб не було необхідно розглядати всі гілки дерева. Загальний підхід при цьому полягає в тому, щоб відстежувати межі вже знайдених і можливих рішень. Якщо в якійсь точці найкраще з вже знайдених рішень краще, ніж краще можливе рішення в нижніх гілках, то можна ігнорувати всі шляхи вниз від вузла.
Наприклад, припустимо, що маємо 100 мільйонів доларів, які потрібно вкласти в можливі інвестиції. Кожне з вкладень має різну вартість і дає різний прибуток. Необхідно вирішити, як вкласти гроші найкращим чином, щоб сумарний прибуток був максимальним.
Задачі такого типу називаються задачею формування портфеля. Є декілька позицій (інвестицій), які повинні поміститися в портфель фіксованого розміру (100 мільйонів доларів). Кожна з позицій має вартість (гроші) і ціну (теж гроші). Необхідно знайти набір позицій, який поміщається в портфель і має максимально можливу ціну.
Цю задачу можна змоделювати за допомогою дерева рішень. Кожний вузол дерева відповідає певній комбінації позицій в портфелі. Кожна гілка відповідає ухваленню рішення про те, щоб видалити позицію з портфеля або додати її в нього. Ліва гілка першого вузла відповідає першому вкладенню.
Дерево рішень для цієї задачі є повним бінарним деревом, глибина якого рівна кількості інвестицій. Кожний листок відповідає повному набору інвестицій.
Щоб використати метод гілок і границь, створюють масив, який міститиме позиції з якнайкращого знайденого дотепер рішення. При ініціалізації масив повинен бути порожній. Можна також використати змінну для стеження за ціною цього рішення. Спочатку ця змінна може мати невелике значення, щоб перше ж знайдене реальне рішення було краще початкового.
При пошуку в дереві рішень, якщо в якійсь точці аналізоване рішення не може бути краще, ніж існуюче, то можна припинити подальший пошук цим шляхом. Також, якщо в якійсь точці вибрані позиції коштують більше 100 мільйонів, то можна також припинити пошук.
У міру просування деревом алгоритму не потрібно постійно перевіряти, чи буде часткове рішення, яке вона розглядає, краще, ніж найкраще знайдене дотепер рішення. Якщо часткове рішення краще, то буде краще і вузол, який знаходиться праворуч внизу від цього часткового рішення. Цей вузол представляє той же самий набір позицій, як і часткове рішення, оскільки вся решта позицій при цьому була виключена. Це означає, що алгоритмові необхідно шукати краще рішення тільки тоді, коли він досягає листка дерева.
Фактично, будь-який листок, до якого доходить програма завжди є більш кращим рішенням. Якби це було не так, то гілка, на якому знаходиться цей листок, була б відсічена, коли програма розглядала батьківський вузол. У цій точці переміщення до листка зменшить ціну невибраних позицій до нуля. Якщо ціна рішення не більша, ніж найкраще знайдене дотепер рішення, то перевірка нижньої межі зупинить просування до листка. Використовуючи цей факт, алгоритм може поновляти найкраще рішення досягнувши листка.
При пошуку методом гілок і границь кількість вузлів, які перевіряються, набагато менша ніж при повному переборі. Дерево рішень для задачі портфеля з 20 позиціями містить більше 2 мільйони вузлів. При повному переборі доведеться перевірити їх усіх, при пошуку методом гілок і границь знадобиться перевірити тільки приблизно 1500 з них.
Кількість вузлів, які перевіряє алгоритм при використанні методу гілок і границь, залежить від точних значень даних. Якщо ціна позицій висока, то в правильне рішення входитиме небагато елементів. З другого боку, якщо елементи мають низьку вартість, то до правильного рішення увійде велика їх кількість, тому алгоритмові доведеться досліджувати безліч комбінацій.