Жадібні алгоритми. Переваги та недоліки

Жадібний алгоритм — простий і прямолінійний евристичний алгоритм, який приймає найкраще рішення, виходячи з наявних на поточному етапі даних, не турбуючись про можливі наслідки, сподіваючись врешті-решт отримати оптимальне рішення. Легкий в реалізації і часто дуже ефективний за часом виконання. Багато задач не можуть бути розв'язані з його допомогою.

Загального критерію оцінки застосовності жодного алгоритму для вирішення конкретного завдання не існує, однак, для завдань, що вирішуються жадібними алгоритмами, характерні дві особливості: по-перше, до них застосуємо Принцип жодного вибору, а по-друге, вони мають властивість Оптимальності для підзадач.

Кажуть, що до оптимізаційної задачі застосуємо принцип жодного вибору, якщо послідовність локально оптимальних виборів дає глобально оптимальне рішення. У типовому випадку доказ оптимальності слід такою схемою:

  1. Доводиться, що жадібний вибір на першому кроці не закриває шляху до оптимального рішення: для всякого рішення є інше, узгоджене з жадібним вибором і не гірше першого.
  2. Показується, що подзадача, що виникає після жодного вибору на першому кроці, аналогічна вихідної.
  3. Міркування завершується за індукції.

Кажуть, що задача має властивість оптимальності для підзадач, якщо оптимальне рішення задачі містить в собі оптимальні рішення для всіх її підзадач. Наприклад, в задачі про вибір заявок можна помітити, що якщо - Оптимальний набір заявок, що містить заявку номер 1, то - Оптимальний набір заявок для меншого безлічі заявок , Що складається з тих заявок, для яких .

Приклади:

Розмін монет

Завдання. Монетна система деякого держави складається з монет номіналом . Потрібно видати суму найменшим можливим кількістю монет.

Жадібний алгоритм вирішення цієї задачі такий. Береться найбільшу можливу кількість монет гідності : . Таким же чином отримуємо, скільки потрібно монет меншого номіналу, і т. д.

Для даної задачі жадібний алгоритм не завжди дає оптимальне рішення. Наприклад, суму в 24 копійки монетами в 1, 5 і 7 коп. жадібний алгоритм розмінює так: 7 коп. - 3 шт., 1 коп. - 3 шт., В той час як правильне рішення - 7 коп. - 2 шт., 5 коп. - 2 шт. Тим не менш, на всіх реальних монетних системах жадібний алгоритм дає правильну відповідь.

Вибір заявок

Формулювання № 1. Дано заявок на проведення занять в деякій аудиторії. У кожній заявці вказано початок і кінець заняття ( і для -Ї заявки). У разі перетину заявок можна задовольнити лише одну з них. Заявки з номерами і сумісні, якщо інтервали і не перетинаються (тобто або ). Завдання про вибір заявок полягає в тому, щоб набрати максимальну кількість спільних один з одним заявок.

Формулювання № 2. На конференції, щоб відвести більше часу на неформальне спілкування, різні секції рознесли по різних аудиторій. Вчений з надзвичайно широкими інтересами хоче відвідати кілька доповідей, які проходять в різних секціях. Відомо початок і кінець кожної доповіді. Визначити, яку максимальну кількість доповідей можна відвідати.

Наведемо жадібний алгоритм, вирішальний дану задачу. При цьому вважаємо, що заявки впорядковані в порядку зростання часу закінчення. Якщо це не так, то можна відсортувати їх за час ; Заявки з однаковим часом кінця володіємо в довільному порядку.

Activity-Selector(s,f)

  1. length[s]
  2. for to do

if then

  1. return A

На вхід даному алгоритму подаються масиви початку і закінчення занять. Безліч A складається з номерів вибраних заявок, а j - номер останньої заявки. Жадібний алгоритм шукає заявку, що починається не раніше закінчення j-тій, потім знайдену заявку включає в A, а j присвоює її номер. Таким чином, кожен раз ми вибираємо те (ще не почалося) заняття, до кінця якого залишилося найменше часу.

Алгоритм працює за , Тобто сортування плюс вибірка. На кожному кроці вибирається найкраще рішення. Покажемо, що в підсумку вийде оптимум.

Доказ. Зауважимо, що всі заявки відсортовані по неубиванію часу закінчення. Заявка номер 1, очевидно, входить до оптимум (якщо немає, то замінимо найбільш ранню заявку в оптимумі на неї, від цього гірше не стане). Виконав всі заявки, які суперечать першої, отримаємо вихідну завдання з меншою кількістю заявок. Розмірковуючи по індукції, аналогічним чином приходимо до оптимального рішення.

Інші жадібні алгоритми

  • Алгоритм Хаффмана (адаптивний алгоритм оптимального префіксних кодування алфавіту з мінімальною надмірністю).
  • Алгоритм Краскала (пошук остовного лісу мінімальної ваги в графі).
  • Алгоритм Прима (пошук остовного дерева мінімальної ваги в зв'язному графі).
  • Алгоритм Лін-Керніга (Кластеризація графа).

Узагальненням жодних алгоритмів є алгоритм Радо - Едмондс.