Чим динамічне програмування відрізняється від Brute force


19

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

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

Наведено наступний приклад

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

Brute Force намагається вирішити все можливе, перш ніж вирішити найкраще рішення.

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

Чи правильно я стверджую, що динамічне програмування є підмножиною методу Brute Force ??


1
Умови дорожнього руху - це червона оселедець. Ви можете розглянути їх у будь-якому алгоритмі.
Yuval Filmus


Ваша перша цитата не визначає динамічне програмування.
reinierpost

@reinierpost Ну, вона намагається потрапити туди intelligent, brute force, але потім забуває описати "розумну" частину
Ізката

@Izkata За цим міркуванням кожен алгоритм є "розумною грубою силою" (яка так чи інакше є оксимороном).
Рафаель

Відповіді:


17

Динамічний алгоритм програмування вивчить усі можливі шляхи вирішення проблеми та підбере найкраще рішення.

Це твердження явно неправильне.

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

Той факт, що цей вихід є оптимальним рішенням вихідної проблеми, не є тривіальним, а насправді має місце лише для деяких проблем. А саме ті, які відповідають принципу оптимальності Беллмана (одне з найбільш рибних, неправильно зрозумілих "визначень", які регулярно цитуються). Дивіться тут ще кілька думок з цього приводу.

В якості конкретного прикладу розглянемо алгоритм Беллмана-Форда на повному графіку з одиничною вагою: він лише коли-небудь розглядає шляхи довжиною один і два (тобто Θ ( n 2 ) багато), тому що ті, що використовують один край, є оптимальними . Але існує нескінченно багато рішень, якщо ви не обмежуєте максимальну кількість дозволених ребер і все одно ( n - 1 ) ! багато, якщо ви дозволяєте використовувати кожен вузол лише один раз. Очевидно, що Беллман-Форд - алгоритм динамічного програмування - не здійснює грубої сили пошуку.KnΘ(n2)(n1)!


"Це твердження просто невірно" - Виправте це .
nmclean

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

Я спробував удачу і відредагував статтю. Сподіваюсь, зараз трохи менше помиляється.
C4stor

9

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


9
Це запам'ятовування , яке є лише одним із багатьох хитрощів, які використовує DP.
Ben Voigt

4
Груба сила з пам яткою все ще неефективна; лише додаткова структура / обрізка, що забезпечуються рецидивами ДП, спогади окупаються.
Рафаель

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

1
Ця відповідь насправді досить точна. Раджу прочитати такий підручник, як Кормен та ін: «Вступ до алгоритмів», щоб дізнатися більше про динамічне програмування, ця книга має цілком гідну главу про неї. Коротше кажучи, ефективне динамічне програмування використовує дві властивості (оптимізаційної) проблеми, яку ви хочете вирішити: оптимальні рішення можна побудувати з оптимальних рішень менших підзадач, а загальна кількість менших підзадач насправді досить малий. Тоді ви можете створити всі підпроблемні рішення знизу вгору, прискоривши обчислення за рахунок пам'яті.
MRA

Або, простіше кажучи: Якщо ви знаєте, як обчислити двочленний коефіцієнт за допомогою трикутника Паскаля, то ви знаєте все, що вам потрібно знати про динамічне програмування.
MRA

3

Відмінність, яку може намагатися зробити стаття у Вікіпедії, полягає в трьох типах алгоритмів:

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

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

  3. Алгоритми, що переходять за підмножиною всього можливого рішення, без гарантії, що оптимальне рішення належить до підмножини.

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

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

  1. Спробуйте всі можливі шляхи. Це відомо як груба сила .

  2. Спробуйте всі можливі шляхи, дотримуючись поки що мінімального рішення. Кожен раз, коли поточний шлях, який ви будуєте, дорожчий, ніж мінімальне рішення поки що, відмовтесь від нього та виберіть інший (ми уявляємо, що відстань обчислюється на основі сегмента за сегментом). Це називається обрізка .

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

Ці приклади досить грубі і, можливо, не малюють дуже точної картини. Обрізка має вирішальне значення у багатьох ситуаціях, наприклад, у комп'ютерних шахах. Якщо вам цікаво, знайдіть алгоритм A * , який фактично використовується для найкоротшого шляху.

Динамічне програмування - це метод істотного прискорення алгоритму грубої сили. Однак дещо оманливо думати про це таким чином. Це алгоритмічний прийом вирішення задач оптимізації. Можна реалізувати обрізку в контексті динамічного програмування.

ttt+1t


А потім вилучення кандидата з розгляду без повного його опрацювання. Наприклад, знаходячи безліч негативних чисел із мінімальною сумою, вам насправді не потрібно підсумовувати кожен набір повністю, лише йдіть до тих пір, поки сума не перевищить поточну найкращу. Ця ідея схожа на обрізку, але ортогональну. Поєднання двох ідей дає «гілкування», де проблема зниженої складності вирішується і використовується для виправдання обрізки.
Ben Voigt

0

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

Аналогія грубій силі дуже нещільна. Динамічне програмування - це не чарівна срібна куля, яка дозволяє вам взяти будь-який алгоритм, який ви хочете, і зробити його ефективним.


5
Це наслідок, а не пояснення.
Рафаель

-2

Це прямо. Динамічне програмування - це "стратегія пошуку", яка використовує додаткові фактори для звуження пошуку. Якщо немає ніякого рішення в просторі пошуку, динамічне програмування буде ( як правило) робити пошук через кожен елемент простору пошуку. Але це не означає, що це жорстокий пошук.


"Якщо в пошуковому просторі немає рішення, динамічне програмування здійснює пошук за допомогою кожного елемента простору пошуку." - неправильно, дивіться мою відповідь.
Рафаель

-2

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


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