Википедия

Динамическое программирование

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

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

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

История

Словосочетание «динамическое программирование» впервые было использовано в 1940-х годах Ричардом Беллманом для описания процесса нахождения решения задачи, где ответ на одну задачу может быть получен только после решения задачи, «предшествующей» ей. В 1953 году он уточнил это определение до современного. Первоначально эта область была основана, как системный анализ и инжиниринг, которая была признана IEEE. Вклад Беллмана в динамическое программирование был увековечен в названии уравнения Беллмана, центрального результата теории динамического программирования, который переформулирует оптимизационную задачу в рекурсивной форме.

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

Идея динамического программирования

image
Нахождение кратчайшего пути в графе из одной вершины в другую, используя оптимальную подструктуру; прямая линия обозначает ребро между вершинами; волнистая линия обозначает кратчайший путь между вершинами, которые она соединяет (среди других путей, которые не показаны; промежуточные вершины кратчайшего пути тоже не показаны); жирной линией обозначен итоговый кратчайший путь.
image
Граф подзадач (ребро означает, что одна задача зависит от решения другой) для чисел Фибоначчи (граф — ациклический).

Оптимальная подструктура в динамическом программировании означает, что оптимальное решение подзадач меньшего размера может быть использовано для решения исходной задачи. К примеру, кратчайший путь в графе из одной вершины (обозначим s) в другую (обозначим t) может быть найден так: сначала считаем кратчайший путь из всех вершин, смежных с s, до t, а затем, учитывая веса рёбер, которыми s соединена со смежными вершинами, выбираем лучший путь до t (через какую вершину лучше всего пойти). В общем случае мы можем решить задачу, в которой присутствует оптимальная подструктура, проделывая следующие три шага.

  1. Разбиение задачи на подзадачи меньшего размера.
  2. Нахождение оптимального решения подзадач рекурсивно, проделывая такой же трёхшаговый алгоритм.
  3. Использование полученного решения подзадач для конструирования решения исходной задачи.

Подзадачи решаются делением их на подзадачи ещё меньшего размера и т. д., пока не приходят к тривиальному случаю задачи, решаемой за константное время (ответ можно сказать сразу). К примеру, если нам нужно найти n!, то тривиальной задачей будет 1! = 1 (или 0! = 1).

Перекрывающиеся подзадачи в динамическом программировании означают подзадачи, которые используются для решения некоторого количества задач (не одной) большего размера (то есть мы несколько раз проделываем одно и то же). Ярким примером является вычисление последовательности Фибоначчи, image и image — даже в таком тривиальном случае вычисления всего двух чисел Фибоначчи мы уже посчитали image дважды. Если продолжать дальше и посчитать image, то image посчитается ещё два раза, так как для вычисления image будут нужны опять image и image. Получается следующее: простой рекурсивный подход будет расходовать время на вычисление решения для задач, которые он уже решал.

Чтобы избежать такого хода событий, мы будем сохранять решения подзадач, которые мы уже решали, и когда нам снова потребуется решение подзадачи, мы вместо того, чтобы вычислять его заново, просто достанем его из памяти. Этот подход называется мемоизацией. Можно проделывать и дальнейшие оптимизации — например, если мы точно уверены, что решение подзадачи нам больше не потребуется, можно выкинуть его из памяти, освободив её для других нужд, или если процессор простаивает и мы знаем, что решение некоторых, ещё не посчитанных, подзадач нам понадобится в дальнейшем, мы можем решить их заранее.

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

  • перекрывающиеся подзадачи;
  • оптимальная подструктура;
  • возможность запоминания решения часто встречающихся подзадач.

Динамическое программирование обычно придерживается двух подходов к решению задач:

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

Языки программирования могут запоминать результат вызова функции с определённым набором аргументов (мемоизация), чтобы ускорить «вычисление по имени». В некоторых языках такая возможность встроена (например, Scheme, Common Lisp, Clojure, Perl, D), а в некоторых требует дополнительных расширений (C++).

Известны сериальное динамическое программирование, включённое во все учебники по исследованию операций, и несериальное динамическое программирование (НСДП), которое в настоящее время слабо известно, хотя было открыто в 1960-х годах.

Обычное динамическое программирование является частным случаем несериального динамического программирования, когда граф взаимосвязей переменных — просто путь. НСДП, являясь естественным и общим методом для учёта структуры задачи оптимизации, рассматривает множество ограничений и/или представляет целевую функцию как рекурсивно вычисляемую функцию. Это позволяет находить решение поэтапно, на каждом из этапов используя информацию, полученную на предыдущих этапах, причём эффективность этого алгоритма прямо зависит от структуры графа взаимосвязей переменных. Если этот граф достаточно разрежён, то объём вычислений на каждом этапе может сохраняться в разумных пределах.

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

Классические задачи динамического программирования

  • Задача о наибольшей общей подпоследовательности: даны две последовательности, требуется найти самую длинную общую подпоследовательность.
  • Задача поиска наибольшей увеличивающейся подпоследовательности: дана последовательность, требуется найти самую длинную возрастающую подпоследовательность.
  • Задача о редакционном расстоянии (расстояние Левенштейна): даны две строки, требуется найти минимальное количество стираний, замен и добавлений символов, преобразующих одну строку в другую.
  • Задача о вычислении чисел Фибоначчи
  • Задача о порядке перемножения матриц: даны матрицы image, …, image, требуется минимизировать количество скалярных операций для их перемножения.
  • Задача о рюкзаке: из неограниченного множества предметов со свойствами «стоимость» и «вес» требуется отобрать некое число предметов таким образом, чтобы получить максимальную суммарную стоимость при ограниченном суммарном весе.
  • Алгоритм Флойда — Уоршелла: найти кратчайшие расстояния между всеми вершинами взвешенного ориентированного графа.
  • Алгоритм Беллмана — Форда: найти кратчайший путь во взвешенном графе между двумя заданными вершинами.
  • Максимальное независимое множество вершин в дереве: дано дерево, найти максимальное множество вершин, никакие две из которых не связаны ребром.
  • : есть два конвейера, по image рабочих мест. Заданы времена работы на каждом конвейере, постановка на него и снятие, а также время передвижение на соседнее место. Требуется определить самый быстрый способ сборки детали, используя оба конвейера.

Литература

  • Беллман Р. Динамическое программирование. — М.: Издательство иностранной литературы, 1960.
  • Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4.
  • Sanjoy Dasgupta, Christos H. Papadimitriou, Umesh Vazirani. Algorithms. — McGraw-Hill Science/Engineering/Math, 2006. — 336 с. — ISBN 0073523402.
  • Акулич И. Л. Глава 4. Задачи динамического программирования // Математическое программирование в примерах и задачах. — М.: Высшая школа, 1986. — 319 с. — ISBN 5-06-002663-9.
  • Bertele U., Brioshi F. Nonserial dynamic programming. — N. Y.: Academic Press, 1972. — 235 pp.
  • Габасов Р., Кириллова Ф. М. Основы динамического программирования. — Минск: Изд-во БГУ, 1975. — 262 с.

Ссылки

  • Видео лекции о динамическом программировании
  • Теория, задачи, тестирующая система.

Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Динамическое программирование, Что такое Динамическое программирование? Что означает Динамическое программирование?

Dinamicheskoe programmirovanie v teorii upravleniya i teorii vychislitelnyh sistem sposob resheniya slozhnyh zadach putyom razbieniya ih na bolee prostye podzadachi On primenim k zadacham s optimalnoj podstrukturoj vyglyadyashim kak nabor perekryvayushihsya podzadach slozhnost kotoryh chut menshe ishodnoj V etom sluchae vremya vychislenij po sravneniyu s naivnymi metodami mozhno znachitelno sokratit Kak pravilo chtoby reshit postavlennuyu zadachu trebuetsya reshit otdelnye chasti zadachi podzadachi posle chego obedinit resheniya podzadach v odno obshee reshenie Chasto mnogie iz etih podzadach odinakovy Podhod dinamicheskogo programmirovaniya sostoit v tom chtoby reshit kazhduyu podzadachu tolko odin raz sokrativ tem samym kolichestvo vychislenij Eto osobenno polezno v sluchayah kogda chislo povtoryayushihsya podzadach eksponencialno veliko Metod dinamicheskogo programmirovaniya sverhu eto prostoe zapominanie rezultatov resheniya teh podzadach kotorye mogut povtorno vstretitsya v dalnejshem Dinamicheskoe programmirovanie snizu vklyuchaet v sebya pereformulirovanie slozhnoj zadachi v vide rekursivnoj posledovatelnosti bolee prostyh podzadach IstoriyaSlovosochetanie dinamicheskoe programmirovanie vpervye bylo ispolzovano v 1940 h godah Richardom Bellmanom dlya opisaniya processa nahozhdeniya resheniya zadachi gde otvet na odnu zadachu mozhet byt poluchen tolko posle resheniya zadachi predshestvuyushej ej V 1953 godu on utochnil eto opredelenie do sovremennogo Pervonachalno eta oblast byla osnovana kak sistemnyj analiz i inzhiniring kotoraya byla priznana IEEE Vklad Bellmana v dinamicheskoe programmirovanie byl uvekovechen v nazvanii uravneniya Bellmana centralnogo rezultata teorii dinamicheskogo programmirovaniya kotoryj pereformuliruet optimizacionnuyu zadachu v rekursivnoj forme Slovo programmirovanie v slovosochetanii dinamicheskoe programmirovanie v dejstvitelnosti k tradicionnomu programmirovaniyu napisaniyu koda pochti nikakogo otnosheniya ne imeet i imeet smysl kak v slovosochetanii matematicheskoe programmirovanie kotoroe yavlyaetsya sinonimom slova optimizaciya Poetomu slovo programma v dannom kontekste skoree oznachaet optimalnuyu posledovatelnost dejstvij dlya polucheniya resheniya zadachi K primeru opredelyonnoe raspisanie sobytij na vystavke inogda nazyvayut programmoj Programma v dannom sluchae ponimaetsya kak dopustimaya posledovatelnost sobytij Ideya dinamicheskogo programmirovaniyaNahozhdenie kratchajshego puti v grafe iz odnoj vershiny v druguyu ispolzuya optimalnuyu podstrukturu pryamaya liniya oboznachaet rebro mezhdu vershinami volnistaya liniya oboznachaet kratchajshij put mezhdu vershinami kotorye ona soedinyaet sredi drugih putej kotorye ne pokazany promezhutochnye vershiny kratchajshego puti tozhe ne pokazany zhirnoj liniej oboznachen itogovyj kratchajshij put Graf podzadach rebro oznachaet chto odna zadacha zavisit ot resheniya drugoj dlya chisel Fibonachchi graf aciklicheskij Optimalnaya podstruktura v dinamicheskom programmirovanii oznachaet chto optimalnoe reshenie podzadach menshego razmera mozhet byt ispolzovano dlya resheniya ishodnoj zadachi K primeru kratchajshij put v grafe iz odnoj vershiny oboznachim s v druguyu oboznachim t mozhet byt najden tak snachala schitaem kratchajshij put iz vseh vershin smezhnyh s s do t a zatem uchityvaya vesa ryober kotorymi s soedinena so smezhnymi vershinami vybiraem luchshij put do t cherez kakuyu vershinu luchshe vsego pojti V obshem sluchae my mozhem reshit zadachu v kotoroj prisutstvuet optimalnaya podstruktura prodelyvaya sleduyushie tri shaga Razbienie zadachi na podzadachi menshego razmera Nahozhdenie optimalnogo resheniya podzadach rekursivno prodelyvaya takoj zhe tryohshagovyj algoritm Ispolzovanie poluchennogo resheniya podzadach dlya konstruirovaniya resheniya ishodnoj zadachi Podzadachi reshayutsya deleniem ih na podzadachi eshyo menshego razmera i t d poka ne prihodyat k trivialnomu sluchayu zadachi reshaemoj za konstantnoe vremya otvet mozhno skazat srazu K primeru esli nam nuzhno najti n to trivialnoj zadachej budet 1 1 ili 0 1 Perekryvayushiesya podzadachi v dinamicheskom programmirovanii oznachayut podzadachi kotorye ispolzuyutsya dlya resheniya nekotorogo kolichestva zadach ne odnoj bolshego razmera to est my neskolko raz prodelyvaem odno i to zhe Yarkim primerom yavlyaetsya vychislenie posledovatelnosti Fibonachchi F3 F2 F1 displaystyle F 3 F 2 F 1 i F4 F3 F2 displaystyle F 4 F 3 F 2 dazhe v takom trivialnom sluchae vychisleniya vsego dvuh chisel Fibonachchi my uzhe poschitali F2 displaystyle F 2 dvazhdy Esli prodolzhat dalshe i poschitat F5 displaystyle F 5 to F2 displaystyle F 2 poschitaetsya eshyo dva raza tak kak dlya vychisleniya F5 displaystyle F 5 budut nuzhny opyat F3 displaystyle F 3 i F4 displaystyle F 4 Poluchaetsya sleduyushee prostoj rekursivnyj podhod budet rashodovat vremya na vychislenie resheniya dlya zadach kotorye on uzhe reshal Chtoby izbezhat takogo hoda sobytij my budem sohranyat resheniya podzadach kotorye my uzhe reshali i kogda nam snova potrebuetsya reshenie podzadachi my vmesto togo chtoby vychislyat ego zanovo prosto dostanem ego iz pamyati Etot podhod nazyvaetsya memoizaciej Mozhno prodelyvat i dalnejshie optimizacii naprimer esli my tochno uvereny chto reshenie podzadachi nam bolshe ne potrebuetsya mozhno vykinut ego iz pamyati osvobodiv eyo dlya drugih nuzhd ili esli processor prostaivaet i my znaem chto reshenie nekotoryh eshyo ne poschitannyh podzadach nam ponadobitsya v dalnejshem my mozhem reshit ih zaranee Podvodya itogi vysheskazannogo mozhno skazat chto dinamicheskoe programmirovanie polzuetsya sleduyushimi svojstvami zadachi perekryvayushiesya podzadachi optimalnaya podstruktura vozmozhnost zapominaniya resheniya chasto vstrechayushihsya podzadach Dinamicheskoe programmirovanie obychno priderzhivaetsya dvuh podhodov k resheniyu zadach nishodyashee dinamicheskoe programmirovanie zadacha razbivaetsya na podzadachi menshego razmera oni reshayutsya i zatem kombiniruyutsya dlya resheniya ishodnoj zadachi Ispolzuetsya zapominanie dlya reshenij uzhe reshyonnyh podzadach voshodyashee dinamicheskoe programmirovanie vse podzadachi kotorye vposledstvii ponadobyatsya dlya resheniya ishodnoj zadachi proschityvayutsya zaranee i zatem ispolzuyutsya dlya postroeniya resheniya ishodnoj zadachi Etot sposob luchshe nishodyashego programmirovaniya v smysle razmera neobhodimogo steka i kolichestva vyzova funkcij no inogda byvaet nelegko zaranee vyyasnit reshenie kakih podzadach nam potrebuetsya v dalnejshem Yazyki programmirovaniya mogut zapominat rezultat vyzova funkcii s opredelyonnym naborom argumentov memoizaciya chtoby uskorit vychislenie po imeni V nekotoryh yazykah takaya vozmozhnost vstroena naprimer Scheme Common Lisp Clojure Perl D a v nekotoryh trebuet dopolnitelnyh rasshirenij C Izvestny serialnoe dinamicheskoe programmirovanie vklyuchyonnoe vo vse uchebniki po issledovaniyu operacij i neserialnoe dinamicheskoe programmirovanie NSDP kotoroe v nastoyashee vremya slabo izvestno hotya bylo otkryto v 1960 h godah Obychnoe dinamicheskoe programmirovanie yavlyaetsya chastnym sluchaem neserialnogo dinamicheskogo programmirovaniya kogda graf vzaimosvyazej peremennyh prosto put NSDP yavlyayas estestvennym i obshim metodom dlya uchyota struktury zadachi optimizacii rassmatrivaet mnozhestvo ogranichenij i ili predstavlyaet celevuyu funkciyu kak rekursivno vychislyaemuyu funkciyu Eto pozvolyaet nahodit reshenie poetapno na kazhdom iz etapov ispolzuya informaciyu poluchennuyu na predydushih etapah prichyom effektivnost etogo algoritma pryamo zavisit ot struktury grafa vzaimosvyazej peremennyh Esli etot graf dostatochno razrezhyon to obyom vychislenij na kazhdom etape mozhet sohranyatsya v razumnyh predelah Odnim iz osnovnyh svojstv zadach reshaemyh s pomoshyu dinamicheskogo programmirovaniya yavlyaetsya additivnost Neadditivnye zadachi reshayutsya drugimi metodami Naprimer mnogie zadachi po optimizacii investicij kompanii yavlyayutsya neadditivnymi i reshayutsya s pomoshyu sravneniya stoimosti kompanii pri provedenii investicij i bez nih Klassicheskie zadachi dinamicheskogo programmirovaniyaZadacha o naibolshej obshej podposledovatelnosti dany dve posledovatelnosti trebuetsya najti samuyu dlinnuyu obshuyu podposledovatelnost Zadacha poiska naibolshej uvelichivayushejsya podposledovatelnosti dana posledovatelnost trebuetsya najti samuyu dlinnuyu vozrastayushuyu podposledovatelnost Zadacha o redakcionnom rasstoyanii rasstoyanie Levenshtejna dany dve stroki trebuetsya najti minimalnoe kolichestvo stiranij zamen i dobavlenij simvolov preobrazuyushih odnu stroku v druguyu Zadacha o vychislenii chisel Fibonachchi Zadacha o poryadke peremnozheniya matric dany matricy A1 displaystyle A 1 An displaystyle A n trebuetsya minimizirovat kolichestvo skalyarnyh operacij dlya ih peremnozheniya Zadacha o ryukzake iz neogranichennogo mnozhestva predmetov so svojstvami stoimost i ves trebuetsya otobrat nekoe chislo predmetov takim obrazom chtoby poluchit maksimalnuyu summarnuyu stoimost pri ogranichennom summarnom vese Algoritm Flojda Uorshella najti kratchajshie rasstoyaniya mezhdu vsemi vershinami vzveshennogo orientirovannogo grafa Algoritm Bellmana Forda najti kratchajshij put vo vzveshennom grafe mezhdu dvumya zadannymi vershinami Maksimalnoe nezavisimoe mnozhestvo vershin v dereve dano derevo najti maksimalnoe mnozhestvo vershin nikakie dve iz kotoryh ne svyazany rebrom est dva konvejera po n displaystyle n rabochih mest Zadany vremena raboty na kazhdom konvejere postanovka na nego i snyatie a takzhe vremya peredvizhenie na sosednee mesto Trebuetsya opredelit samyj bystryj sposob sborki detali ispolzuya oba konvejera LiteraturaBellman R Dinamicheskoe programmirovanie M Izdatelstvo inostrannoj literatury 1960 Kormen T Lejzerson Ch Rivest R Shtajn K Glava 15 Dinamicheskoe programmirovanie Algoritmy postroenie i analiz Introduction to Algorithms Pod red I V Krasikova 2 e izd M Vilyams 2005 1296 s ISBN 5 8459 0857 4 Sanjoy Dasgupta Christos H Papadimitriou Umesh Vazirani Algorithms McGraw Hill Science Engineering Math 2006 336 s ISBN 0073523402 Akulich I L Glava 4 Zadachi dinamicheskogo programmirovaniya Matematicheskoe programmirovanie v primerah i zadachah M Vysshaya shkola 1986 319 s ISBN 5 06 002663 9 Bertele U Brioshi F Nonserial dynamic programming N Y Academic Press 1972 235 pp Gabasov R Kirillova F M Osnovy dinamicheskogo programmirovaniya Minsk Izd vo BGU 1975 262 s SsylkiVideo lekcii o dinamicheskom programmirovanii Teoriya zadachi testiruyushaya sistema

NiNa.Az

NiNa.Az - Абсолютно бесплатная система, которая делится для вас информацией и контентом 24 часа в сутки.
Взгляните
Закрыто