Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Теорема

Читайте также:
  1. II закон термодинамики. Теорема Карно-Клаузиуса
  2. Доказательство. Теорема.
  3. Интегральная теорема Лапласа
  4. Котельников теоремасы бойынша санақ шығарудың жиілігін таңдау
  5. ЛЕКЦИЯ 12. ТЕОРЕМА О ПЛОТНОСТИ СУММЫ ДВУХ СЛУЧАЙНЫХ ВЕЛИЧИН
  6. ЛЕКЦИЯ 18. ЦЕНТРАЛЬНАЯ ПРЕДЕЛЬНАЯ ТЕОРЕМА
  7. ЛЕКЦИЯ 6. ИНТЕГРАЛЬНАЯ ТЕОРЕМА МУАВРА–ЛАПЛАСА, ТЕОРЕМА БЕРНУЛЛИ

Пусть I — множество подножеств множества E. Тогда E,I является матроидом тогда и только тогда, когда выполняются первые два свойства матроидов, и по любой неотрицательной весовой функции w на E, жадный алгоритм строит независимое множество максимального веса. Доказательство этого факта приводить не будем. Его можно найти в статье James Oxley, What is a matroid?. Отметим лишь, что этот факт показывает, что матроиды являются единственными иерархическими структурами, для которых применим жадный алгоритм.

 

Рассмотрим небольшую задачу. Допустим, что у нас есть монеты достоинством 25, 10, 5 копеек и 1 копейка и нужно вернуть сдачу 63 копейки. Почти не раздумывая, мы преобразуем эту величину в две монеты по 25 копеек, одну монету в 10 копеек и три монеты по одной копейке. Нам не только удалось быстро определить перечень монет нужного достоинства, но и, по сути, мы составили самый короткий список монет требуемого достоинства. Данный алгоритм заключал­ся в выборе монеты самого большого достоинства (25 копеек), но не больше 63 копе­ек, добавлению ее в список сдачи и вычитанию ее стоимости из 63 (получается 38 копеек). Затем снова выбираем монету самого большого достоинства, но не больше остатка (38 копеек): этой монетой опять оказывается монета в 25 копеек. Эту монету мы опять добавляем в список сдачи, вычитаем ее стоимость из остатка и т.д.

Этот метод внесения изменений называется « жадным » алгоритмом . На каждой от­дельной стадии « жадный » алгоритм выбирает тот вариант, который является локально оптимальным в том или ином смысле. Обратите внимание, что алгоритм для опреде­ления сдачи обеспечивает в целом оптимальное решение лишь вследствие особых свойств монет. Следует подчеркнуть, что не каждый « жадный » алгоритм позволяет получить оп­тимальный результат в целом. Как нередко бывает «жадная стратегия» подчас обеспечивает лишь сиюминутную выгоду, в то время как в целом результат может оказаться неблагоприятным.

Существуют задачи, для которых ни один из известных « жадных » алгоритмов не позволяет получить оптимального решения; тем не менее имеются « жадные » алго­ритмы , которые с большой вероятностью позволяют получать «хорошие» решения. Нередко вполне удовлетворительным можно считать «почти оптимальное» решение, характеризующееся стоимостью, которая лишь на несколько процентов превышает оптимальную. В таких случаях « жадный » алгоритм зачастую оказывается самым бы­стрым способом получить «хорошее» решение. Вообще говоря, если рассматриваемая задача такова, что единственным.способом получить оптимальное решение является использование метода полного поиска, тогда « жадный » алгоритм или другой эври­стический метод получения хорошего (хотя и необязательно оптимального) решения может оказаться единственным реальным средством достижения результата.

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

Говорят, что к оптимизационной задаче применим принцип жадного выбора, если последовательность локально оптимальных (жадных) выборов дает глобально оптимальное решение. Различие между жад­ными алгоритмами и динамическим программированием можно пояснить так: на каждом шаге жадный алгоритм берёт «самый жирный кусок», а потом уже пытается сделать наилучший выбор среди оставшихся, каковы бы они ни бы­ли; алгоритм динамического программирования принимает решение, просчитав заранее последствия для всех вариантов.

Как доказать, что жадный алгоритм даёт оптимальное решение? Это не всегда тривиально, но в типичном случае такое доказательство строится по следующей схеме. Сначала мы доказываем, что жадный выбор на первом шаге не закрывает пути к оптимальному решению: для всякого решения есть другое, согласованное с жадным выбором и не худ­шее первого. Затем показывается, что подзадача, возникающая после жадного выбора на первом шаге, аналогична исходной, и рассуждение завершается по индукции.

Говоря иными словами, решаемые с помощью жадных алгоритмов задачи обладают свойством оптимальности для подзадач: оптимальное решение всей задачи содержит в себе оптимальные решения под­задач. (С этим свойством мы уже встречались, говоря о динамическом програм­мировании.)

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

Дискретная задача о рюкзаке состоит в следующем. Пусть вор пробрался на склад, на котором хранится п вещей. Вещь номер i стоит vi долларов и весит wi килограммов (vi и wi — целые числа). Вор хочет украсть товара на максимальную сумму, причём максимальный вес, который он может унести в рюкзаке, равен W (число W тоже целое). Что он должен положить в рюкзак?

Непрерывная задача о рюкзаке отличается от дискретной тем, что вор может дробить краденые товары на части и укладывать в рюкзак эти части, а не обязательно вещи целиком (если в дискретной задаче вор имеет дело с золотыми слитками, то в непрерывной — с золотым песком).

Обе задачи о рюкзаке обладают свойством оптимальности для подзадач. В самом деле, рассмотрим дискретную задачу. Вынув вещь номер j из оптималь­но загруженного рюкзака, получим решение задачи о рюкзаке с максимальным весом W — wj и набором из п — 1вещи (все вещи, кроме j- й). Аналогичное рассуждение проходит и для непрерывной задачи: вынув из оптимально загру­женного рюкзака, в котором лежит w килограммов товара номер j, весь этот товар, получим оптимальное решение непрерывной задачи, в которой максимальный вес равен W — w (вместо W), а количество j -ro товара равно wj — w (вместо wj).

Хотя две задачи о рюкзаке и похожи, жадный алгоритм даёт оптимум в непрерывной задаче о рюкзаке и не даёт в дискретной. В самом деле, решение непрерывной задачи о рюкзаке с помощью жадного алгоритма выглядит так. Вычислим цены (в расчёте на килограмм) всех товаров (цена товара номер i равна vi/wi). Сначала вор берёт по максимуму самого дорогого товара; если весь этот товар кончился, а рюкзак не заполнен, вор берёт следующий по цене товар, затем следующий, и так далее, пока не наберёт вес W. Поскольку товары надо предварительно отсортировать по ценам, на что уйдёт время O (n log n), время работы описанного алгоритма будет O (n log n).

Убедимся в том, что аналогичный жадный алгоритм не обязан давать оптимум в дискретной задаче о рюкзаке. Грузоподъёмность рюкзака 50 кг, на складе имеются три вещи, весящие 10, 20 и 30 кг и стоящие 60, 100 и 120 долларов соответственно. Цена их в расчёте на единицу веса равна 6, 5 и 4. Жадный алгоритм для начала положит в рюкзак вещь номер 1; однако оптимальное решение включает предметы номер 2 и 3.

Для непрерывной задачи с теми же исходными данными жадный алгоритм , предписывающий начать с товара номер 1, даёт оптимальное решение. В дискретной задаче такая стратегия не срабатывает: положив в рюкзак предмет номер 1, вор лишается возможности заполнить рюкзак «под завязку», а пустое место в рюкзаке снижает цену наворованного в расчёте на единицу веса. Здесь, чтобы решить, класть ли данную вещь в рюкзак, надо сравнить решения двух подзадач: когда данная вещь заведомо лежит в рюкзаке и когда этой вещи в рюкзаке заведомо нет. Тем самым дискретная задача о рюкзаке порождает множество перекрывающихся подзадач ‑ типичный признак того, что может пригодиться динамическое программирование.

Основной областью применения « жадных » алгоритмов являются задачи поиска и оптимизации. Классическим является алгоритм Дейкстры поиска кратчайшего пути между двумя вершинами неориентированного графа с положительными весами. В отдельных случаях «жадная» стратегия используется для получения «хорошего» начального приближения к оптимальному решению.

 

 


Дата добавления: 2015-07-07; просмотров: 393 | Нарушение авторских прав


Читайте в этой же книге: Исторический обзор | Формализация понятия алгоритма | Шаг алгоритма | Теорема |
<== предыдущая страница | следующая страница ==>
Теорема| Описание машины Тьюринга

mybiblioteka.su - 2015-2024 год. (0.009 сек.)