Чем динамическое программирование отличается от грубой силы


19

Я читал о динамическом программировании, когда наткнулся на следующую цитату

Алгоритм динамического программирования рассмотрит все возможные пути решения проблемы и выберет лучшее решение. Таким образом, мы можем приблизительно представить динамическое программирование как интеллектуальный метод грубой силы, который позволяет нам пройти через все возможные решения, чтобы выбрать лучшее . Если масштаб проблемы таков, что прохождение всех возможных решений возможно и достаточно быстро, динамическое программирование гарантирует поиск оптимального решения.

Следующий пример был приведен

Например, предположим, что вам нужно как можно быстрее добраться из пункта А в пункт Б в данном городе в час пик. Алгоритм динамического программирования просматривает весь отчет о дорожном движении, просматривая все возможные комбинации дорог, которые вы можете выбрать, и только потом сообщит вам, какой путь является самым быстрым. Конечно, вам, возможно, придется подождать некоторое время, пока алгоритм не завершится, и только тогда вы сможете начать движение. Путь, который вы выберете, будет самым быстрым (при условии, что во внешней среде ничего не изменилось)

Brute Force пробует все возможные решения, прежде чем выбрать лучшее решение.

Чем динамическое программирование отличается от Brute Force, если оно также проходит через все возможные решения, прежде чем выбрать лучшее , единственное различие, которое я вижу, состоит в том, что динамическое программирование учитывает дополнительные факторы (в данном случае условия трафика).

Правильно ли я сказать, что динамическое программирование является подмножеством метода грубой силы ??


1
Условия дорожного движения - красная сельдь. Вы можете рассмотреть их в любом алгоритме.
Юваль Фильмус


Ваша первая цитата не определяет динамическое программирование.
reinierpost

@reinierpost Ну, он пытается достичь этого intelligent, brute force, но потом забывает описать «интеллектуальную» часть
Izkata

@Izkata По этим соображениям, каждый алгоритм является «разумной грубой силой» (в любом случае, это оксюморон).
Рафаэль

Ответы:


17

Алгоритм динамического программирования рассмотрит все возможные пути решения проблемы и выберет лучшее решение.

Это утверждение просто неправильно.

Динамические рецидивы программирования делать (часто) рассмотреть все возможные способы , чтобы разделить данный экземпляр проблемы на более мелкие экземпляры по некоторой схеме. Однако он не будет объединять все решения всех частичных проблем друг с другом и выбирать лучшие - он объединяет только оптимальные частичные решения (и выбирает лучшее из них).

Тот факт, что это дает оптимальное решение исходной задачи, не является тривиальным и фактически имеет место только для некоторых задач. А именно те, которые удовлетворяют принципу оптимальности Беллмана (одно из самых сомнительных, неправильно понимаемых «определений», которые регулярно цитируются). Смотрите здесь, чтобы узнать больше об этом.

В качестве конкретного примера рассмотрим алгоритм Беллмана-Форда на полном графе с единичными весами: он рассматривает только пути длины один и два (т. Е. Θ ( n 2 ) много), потому что те, которые используют одно ребро, являются оптимальными . Но существует бесконечно много решений, если вы не ограничите максимально допустимое количество ребер, и все равно ( n - 1 ) ! многие, если вы разрешите использовать каждый узел только один раз. Очевидно, что Bellman-Ford - алгоритм динамического программирования - не выполняет поиск методом "грубой силы".КNΘ(N2)»(N-1)!


«Это утверждение просто неправильно» - исправьте .
nmclean

4
@nmclean Мой опыт редактирования статей, связанных с алгоритмами, в Википедии был менее чем приятным, так что нет. Я бы лучше потратил свое время здесь.
Рафаэль

Я попытал счастья и отредактировал статью. Надеюсь, теперь это не так неправильно.
C4stor

9

Динамическое программирование является умным, поскольку оно повторно использует вычисления, в то время как грубая сила не делает. Предположим, что для решения f (6) необходимо решить 2 подзадачи, которые обе вызывают f (3). Метод грубой силы вычислит f (3) дважды, тратя впустую усилие, в то время как динамическое программирование вызовет его один раз, сохранит результат на случай, если будущие вычисления понадобятся. Во многих задачах динамическое улучшение экспоненциальной сложности грубой силы до полиномиальной сложности.


9
Это запоминание , которое является лишь одним из многих приемов, которые использует DP.
Бен Фойгт

4
Грубая сила с воспоминаниями все еще неэффективна; только дополнительная структура / сокращение, обеспечиваемое повторениями DP, окупает запоминание.
Рафаэль

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

1
Этот ответ на самом деле довольно точный. Я советую прочитать учебник, такой как Кормен и др. «Введение в алгоритмы», чтобы узнать больше о динамическом программировании, в этой книге есть довольно приличная глава. В двух словах, эффективное динамическое программирование использует два свойства задачи (оптимизации), которую вы хотите решить: оптимальные решения могут быть построены из оптимальных решений меньших подзадач, а общее количество меньших подзадач на самом деле довольно небольшой. Затем вы можете построить все решения подзадач снизу вверх, ускоряя вычисления за счет памяти.
MRA

Или, говоря проще, если вы знаете, как вычислить биномиальный коэффициент, используя треугольник Паскаля, то вы знаете все, что вам когда-либо нужно знать о динамическом программировании.
MRA

3

Различие, которое может попытаться сделать статья в Википедии, заключается в трех типах алгоритмов:

  1. Алгоритмы, которые перебирают все возможные решения, выбирая оптимальный.

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

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

Первые два типа алгоритмов дают оптимальное решение, в то время как третий тип направлен на создание «хорошего» решения, а не оптимального решения. На мой взгляд, различие между первыми двумя видами не так однозначно.

Позвольте мне начать с простых примеров для всех трех типов алгоритмов в контексте кратчайшего пути (пример, который вы приводите).

  1. Попробуйте все возможные пути. Это известно как грубая сила .

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

  3. Посмотрите на карту, рассмотрите несколько путей и выберите лучший из них. Это алгоритм для человека, а не для компьютера.

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

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

TTT+1T


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

0

Динамическое программирование намного быстрее, чем грубая сила. Грубая сила может занять экспоненциальное время, в то время как динамическое программирование обычно намного быстрее.

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


5
Это следствие, а не объяснение.
Рафаэль

-2

Это просто. Динамическое программирование - это «стратегия поиска», которая использует дополнительные факторы для сужения поиска. Если нет никакого решения в пространстве поиска, динамическое программирование будет ( как правило) делать поиск через каждый элемент пространства поиска. Но это не значит, что это поиск грубой силы.


«Если в пространстве поиска нет решения, динамическое программирование (как правило) будет выполнять поиск по каждому элементу пространства поиска». - неправильно, см. мой ответ.
Рафаэль

-2

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


1
«Вы будете использовать грубую силу, чтобы решить каждый маленький кусочек» - неправильно. Обычно вы будете использовать тот же подход рекурсивно.
FrankW
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.