Жадный алгоритм - это алгоритм, который следует за решением проблемы эвристики, позволяющей сделать локально оптимальный выбор на каждом этапе с надеждой найти глобальный оптимум.

Из Wikipedia:

Жадный алгоритм - это алгоритм, который следует за решением проблемы эвристики, позволяющей сделать локально оптимальный выбор на каждом этапе с надеждой на поиск глобального оптимума. По некоторым проблемам жадная стратегия не требует оптимального решения, но, тем не менее, жадная эвристика может дать локально оптимальные решения, приближающие глобальное оптимальное решение.

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

Особенности

В общем, жадные алгоритмы имеют пять компонентов:

  • Набор кандидатов, из которого создано решение.
  • Функция выбора, которая выбирает лучшего кандидата для добавления к решению
  • Функция выполнимости, которая используется для определения того, может ли кандидат использоваться для внесения вклада в решение.
  • Целевая функция, которая присваивает значение решению или частичному решению, и
  • Функция решения, которая укажет, когда мы обнаружили полное решение

Жадные алгоритмы дают хорошие решения по некоторым математическим проблемам, но не по другим.

Большинство проблем, для которых они работают, будут иметь два свойства:

Свойство жадного выбора

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

Оптимальная субструктура

"Задача демонстрирует оптимальную субструктуру, если оптимальное решение задачи содержит оптимальные решения подзадач".