|
Разделы
Главная
Сапромат
Моделирование
Взаимодействие
Методы
Инновации
Индукция
Исследования
Факторизация
Частоты
Популярное
Как составляется проект слаботочных сетей?
Как защитить объект?
Слаботочные системы в проекте «Умный дом»
Какой дом надежнее: каркасный или брусовой?
Как правильно создавать слаботочные системы?
Что такое энергоэффективные дома?
|
Главная » Математика 1 ... 13 14 15 16 17 18 19 ... 28 Теорема 6.10.1 Форда и Максимальный поток по транспортной сети равен мощности минимального т.е. max cp(z) = minC(A). Доказательство теоремы - это алгоритм определения максимального потока по сети. Алгоритм состоит из двух частей. Насыщение потока. Поток называется насыщенным, если любой путь изх0 в zсодержит дугу и s U. для которой = с(и). Задача первой части алгоритм состоит в насыщении потока. 1.1. Зададим произвольный начальный поток. Например, нулевой на всех дугах: V4 е ц>(и = 0. 1.2. Поиск пути из в г. Если путь найден, то переход к пункту 1.3. Если путь не найден, то переход к пункту 1.5. 1.3. Увеличиваем поток по найденному пути таким образом, чтобы одна из дут стала насыщенной. 1.4. Условно разрываем насыщенную дугу и переходим к пункту 1.2, на поиск пути из х0 в z. 1.5. Сеть насыщена и разорвана . 2. Перераспределение потока. Итак, поток насыщен, как в примере на рис. 6.24. Пометим рекурсивным образом все возможные вершины сети. -2 Xl ![]() Рис. 6.24. Насыщенная транспортная сеть и пометка вершин 2.1. Вершину пометим -0. 2.2. Пусть - любая из уже помеченных вершин; у - произвольная непомеченная вершина, смежная хг Вершину у помечаем если данные вершины соединены ненасыщенным ребром xi-*y(+0 и помечаем - /, если соединены непустым ребром После пометки вершин возможны два случая: вершина z оказалась либо помеченной, либо непомеченной. 2.3. Вершина z оказалась помеченной. Значит, существует последовательность помеченных вершин от х„ к z. В этой последовательности каждая последующая вершина помечена номером предыдущей, какнарис. 6.25. Определим на дугах новый поток, увеличивая на единицу поток на дугах, ориентированных по направлению движения к z, и уменьшая поток на единицу на дугах, направленных против этого движения, как на рис. 6.25. 3 13 3 13 -О 1 Щ Г -2 Г +1 2 0 2 хО х2 si z xo х2 xl I Рис. 6.25. Перераспределение потока на основе пометки вершин Заметим, что поток можно увеличивать (уменьшать) на прямых (обратных) дугах настолько, пока одна из дуг не станет насыщенной (пустой). Далее вновь переходим к пометке вершин (пункт Выполненное перераспределение потока сохраняет все его свойства и увеличивает на единицу поток в вершину z. Таким образом, пометка вершины z позволяет увеличить поток как минимум на единицу, а значит, алгоритм конечен, т.е. наступит момент, когда вершина z останется непомеченной. 2.4. Вершина z осталась непомеченной. В рассматриваемом примере это показано на рис. 6.26. Пусть А* - множество всех непомеченных вершин. Тогда дуги, входящие в эти вершины, насыщенные, а выходящие - пустые. В примере А* = {xz}. Множество А* определяет разрез, так как Xq еА*, zeA*. Таким образом, мы нашли поток и разрез для которых выполняется = С(А*) Учитывая, что выходящие дуги из А* пустые, то весь поток ср*(/}*} скатывается в z, т.е. y*(z) = С(А*). ![]() Рис. 6.26. Максимальный поток Определение независимого множества вершин. Пусть граф Г= (X, U, Ф) - неориентированный и без петель. Множество / a U вершин называется независимым, если между любыми его вершинами нет соединяющих ребер. В зависимом множестве хотя бы две вершины соединены ребром. Множество Q полностью зависимое, если каждая пара его вершин соединена. Вершины графа, составляющие Q, образуют полный подграф. Определение. Максимальное независимое множество есть независимое множество, которое становится зависимым после добавления к нему любой вершины. Заметим, что каждое независимое множество содержится в некотором максимальном независимом множестве. Максимальное число (5(7) вершин, составляющих независимое множество, называется числом (вершинной) независимости графа. - Определение независимого множества ребер. Подобно независимым множествам вершин рассматриваются независимые множестваребер, состоящие из ребер, не имеющих общих вершин. Каждое независимое множество ребер содержится в некотором максимальном независимом множестве. Число ребер в максимальном независимом множестве называется числом реберной независимости $и(Г). При представлении игр графами независимые множества вершин являются такими множествами позиций, что никакая из них не может быть достигнута из другой за один ход. Примером является задача о расположении максимального числа ферзей на шахматной доске так, чтобы ни один них не мог побить другого. Это максимальное число равно (3(7) = 8. Утверждение 6.11.1. Независимое множество максимально тогда и только тогда, когда оно доминирующее, а значит, р(7) > 5(7)-число (вершинной) независимости не может быть меньше числа доминирования. Доказательство. (=>) Если 7с U- максимальное независимое множество, то не может быть вершин k е 7, не соединенных с ребром, так как в противном случае множество fcu /также было бы независимым, но I- максимальное по условию. Отсюда 7 - доминирующее. (<=) Пусть 7- независимое доминирующее множество. Тогда никакое & нельзя перевести из 7 в /так, чтобы kvl осталось независимым, а значит, 7 - максимальное. Определение. Клике есть полностью зависимое множество, которое теряет это свойство после добавления любой вершины. Клики графа представляют естественные группировки вершин в максимальные полные подграфы. Определение клик графа полезно в кластерном анализе в таких областях, как информационный поиск, в социолоши и др. В качестве примера на рис. 6.31 показан граф и его клики. 2 з 2 з Замечание. Если предположить, что граф (X, U, простой, то полностью зависимые множества (клики) в Г становятся максимально независимыми множествами в дополнительном графе Г, верно и обратное. При алгоритмическом подходе к выделению в графе применяют метод поиска с возвращением по специальному дереву поиска, устроенному следующим образом. Каждый узел в дереве поиска соответствует полному подграфу исходного графа, и каждое ребро дерева поиска соответствует вершине исходного дерева. Вершины (множества) дерева поиска определим рекурсивно. Корень дерева поиска - пустое начальное множество S = 0. Пусть теперь S - произвольная вершина дерева поиска какого-либо уровня. Тогда вершиной следующего уровня дерева поиска будет вершина Su {х}, еслих eS их смежна с каждой вершиной из S. В дереве поиска такие вершины S и S и {х} соединяются ребром, которое соответствует вершине х. На рис. 6.32 показаны некоторый граф Гидерево поиска Т, которое исследуется в процессе поиска с возвращениями клик графа полным перебором. Заметим, что каждая клика порождается много раз: клика {1,2,3} порождается 3! раз, клики {3,4} {4,5} порождаются 2! раз. В общем случае клика размера к порождается к\ раз. Все тонкие ребра на рис. 6.32 исследования дерева поиска можно оборвать, они не приводят к новым кликам. Следующие два утверждения позволяют обрывать такие тонкие ребра (не исследовать их), обеспечивая целенаправленный проход по дереву поиска клик графа. ![]() Рис. 6.31. Граф и его клики ![]() 3} i2l) (23) (31} {3?} {34} {45} {43} {54} {132} {123} {213} {231} {312} {321} Рис. 6.32. Граф полный перебор дерева Т поиска клик Утверждение 6.11.2. ПустьГ= (X, U, Ф) - исходный граф, S -узел в дереве поиска (S с X- подмножество вершин графа). Вершина Sдерева поиска уже обработана и первой вершиной, которую надо исследовать, является множество {х}, как на рис. 6.33, вершинах смежна с каждой вершиной из S. Пусть все поддеревья узла $ о {л; в дереве Гуже исследованы и порождены все клики, включающие $<и {х\ Тогда необходимо исследовать только те из вершин S kj {v,}. для которых Утверждение 6.11.3. Пусть S - узел в дереве поиска Т, и пусть S с S - предок h Т. Если все поддеревья узла S и{х} уже исследованы, что порождены все клики, включающие S то все неисследованные поддеревья с корнями можно игнорировать. Алгоритм 13 порождения клик графа представляет собой процедуру поиска с возвращением и является наиболее сложным из всех ранее рассмотренных алгоритмов. Рекурсивная процедура CLIQUE имеет два параметра: и D. Для рассматриваемого узла S v z Aoj[a (рис. 6.33). Рис. 6.33 Поддеревья ![]() с корнями Su {v,\ (эти вершины смежны с 5) поиска объединение представляет множество вершин, смежных с каждой вершиной из S, т.е. NuD-множество вершин, которые могут выступать в качестве продолжения поиска клик из вершины S. Множество ./V состоит только из новых вершин, которые могут быть добавлены к Sв процессе поиска клик, т.е. К- {х >~ ®\ix,s) e U\/seS с S ни одно из поддеревьев S {x} не исстЪчано). Алгоритм 6.13. Порождение клик графа S=0; {Начальнси вершина дерева поиска N=X; D Z=X; CLIQUE(N, D, Z); {Рек\рсивнш проход по дереву поиска Procedure CL1QUE(N, D, Z) if N и D = 0 then вывести S, которое является кликой else ifN*0then begin x e N; {Исследоватьпервое поддерево) View(x); {Исследовать поддеревья) {Исследовапп оставшиеся поддеревья уровня) Z=Z\{x); Z=Z\Adj[x]; while Z*0do begin v <= Z; View(\); {Исследовать поддеревья) Ze Z\{v); end; end; end; Procedure View(v) {Исследовать поддеревья) N= N\{v); S=S{v); CLIQUE{Nr,Adj[v], D n Adj[v], N rxAdj[v}); S=S\{v); DP- U}: end; Процедура CLIQUE выбирает произвольную вершину x e N, удаляет ее из TV и исследует поддерево S= Su {х), обращаясь к процедуре View. Далее, согласно утверждениям 6.11.2и 6.11.3,при помощи процедуры исследуются только поддеревья S= 5и{у), где v е ТУ, v & Adj[x] что соответствует условию veZ. Множество Zcoctomt из вершин одного уровня дерева, которые должны быть исследованы при рекурсивном проходе по дереву поиска, чтобы не потерять ни одной клики графа. Второй параметр D процедуры CLIQUE представляет собой множество вершин, смежных со всеми вершинами из S, но таких, которые не надо добавлять к S на предмет продолжения формирования клик. D = {х е X\\(x,s) е (7Vj eSu поддерево^ и{х} исследовалось для некоторых S с$1- По алгоритму множество S с X является полным подграфом графа Г = (X, U, Ф) и Nu D - множество всех вершин, смежных с каждой вершиной в S. Множество S будет кликой тогда и только тогда, когда Условие N= 0 и 0 обозначает, что все клики, включающие S, уже ранее порождались. ПриЛЧ* 0 могут оставаться клики, включающие S, которые еще не порождались. Исследование таких поддеревьев S {х}, х в N необходимо продолжить. Основные усилия алгоритма 6.13, порождения клик графа, направлены на поддержание множеств N к D, текущее состояние которых, согласно перечисленным выше условиям, предопределяет исследования по дереву поиска. Программная реализация алгоритма порождения клик графа представлена в алгоритме 6.14 на Pascale, который близко соответствует множественному описанию алгоритма 6.13. Отметим, что в программной реализации передача множеств N, D, ZB качестве параметров процедур выполнена посредством указателей kN, nN, kl), nl), kZ, nZ, где kN, kl), &Z-указатели начала вершин в множествах, соответственно N, D, Z, a nN, nD, nZ - количество вершин в каждом из этих множеств. Алгоритм 6.14. Программа порождения клик графа Program PgmClique; {Выделение клик графа} uses CRT, DOS; Const nVertex-100; {Максимальное количество вершин} nAdjacent-lOOO; {Максимальная длина списка смежности) Туре TypeVertex=array (1. .nVertex] of Integer; TypeAcijacent-array [i. .nAdjacent of Integer; Var :Text; { Текстовый файл } Integer; { Количество вершин в графе :TypeAdjacent;{ Список смежности графа } Fst Nbr :TypeVertex; { Указатели вершин списка снепаости} :TypeVertex; { Количество вершин в списке смежности } Vtx :TypeVertex; { Список вершин графа } S :TypeVertex; ( Список вершин формируемых клик } nS :Integer; { Количество вершин в списке S } N :TypeVertex; { Список включаемых вершин при поиске клик} [kN,nN - указатель начала и количества вершин в списке N) D :TypeVertex; {Список вершин с ранее найденными кликами} - указатель начала и количества вершин в списке Z :TypeVertex; { Список не исследованных вершин } - указатель начала и количества вершин в списке Procedure PrintCliquo; FORWARD; Procedure Subtract ( x:Integer; Var kZ,nZ:Integer ); FORWARD; Procedure Var teger; Var M:TypeVertex ); FORWARD; Procedure View( v:Integer; VarkFpnN, kD,nD, kZ,nZ:Inte- ger ); FORWARD; Procedure Clique( Ш,nN,kD,nD,kZ,nZ:Integer ); FORWARD; Procedure Var yes -.Boolean ) ; { Переназначение меток вершин их порядковыми номерами по списку смежности вершин графа } ( yes - признак правильной структуры списка смежности графа} Var i,j,k :Integer; begin for i:=l to m do for j:=l to Nbr[i] do begin yes:=FALSE; for k:=l to m do if Adj[Fst[i]+j]=vtx[k] then begin yes:=TRUE; Adj[Fst[i]+j]:=k; break; end; if not yes then exit; end; end; Procedure PrintClique; ( Печать вершин найденной клики } Var i :Integer; begin for i:=l to nS do Write (f,Vtx[S [i]] : 3) ; WriteLn(f); end; Procedure Var kMw,nMw:Integer; Var M:TypeVertex ) ; { Формирование пересечения M*Adj [v] множеств M и Adj [v] } Var i,j,k : Integer; yes begin {kMw - указатель начала вершин в множестве M*Adj[v]} {nMw - количество вершин в множестве M*Adj[v]} kMw:=kM+nM; nMw:= 0; for i:=l to nM do for j:=l to Nbr[v] do if M[kM+i]=Adj[Fst[v]+j] then begin nMw:=nMw+l; M[kMw+nMw] :=M[kM+i] ; break; end; end; Procedure Subtract( x:Integer; Var kZ,nZ:Integer ); i(* Формирование разности множеств Z=Z\{x} и Z=Z\Adj[x] *) i,j,k : Integer; yes begin (* Формирование Z=Z\{x} *) for i:=l to nZ do if Z[kZ+i]=x then begin nZ:=nZ-l; for k:=i to nZ do break; end; (* Формирование Z-ZXAdjtxl *) for to Nbr [х] do for i:=l to nZ do if Z[kZ+i]=Adj[Fst[x]+j] then begin nZ:=nZ-l; for k:=i to nZ do Z [kZ+k] :=Z [kZ + k + 1 ] ; break; end; end; Procedure Clique ( kN,nN,kD,nD,kZ,nS:Integer ); { Процедура рекурсивного поиска клик графа } Var i,j,x :integer; begin if (nN=0) and (nD=0) then {Клика найдена} PrintClique {Печать клики} else if nN<>0 then begin {Продолжит! исследование поддеревьев) x:-N[kN+nN]; {Перебор с конца вершин множества N1 поддерево Subtract(х,kZ,nZ); (* Z=Z\{x} и Z=Z\Adj[х] *) while nZ<>0 do begin {Исследовать следующие поддеревья уровня} x:=Z[kZ+nZ]; View(x,kN,nN,kD,nD,kZ,nZ); nZ:=nZ-l; (* Z = Z\(x:- *) end; end; end; Procedure Var { Исследование поддеревьев следующего уровня } -Var i,k -.Integer; kNw,nNw : Integer; kDw,nDw :Integer; kZw,nZw :Integer; begin (* Формирование N=N\{v} *) for i:=l to nN do if N[kN+i]=v then begin nN:=nN-l; for k:=i to nN do break; end; 1 ... 13 14 15 16 17 18 19 ... 28 |
|