Динамическое программирование
Динамическое программирование(ДП)- это вычислительный метод, использующий аппарат рекуррентных соотношений. Разработан Р.Беллманом(США). В ДП рассматриваются многоэтапные процессы принятия решений. При постановке и решении любой задачи в ДП формируется целевая функция и критерий, подлежащий оптимизации, и на каждом шаге принимается такое решение, чтобы досталась поставленная цель. Метод ДП основан на принципе оптимальности: Оптимальная стратегия обладает таким свойством, что каково бы ни было начальное состояние и начальные решения, последующие решения должны приниматься, исходя из оптимальной стратегии с учетом состояния, достигнутого путем предыдущих решений. Другими словами, планируя многошаговую операцию, необходимо выбирать решение на каждом шаге с учетом его будущих последствий на еще предстоящих шагах. Основное преимущество метода ДП. Рассмотрим процесс с последовательным принятием решений, состоящий из n этапов, на каждом из которых принимается одно из k возможных решений. Тогда для определения оптимального решения методом полного перебора необходимо перебрать kn что крайне велико (при n=10 и k=3 kn≈ 59000). Метод ДП исключает необходимость полного перебора всех kn возможных решений. Рассмотрим применение ДП на примере задачи определения кратчайшего пути в графе.
7 Шаги процесса принятия решений определим 6 5 приводящих в каждую вершину. 2 Выведем функциональное уравнение Метода ДП. Пусть кратчайшее расстояние от вершины j 8 4 3 до конечной n=6 равно Wj, j=n-1,n-2,…,1. Рассмотрим
4 от k-й вершины до последней (n-й) будет равно 6 2 Wk=minj(Wj+wkj), где wkj- длина ребра k→j. 0 попасть из k-й).
Это и есть функциональное уравнение (k=n,n-1,…,1)
W6=0 → для удобства сразу обозначаем на графе около соответствующей вершины. W5=0+2=2
W4= min 4+2 =6 Кратчайший путь имеет длину 7 и соответствует дугам 1→2→5→6.
W3=min 3+7 =5 7+6 2 5 4+2 W2=min 8+6 =6 2+5 1 2 W1=min 1+6 =7 3+5
Остовные деревья графа Остовным деревом для связного неориентированного графа G=(V,E) с n вершинами называется неориентированное дерево, содержащее все n вершин и (n - 1) ребер графа. Таким образом, остовное дерево связывает все вершины графа и из каждой вершины графа можно попасть в любую другую. В полном графе с n вершинами имеется n n-2 остовных деревьев. Для одного и того же графа можно построить несколько остовных деревьев.
Пусть G=(V,E) — связный неориентированный граф и T = (V,F) — остовное дерево для него. Тогда: а) для любых двух вершин vi и vj путь между ними единствен; б) если к остовному дереву Т добавить ребро из (E-F), т.е. из оставшихся, не включенных в дерево ребер графа, то возникнет ровно один цикл и Т перестанет быть деревом. Под остовным деревом ориентированного графа понимают такое дерево, в котором одна из вершин графа связана со всеми остальными. Основными задачами нахождения остовных деревьев графа являются: • нахождение остовного дерева; • нахождение минимального и максимального остовного дерева.
Обходы графов. Поиск в глубину и поиск в ширину
При решении многих задач, связанных с графами, необходим систематический обход вершин и ребер графа. Широкое применение получили два метода обхода:
• поиск в глубину; • поиск в ширину. При поиске в глубину осуществляется регулярный обход графа по следующим правилам. 1. Находясь в вершине v, нужно двигаться в любую другую w, ранее не пройденную вершину (если таковая найдется), одновременно запоминая дугу z, по которой мы впервые попали в вершину v. 2. Если из вершины v мы не можем попасть в ранее не пройденную вершину или таковой вообще нет, то мы возвращаемся в вершину дуги z, из которой впервые попали в вершину v, и продолжим поиск в глубину из этой вершины. При выполнении обхода по этим правилам мы стремимся проникнуть вглубь графа как можно дальше, затем отступаем на шаг и снова стремимся пройти вперед и т.д. При поиске в глубину в ориентированном графе мы можем попасть в вершину w из вершины v только в том случае, есливорграфе есть дуга (v,w), то есть двигаемся вперед только в направлении ориентации дуг, а возвращаемся против ориентации. В неориентированном графе таких ограничений нет. В неориентированном графе обход можно начинать с любой вершины. Топология полученного остовного дерева зависит от начальной вершины. Рассмотрим особенности поиска в глубину в орграфе. Те дуги, которые ведут к новым вершинам, называются дугами дерева, или древесными дугами. Они формируют для данного графа либо остовное дерево (дерево поиска в глубину), либо остовный лес (глу- бинное остовное дерево, глубинный остовный лес). Для того чтобы после завершения обхода в глубину все вершины оказались пройденными и образовалось остовное дерево, (а не лес), необходимо и достаточно, чтобы обход начинался во входе графа (вершине, имеющей только исходящие дуги) и этот вход был единственным. В противном случае при обходе в глубину образуется глубинный остовный лес. Если при поиске в глубину вершины графа нумеруются в порядке их посещения, то такая нумерация называется глубинной нумерацией графа или М-нумерацией вершин графа [14]. После завершения поиска в глубину все дуги орграфа разбиваются на 4 класса: 1) класс Т (Tree) древесных дуг, порождающих дерево поиска в глубину либо глубинный остовный лес. Для каждой дуги (x,y) Т имеем М(х) < М(у), М[i] — номер вершины i;
2) класс F (Forward) прямых дуг, к которому относятся дуги (x,y) такие, что М(х) < М(у) и вершина х соединена с y альтернативным путём, состоящим из древесных дуг. Другими словами, прямые дуги идут от предков к непосредственным потомкам, но не являются древесными дугами, а дублируют путь из древесных дуг; 3) класс В (Back) обратных дуг, представляющих дуги (х,у), такие, что М(х) > М(у) и вершина у соединена с х путем, состоящим из древесных дуг. По-другому обратные дуги идут от потомков к предкам; 4) класс С (Cross) поперечных дуг, представляющих собой дуги (х,у), такие, что М(х) > М(у) и вершины х и у не соединены путем, состоящим из древесных дуг, т.е. поперечные дуги соединяют вершины, не являющиеся ни потомками, ни предками друг друга. Рассмотрим пример: Древесные дуги: (а, Ь), (Ь, е), (е, h), (h, j), (е, d), (а, с), (с,f), (f, i), (i,g). Прямые дуги: (b, d), (с, g). Обратные дуги: (g, i), (d, b). Поперечные дуги: (f, h), (i, h):
Если начать обход в глубину этого же графа, начиная с другой вершины, то образуется глубинный остовный лес. Например, обход, начиная с вершины с, приведет к образованию леса с двумя остовными деревьями. Первое дерево включает ребра (с, f), ( f, h), (h, j), (f, i), (i,g). Второе дерево с началом обхода в вершине а состоит из ребер (a, b), (Ь, e), (e, d). Для упражнения определите прямые, обратные и поперечные дуги графа, полученные в результате такого обхода. При поиске в глубину в связном неориентированном графе образуется одно единственное глубинное дерево. В нем различают только два класса ребер: древесные и обратные.
Сложность алгоритма поиска в глубину равна 0(m), где m — число дуг (ребер) графа. При поиске в ширину последовательно просматриваются, начиная с заданной вершины, все вершины дерева на уровне k=1, 2,…. На рисунке представлены граф и остовные деревья полученные поиском в глубину и ширину. Начало поиска идёт с вершины 3.
Если начать поиск с вершины 1, то получим:
Остовное дерево наименьшей стоимости (минимального веса) Пусть G = (V, Е) — связный взвешенный неориентированный граф, для которого задана матрица смежности, отображающая веса ребер в числа (вещественные или целые). Стоимость (вес) остовного дерева определяется как сумма стоимостей (весов) его рёбер. Цель — найти для графа G остовное дерево наименьшей стоимости (минимального веса). Применение остовных деревьев минимальной стоимости можно найти при разработке коммуникационных сетей. Здесь вершины графа представляют города, рёбра – возможные коммуникационные линии между городами, а стоимость рёбер соответствует стоимости коммуникационных линий. В этом случае остовное дерево минимальной стоимости представляет коммуникационную сеть, объединяющую все города коммуникационными линиями минимальной стоимости. Полный граф с n вершинами содержит n n-2 остовных деревьев. Поиск каждого остовного дерева занимает 0(m) времени. В полном дереве m=n*(n-1)/2 (количество рёбер). Тогда решение задачи прямым поиском имело бы сложность 0(nn-2 n(n - 1)/2)=0(nn).
Построение остовного дерева минимальной стоимости. 1. Алгоритм Прима
Наиболее простым алгоритмом поиска остовного дерева минимального веса является алгоритм Прима, похожий на алгоритм Дейкстры поиска кратчайшего пути. Алгоритм Прима заключается в следующем. 1. Вначале выбираем некоторую вершину V и включаем её в множество выбранных величин, остальные (n-1) вершины графа отмечаются как невыбранные. 2. Определяются веса между всеми выбранными вершинами из и остальными невыбранными вершинами.
3. Выбираем вершину w с наименьшим весом до нее, фиксируем выбранные ребро и его вес. 4. Выбранную вершину w исключаем из множества невыбранных, включаем её в множество , число невыбранных вершин уменьшаем на 1. 5. Пункты 2— 4 повторяем до тех пор, пока не будут выбраны все вершины, т.е. (n- 1) раз. Процесс поиска остовного дерева наименьшего веса по алгоритму Прима можно проследить на примере графа, приведенного на рисунке.
Временная сложность алгоритма Прима равна O(). При большом значении n его использовании нерационально.
2. Алгоритм Крускала
Пусть имеется связный взвешенный граф G(V,E) с n вершинами. Построение остовного дерева минимального веса начинается с графа T(V,Ф), имеющего только данные n вершин без рёбер, т.е. состоящего из n связных компонент. Построение дерева сводится к формированию набора связных компонент, постепенным объединением которых и формируется остовное дерево. Алгоритм Крускала заключается в следующем. 1. Примем номер итерации i=1, упорядочим рёбра множества E по возрастанию их веса. 2. Выберем из множества E ребро с наименьшим весом. 3. Проверим выполнения условия: если ребро связывает две вершины из разных компонент, то оно добавляется в граф T, в противном случае это ребро отбрасывается (т.к. его добавление в графу приведёт к образованию цикла). 4. Ребро исключается из множества E; Осуществляется переход к новой итерации i=i+1, и шаги 2-4 повторяются до тех пор, пока все вершины не будут принадлежать одной компоненте. Продемонстрируем работу алгоритма Крускала на примере графа, рассмотренного в предыдущем разделе.
Временная сложность алгоритма Крускала O(), где m – количество рёбер в графе. При m алгоритм Крускала предпочтительнее алгоритма Прима, но если m близко к , то рекомендуется применять алгоритм Прима.
Упорядочение ориентированного графа (топологическая сортировка) Часто встречаются ситуации, когда необходимо решать задачу сортировки элементов множества, для которых определен частичный порядок, т.е. упорядочение задано не на всех, а только на некоторых парах элементов. Вот два примера: 1. В учебных программах вузов одни предметы опираются на материал других. Топологическая сортировка означает чтение курсов в таком порядке, чтобы ни один курс не читался раньше того курса, на материале которого он основан. 2. Сетевые методы планирования и управления предполагают, что любая работа может быть выполнена только после того, как будут выполнены опорные работы. Пусть имеется ориентированный граф G=(V,E) с произвольно занумерованными вершинами vi, i= 1,2,…,n. Граф является упорядоченным, если в отношении каждой его дуги (vi, vj) справедливо неравенство vi<vj. Для этого необходимо выполнить перенумерацию вершин в соответствии с их рангами. Будем считать, что единственная вершина vi, не имеющая входов, имеет нулевой ранг. Для любой другой вершины vj ее ранг равен максимальной длине пути (максимальному числу дуг) от вершины нулевого ранга vi до вершины vj. Рассмотрим граф, представленный на рисунке. Из рисунка видно, что вершина 3 имеет ранг R=0, вершина 1 имеет ранг R=1, вершины 5 и 7 имеют ранг R=2, вершина 4 имеет ранг R=3, вершина 2 имеет ранг R=4 и вершина 6 имеет ранг R=6.
а)Неупорядоченный граф б) Упорядоченный граф Алгоритм упорядочения графа состоит из двух этапов. На первом этапе определяются ранги вершин, на втором этапе осуществляется перенумерация их в соответствии с рангами. Единственной вершине vj, не имеющей входов, присваивается номер 0, а затем нумерация вершин одного ранга безразлична. Упорядоченный граф имеет вершины vj с номерами 0,1,2,…,n – 1. Рассмотренный выше граф после упорядочения будет иметь нумерация вершин, как показано на рисунке. Таким образом, исходным номерами вершин 1,2,3,4,5,6,7 после упорядочения соответствуют новые номера 1,5,0,4,2,6,3.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|