Жадібні алгоритми. Переваги та недоліки
Жадібний алгоритм — простий і прямолінійний евристичний алгоритм, який приймає найкраще рішення, виходячи з наявних на поточному етапі даних, не турбуючись про можливі наслідки, сподіваючись врешті-решт отримати оптимальне рішення. Легкий в реалізації і часто дуже ефективний за часом виконання. Багато задач не можуть бути розв'язані з його допомогою.
Загального критерію оцінки застосовності жодного алгоритму для вирішення конкретного завдання не існує, однак, для завдань, що вирішуються жадібними алгоритмами, характерні дві особливості: по-перше, до них застосуємо Принцип жодного вибору, а по-друге, вони мають властивість Оптимальності для підзадач.
Кажуть, що до оптимізаційної задачі застосуємо принцип жодного вибору, якщо послідовність локально оптимальних виборів дає глобально оптимальне рішення. У типовому випадку доказ оптимальності слід такою схемою:
- Доводиться, що жадібний вибір на першому кроці не закриває шляху до оптимального рішення: для всякого рішення є інше, узгоджене з жадібним вибором і не гірше першого.
- Показується, що подзадача, що виникає після жодного вибору на першому кроці, аналогічна вихідної.
- Міркування завершується за індукції.
Кажуть, що задача має властивість оптимальності для підзадач, якщо оптимальне рішення задачі містить в собі оптимальні рішення для всіх її підзадач. Наприклад, в задачі про вибір заявок можна помітити, що якщо - Оптимальний набір заявок, що містить заявку номер 1, то - Оптимальний набір заявок для меншого безлічі заявок , Що складається з тих заявок, для яких .
Приклади:
Розмін монет
Завдання. Монетна система деякого держави складається з монет номіналом . Потрібно видати суму найменшим можливим кількістю монет.
Жадібний алгоритм вирішення цієї задачі такий. Береться найбільшу можливу кількість монет гідності : . Таким же чином отримуємо, скільки потрібно монет меншого номіналу, і т. д.
Для даної задачі жадібний алгоритм не завжди дає оптимальне рішення. Наприклад, суму в 24 копійки монетами в 1, 5 і 7 коп. жадібний алгоритм розмінює так: 7 коп. - 3 шт., 1 коп. - 3 шт., В той час як правильне рішення - 7 коп. - 2 шт., 5 коп. - 2 шт. Тим не менш, на всіх реальних монетних системах жадібний алгоритм дає правильну відповідь.
Вибір заявок
Формулювання № 1. Дано заявок на проведення занять в деякій аудиторії. У кожній заявці вказано початок і кінець заняття ( і для -Ї заявки). У разі перетину заявок можна задовольнити лише одну з них. Заявки з номерами і сумісні, якщо інтервали і не перетинаються (тобто або ). Завдання про вибір заявок полягає в тому, щоб набрати максимальну кількість спільних один з одним заявок.
Формулювання № 2. На конференції, щоб відвести більше часу на неформальне спілкування, різні секції рознесли по різних аудиторій. Вчений з надзвичайно широкими інтересами хоче відвідати кілька доповідей, які проходять в різних секціях. Відомо початок і кінець кожної доповіді. Визначити, яку максимальну кількість доповідей можна відвідати.
Наведемо жадібний алгоритм, вирішальний дану задачу. При цьому вважаємо, що заявки впорядковані в порядку зростання часу закінчення. Якщо це не так, то можна відсортувати їх за час ; Заявки з однаковим часом кінця володіємо в довільному порядку.
Activity-Selector(s,f)
- length[s]
- for to do
if then
- return A
На вхід даному алгоритму подаються масиви початку і закінчення занять. Безліч A складається з номерів вибраних заявок, а j - номер останньої заявки. Жадібний алгоритм шукає заявку, що починається не раніше закінчення j-тій, потім знайдену заявку включає в A, а j присвоює її номер. Таким чином, кожен раз ми вибираємо те (ще не почалося) заняття, до кінця якого залишилося найменше часу.
Алгоритм працює за , Тобто сортування плюс вибірка. На кожному кроці вибирається найкраще рішення. Покажемо, що в підсумку вийде оптимум.
Доказ. Зауважимо, що всі заявки відсортовані по неубиванію часу закінчення. Заявка номер 1, очевидно, входить до оптимум (якщо немає, то замінимо найбільш ранню заявку в оптимумі на неї, від цього гірше не стане). Виконав всі заявки, які суперечать першої, отримаємо вихідну завдання з меншою кількістю заявок. Розмірковуючи по індукції, аналогічним чином приходимо до оптимального рішення.
Інші жадібні алгоритми
- Алгоритм Хаффмана (адаптивний алгоритм оптимального префіксних кодування алфавіту з мінімальною надмірністю).
- Алгоритм Краскала (пошук остовного лісу мінімальної ваги в графі).
- Алгоритм Прима (пошук остовного дерева мінімальної ваги в зв'язному графі).
- Алгоритм Лін-Керніга (Кластеризація графа).
Узагальненням жодних алгоритмів є алгоритм Радо - Едмондс.