Изменения

Перейти к: навигация, поиск

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

416 байт добавлено, 04:27, 5 декабря 2011
Нет описания правки
[[Файл:ST.jpg|200px|thumb|left]]
Рассмотрим некий необратимый процесс производства, например, производство консервов и представим его в виде ориентированного и ациклического графа. Предположим, что есть свиноферма и свиньи, которые выращиваются и отправляются на завод, чтобы стать консервами. Началом производства обозначим вершину графа $S$, а конец производства $T$. Процесс требует оптимизации, т.е. требуется найти наиболее оптимальный путь $S \rightsquigarrow T$. Он проходит через вершину графа $U$. Префикс оптимального пути $S \rightsquigarrow U$ является оптимальным путём $S \rightsquigarrow U$. Теперь рассмотрим принцип оптимальности для динамического программирования на префиксе. Итак, имеем некоторый оптимальный путь $S \rightsquigarrow T$, который проходит через $U$. Пусть префикс $ \Delta U$, т.е. путь от $S \rightsquigarrow U$, не оптимален. Тогда заменим неоптимальную часть $S \rightsquigarrow U$ пути $S \rightsquigarrow T$ оптимальной, а путь $U \rightsquigarrow T$ добавим в конец. Получим более оптимальный путь $S \rightsquigarrow T$. Принцип оптимальности для подзадач выполняется. Т.е. чтобы получить оптимальный путь из одной вершины графа в другую, префиксы меньших путей должны быть оптимальными.
 
 
== Принцип оптимальности на подотрезках==
Пусть нужно Требуется посчитать функцию f(i1, jn). Принцип состоит в том, что мы пересчитываем f(iu, jv) через такие f(i1i, j1j), что <math> u \le i \le j \le v <= i1 <= j1 <= j/math>. Для примера рассмотрим следующую Данную задачуможно свести к следующей задаче: пусть дан ориентированный взвешенный ациклический граф без кратных ребер, где вес ребер <math> \in Z </math>. Требуется найти кратчайший путь от каждой вершины до каждой. Пусть вершины пронумерованы в порядке топологической сортировки и d(i, j) - ответ на задачу. Ясно, что d(i, i) = 0 и d(i, j) = infinity, если не существует путь от i до j. Пусть нам требуется посчитать путь Путь от вершины i до j, при чем чем пересчитывается следующим образом: пусть для любого k (k = [i..j]), d(i, k) и d(k, j) посчитаны, тогда: <br />
: <tex> d(i, j) = \min\limits_{\mathop{k:i \rightsquigarrow k \rightsquigarrow j}} (d(i, k) + d(k, j)) </tex>
=== Примеры задач ===
:* [[Задача о расстановке знаков в выражении ]]
:* [[Задача о перемножении матриц]]
:* [[Задача об оптимальном префиксном коде с сохранением порядка. Монотонность точки разреза]]
 
=== Принцип оптимальности на подмножествах ===
:* [[Задача коммивояжера, ДП по подмножествам]]
==Ссылки==
48
правок

Навигация