Якщо ви могли перейменувати динамічне програмування ...


43

Якби ви могли перейменувати динамічне програмування, як би ви його назвали?


1
Я б сказав, що динамічне програмування - це динамічне програмування. Це окрема концепція від алгоритмів. Якщо ви запитаєте "алгоритмічні програми динамічного програмування", це мало б для мене сенс.
Йосіо Окамото

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

4
Вибачте, я був недостатньо зрозумілий. Вас цікавить динамічне програмування в цілому, включаючи використання в управлінні та плануванні політики тощо, і навіть стохастичне динамічне програмування, або просто динамічне програмування як метод розробки алгоритму? Основна аудиторія тут знала б лише останнє, але ваше питання є досить загальним, яке б включало перше.
Йосіо Окамото

1
Йосіо, я думаю, ви повинні просто пояснити більш загальну концепцію, а також відповісти на розбіжності у відповіді, оскільки це може просвітлити багатьох із нас.
Рафаель

2
Інша ідея, що не є мовою-щокою: "річ, яка дає вам роботу в Google" - на основі досвіду, який мали мої студенти :)
Suresh Venkat,

Відповіді:


50

Автобіографія Річарда Беллмана говорить про те, що він вибрав термін «динамічне програмування» навмисно відволікаючим.

1950-ті не були гарними роками для математичних досліджень. У нас був дуже цікавий джентльмен у Вашингтоні на ім’я Вілсон. Він був секретарем оборони, і він насправді мав патологічний страх і ненависть до слова "дослідження". Я не вживаю цього терміна злегка; Я його точно використовую. Його обличчя буде задихатися, він червоніє, і він стане бурхливим, якби люди застосовували термін «дослідження» в його присутності. Ви можете собі уявити, як він почувався тоді стосовно терміна "математичний". Корпорація RAND працювала у ВВС, а ВВС по суті був Вільсоном. Отже, я відчував, що мені потрібно щось зробити, щоб захистити Вілсона та ВВС від того, що я справді займався математикою у корпорації RAND.

Яку назву, яку назву я міг вибрати? В першу чергу мене цікавило планування, прийняття рішень, мислення. Але планування, це не добре слово з різних причин. Тому я вирішив використовувати слово "програмування". Мені хотілося перейти до думки, що це динамічно, це багатоступенево, це змінюється у часі - я думав, давайте вб'ємо двох птахів одним каменем. Візьмемо слово, яке має абсолютно точне значення, а саме «динамічний», у класичному фізичному сенсі. Він також має дуже цікаву властивість як прикметник, і це неможливо вживати слово «динамічний» у пейоративному значенні. Спробуйте продумати якусь комбінацію, яка, можливо, надасть їй пейоративного значення. Це неможливо. Таким чином, я вважав, що «динамічне програмування» - це добре ім’я. Це було щось, чому навіть конгресмен не міг заперечувати.

(Як вказують Рассел і Норвіг у своєму підручнику з AI, ця історія повинна бути творчим прикрашенням правди. Уперше Беллман використав фразу "динамічне програмування" в 1952 році , а Чарльз Ервін Вілсон не став міністром оборони до 1953 року. )

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


10
Звичайно, те, що я дуже хотів би зробити, це перейменувати «рівняння Беллмана», або, як це називають комп'ютерні вчені, «будь-який рецидив».
Jeffε

2
Ваша відповідь була використана тут: biostar.stackexchange.com/questions/17954
П'єр,

28

Є два важливі аспекти DP: (1) визначення підпроблем (тобто встановлення "таблиці", яка може бути багатовимірним масивом, індексованим, можливо, цілими числами, вершинами, підмножинами вершин тощо) та (2) рекурсивно вирішувати підпроблеми. Я пропоную "табличну / табличну рекурсію" як назву, що стосується обох аспектів.


6
таблична рекурсія має приємне відчуття до цього.
Суреш Венкат

21

Пам'ять - досить поширений варіант.


8
Пам'ять використовується, але не характеризує д.п.
Джек

20
Саме так. Пам'ять - це динамічне програмування випадково.
Jeffε

@professor erickson - дуже добре сказано. Я не можу перестати сміятись.
Акаш Кумар

7
І все-таки, якщо нам вдасться вибрати нове ім’я для DP, то використання пам'яті було б цілком придатним для цього. Наприклад, "відстань редагування може бути обчислена в полі-час, використовуючи пам'ятку".
Ноам

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

8

Щоб піти з розділенням і перемогою , я б сказав, зробіть і поєднайте.

Я, як правило, використовую обидва слова, зрощую і поєдную під час викладання / пояснення ДП; але не використовується явно з’єднанням та поєднанням. Іноді я використовував перекриття-поділ-і-підкорення для протиставлення двох парадигм.


6

Після моєї недавньої лекції про динамічне програмування в алгоритмі проектування я попросив студентів запропонувати нову назву цієї методики. Поки мене розважало "Жорстке програмування", я хотів чогось, що могло б зробити техніку більш запам'ятовуваною. Після обговорення тут, я можу запропонувати два імені, одне для зверху вниз та одне знизу вгору:
Multiway-Divide і Memoized-Conquer (він же Divide ^ M & Conquer ^ M) та
об'єднати всі підпрограми (aka Merge_all)


1
Я не вважаю, що створити міцну асоціацію зі звичайними діви і підкореннями (як у Мергесорті) - це гарна ідея. Там підпроблеми вирішуються самостійно і лише два результати об’єднуються. У DP перевірені підпрограми не є незалежними, і всі комбінації перевіряються. (обидва приблизно). Тому я думаю, що ім'я має підкреслювати різницю, а не створювати відчуття подібності.
Рафаель

@Raphael, я поділяю стурбованість небезпекою створення сильної асоціації, але не погоджуюся з вашим твердженням про відмінності. В DP дуже важливо , щоб підзадачі будуть «вирішувати самостійно» , навіть якщо рішення subsubproblems є загальними. Я зазвичай зазначаю, що якби якийсь оракул сказав вам правильний поділ, це було б розділенням і перемогою, але оскільки я не розмовляю грецькою мовою (на відміну від мого радника доктора наук), я повинен спробувати всі можливі підрозділи.
Джек

2
Так, підпрограми є концептуально незалежними. Однак я стосувався їх, використовуючи ті самі часткові результати, як і ви. Це відокремлює DP від ​​D&C, оскільки можливе, наприклад, паралелізація останнього, не обчислюючи підпрограми кілька разів (або повідомляючи результати) на відміну від першої. Ваша аналогія є приємною, але не дає права назви в цьому випадку, оскільки пошук правильних розділів є важливою частиною проблеми. Я гадаю, ви можете сказати, що DP - це узагальнення науково-дослідної роботи на основі цих міркувань.
Рафаель

@Raphael, вибачте за педантичність, але оскільки це питання щодо викладання, я хочу, щоб поняття незалежності підпрограми було зрозумілим, і просто сказати "концептуально незалежним" не є точним. Якщо ви спробуєте поділити, створені підпрограми можуть не мати залежності. Ваші інші коментарі зосереджуються на кроках алгоритмів DP; Я вважаю за краще спершу зосередитись на точному визначенні проблеми, яку потрібно вирішити. Мої улюблені приклади: тріангуляція мінімальної ваги та мінімальна опукла декомпозиція простих багатокутників ( cs.unc.edu/~snoeyink/demos/convdecomp/MWTDemo.html )
Джек

Це нормально бути підвісною. Але розглянемо дидактичний імпорт вибору слів: ти кажеш студентам, що підпрограми є незалежними, а потім надаєш їм алгоритм, який не розділяє їх обчислення, а насправді багато в чому покладається на "переплетені" обчислення. Я думаю, що це може бути дуже заплутано. Тому вам справді доводиться відокремлювати понятійну / математичну / оптимізацію / ... та обчислювальну незалежність у певний момент.
Рафаель


2

Я нещодавно обговорював це з деякими колегами, і після бурхливої ​​дискусії ми придумали табличне кешування викликів .


3
це звучить як щось, що ви робите в аутсорсинговому кол-центрі;)
Суреш Венкат

2

Я б запропонував назвати індуктивне програмування - як щось подібне до мостоподібних часів від наших часів до старих добрих часів Ейлера, Кеплера та ін. А може навіть зворотне індуктивне програмування . І так, для мене DP сильно асоціюється з Індукцією, в старому доброму розумінні цього поняття. Пам'ять, кешування, таблиці тощо - це лише елементи техніки, не є основою підходу до розлому речей.


моя головна проблема з DP - це П., тому я не прихильник цієї ідеї ..
Suresh Venkat

1

Можливо, щось, що включає в себе таблицю слів і заповнення , оскільки це відбувається.


7
Ба. Динамічне програмування не стосується таблиць ; йдеться про розумну рекурсію.
Jeffε

3
Я вважаю, що краще відокремити два аспекти: «Вилучення рекурсивної структури з проблеми та запис у вигляді рецидиву» (моделювання) та «Вирішення отриманого рецидиву способом знизу вгору» (алгоритми). Я вважаю, що динамічне програмування (в алгоритмах) стосується обох, і це також стосується лінійного програмування, цілого програмування, напіввизначеного програмування тощо.
Йошіо Окамото,

1
Іноді використовують таблиці . Динамічне програмування дерев (наприклад: максимальний незалежний набір) зазвичай не використовує таблицю [= масив] для запам'ятовування повторення; для цього використовується дерево, або в деяких випадках дерево масивів, або масив дерев, або в деяких випадках декартовий продукт дерев. Аналогічно для динамічного програмування через даги або динамічного програмування на декомпозиції дерев для графіків обмеженої широти ширини.
Jeffε

1
JeffE, назва методики навряд чи охоплює всі програми. Візьмемо, наприклад, "діагоналізацію"; у просунутих додатках ніде не видно діагоналі (або принаймні не виняткової області дії). Але я все-таки не дуже закоханий у «наповнення столу», хоча б я вважаю, що це може бути розумною назвою для початківців.
Рафаель

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

1

Рекурсивний вигляд або рекурсивний горизонт


Ледачий горизонт? Ви затримуєте підрахунок великої кількості результатів, поки вони не знадобляться. DP не повинен бути рекурсивним.
Чад Brewbaker

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