Мониторинг динамически меняющегося
графа
Игорь Бурдонов <[email protected]> Александр Косачее <ко[email protected]> Институт системного программирования РАН, 109004, Россия, г. Москва, ул. А. Солженицына, д. 25.
Аннотация. Исследование ориентированных графов является корневой задачей во многих приложениях. Такое исследование имеет особую специфику тогда, когда граф моделирует сеть связи, в том числе сеть интернета и GRID. Узел сети имеет локальную информацию о сети: он «знает» только о дугах, выходящих из этой вершины, но «не знает», куда (в какие вершины) эти дуги ведут. Узлы сети обмениваются сообщениями, передаваемыми по сетевым связям, которые в графе изображаются как дуги и играют роль каналов передачи сообщений. Исследование графа базируется на его обходе, когда сообщение проходит по каждой дуге графа. Пока не пройдена какая-то дуга, нет уверенности, что она не ведёт в ещё не исследованную часть графа. Обычно рассматривается обход графа с помощью одного сообщения, циркулирующего в сети. Обход выполняется быстрее, если выполнять его параллельно: по сети одновременно циркулирует не одно, а множество сообщений. В данной работе рассматривается параллельное исследование сильно связного графа, целью которого является не просто обход графа, а сбор полной информации о графе в каждой его вершине. Вторая особенность работы - исследование динамически меняющегося графа: его дуги могут исчезать, появляться или менять свои конечные вершины. Предлагается алгоритм работы автоматов, который обеспечивает сбор полной информации о графе в каждой вершине графа.
Ключевые слова: ориентированные графы, исследование графа, обход графа, взаимодействующие автоматы, параллельная работа, динамически меняющиеся графы.
1. Введение
Исследование ориентированных графов является корневой задачей во многих приложениях. Такое исследование имеет особую специфику тогда, когда граф моделирует сеть связи, в том числе сеть интернета и GRID. В этом случае узлы сети обычно «не знают» всего графа и имеют только локальную информацию о нём. В частности, узел сети, соответствующий вершине графа, может «знать» только о дугах, выходящих из этой вершины, и даже «не знать», куда (в какие вершины) эти дуги ведут. Исследование графа можно
свести к задаче сбора полной информации о графе в каких-то или во всех узлах сети. Для решения этой задачи узлы сети могут обмениваться сообщениями, передаваемыми по сетевым связям, которые в графе изображаются как дуги.
Исследование графа базируется на его обходе, когда сообщение проходит по каждой дуге графа. Пока не пройдена какая-то дуга, нет уверенности, что она не ведёт в ещё не исследованную часть графа. Обход графа - это уже классическая задача обхода лабиринта. Эта задача нетривиальна, если граф ориентирован, то есть в лабиринте «улицы с односторонним движением». Обход ориентированного сильно-связного графа требует времени порядка пт, где п - число вершин графа, а т - число дуг. Такое время обхода достигается многими хорошо известными алгоритмами: обход в глубину, обход в ширину, «жадный» алгоритм и др. [1,2,3].
В 1966 г. М.О. Рабин поставил задачу обхода ориентированного графа конечным автоматом [4]. Автомат на графе аналогичен машине Тьюринга: ячейке ленты соответствует вершина графа, а движение влево или вправо по ленте заменяется переходом по одной из дуг, выходящих из текущей вершины графа. Это эквивалентно движению по графу одного сообщения, которое пересылается по дугам графа автоматами, неподвижно «сидящими» в вершинах графа. Дуги графа играют роль каналов передачи сообщений. Автоматы в вершинах графа идентичны друг другу, но могут находиться в разных состояниях. Автомат, находящийся в вершине, посылает сообщение по одной из дуг, выходящих из этой вершины, и через какое-то время такое сообщение принимается автоматом в конце дуги, который, в свою очередь, может модифицировать это сообщение и послать его дальше. На сегодняшний день наиболее быстрый алгоритм обхода графа с помощью одного сообщения предложен в [5], он имеет оценку nm+n2loglogn. При повторном обходе, когда автоматы в вершинах находятся не в начальном состоянии, а в конечных состояниях после первого обхода, оценка уменьшается до пт+п21(п), где 1(п) — число логарифмирований, при котором достигается соотношение l<log(log...(n)...)<2 [6]. Отличие от нижней оценки пт объясняется тем, что сообщению бывает нужно «вернуться» в начало только что пройденной дуги.
Обход графа можно выполнить быстрее, если по дугам графа может параллельно пересылаться не одно, а много сообщений. Оценка времени работы алгоритма зависит от числа сообщений, которые могут одновременно передаваться по дуге. Такое число называется ёмкостью дуги и обозначается к. В [7] предложен алгоритм такого обхода, имеющий оценку порядка п/к+Б, где Б - длина максимального пути (маршрута без самопересечений) в графе. Правда, число состояний автоматов в вершинах графа зависит от числа п вершин графа и ограничения 5 на число дуг, выходящих из вершины, и имеет порядок nDlogs. Этот алгоритм строит на графе с выделенной начальной
вершиной (корнем) структуру из прямого и обратного остовов графа: прямой остов ориентирован от корня, а обратный - к корню. В дальнейшем эта структура может использоваться для параллельного вычисления любой требуемой функции от мультимножества значений, записанных в вершинах графа (в памяти автоматов, находящихся в вершинах графа). В данной работе мы также рассматриваем исследование графа с помощью многих параллельно передаваемых сообщений, но с двумя существенными отличиями от предыдущих работ по исследованию графа. Во-первых, целью такого исследования является не просто обход графа или построение какой-то структуры на графе, а сбор полной информации о графе в каждой его вершине. Во-вторых, мы рассматриваем граф, который может динамически изменяться: какие-то его дуги могут исчезать, появляться или менять свою конечную вершину.
2. Постановка задачи
Рассматривается ориентированный граф с п вершинами и т дугами, в котором вершины не меняются, а дуги могут меняться со временем. Будем предполагать, что в каждый момент времени граф сильно связный. Кроме того, будем считать, что если изменения в графе прекращаются, то с этого момента времени длина максимального пути в графе не превышает Г). В вершинах графа находятся автоматы, которые могут получать специальные сигналы от графа и обмениваться между собой сообщениями, передаваемыми по дугам графа в направлении их ориентации. Каждая вершина имеет уникальный (среди вершин) идентификатор вершины. Будем считать, что существует пустой идентификатор, отличный от идентификатора любой вершины. Автомат может узнать идентификатор своей вершины с помощью примитива «Дай идентификатор». Для краткости везде, где это не приведёт к недоразумениям, мы будем вместо «автомат вершины» писать просто «вершина».
Все дуги, выходящие из вершины, перенумерованы, начиная с номера 1 до наибольшего номера, не превосходящего некоторого числа 5. Очевидно, 5 <т. Дуга однозначно идентифицируется парой (идентификатор начала дуги, номер дуги), которую мы будем называть идентификатор дуги. Число дуг т - это число различных идентификаторов дуг в графе.
Автомат, посылая сообщение по дуге, указывает её номер. Будем говорить, что дуга занята, если по ней передаётся сообщение. Иначе дуга свободна. Посылать сообщение можно только по свободной дуге. В самом начале все дуги свободны. Когда сообщение передано по дуге, начало дуги извещается об этом сигналом освобождения дуги с параметром номер дуги. Дуги графа могут изменяться следующим образом:
• Дуга может появиться, о чём начало дуги извещается сигналом появления дуги с параметром номер дуги.
• Дуга может исчезнуть. Если по дуге передавалось сообщение, то оно пропадает, и в этом случае начало дуги извещается сигналом исчезновения дуги с параметром номер дуги. Заметим, что если по дуге никакого сообщения не передавалось, то сигнала исчезновения дуги не будет; однако если вершина попытается послать сообщение по исчезнувшей дуге, сообщение не будет передано, а вершина получит сигнал исчезновения дуги.
• Дуга может поменять свой конец; в этом случае никаких сигналов не предусмотрено.
Из-за того, что дуги могут исчезать и появляться, номера дуг, выходящих из одной вершины и имеющихся в данный момент времени, могут не идти подряд, т.е. не образовывать отрезок натурального ряда, но в любом случае они располагаются на отрезке от 1 до 5. Хотя конец дуги может меняться, в данный момент времени у дуги может быть только один конец; если дуга исчезла, считается, что её конец «пустой», то есть имеет пустой идентификатор. В каждый момент времени дуга описывается парой (идентификатор дуги, идентификатор конца дуги) или, что то же самое, тройкой (идентификатор начала дуги, номер дуги, идентификатор конца дуги). Временем существования дуги будем называть время между изменениями дуги, то есть время от появления дуги или изменения её конца до исчезновения дуги или изменения её конца.
Итак, если не считать идентификатора вершины, который автомат получает с помощью примитива «Дай идентификатор», входными символами автомата, находящегося в вершине, являются сигналы от дуг, выходящих из вершины, и сообщения, получаемые по дугам, входящим в вершину. Срабатывание автомата - это обработка одного такого входного символа. Мы будем предполагать, что входные символы обрабатываются автоматом в порядке их возникновения. Это означает, что существует очередь на обработку автоматом входных символов. Если во время обработки автоматом очередного сигнала или сообщения поступает новый входной символ, он ставится в конец этой очереди. Одновременно поступающие входные символы ставятся в конец очереди в произвольном порядке. При этом сигнал освобождения дуги вырабатывается не тогда, когда сообщение ставится в очередь входных символов, а тогда, когда оно выбирается из этой очереди автоматом конца дуги. Поэтому в очереди входных символов может быть не более одного сообщения для каждой входящей дуги. Если сигнал от некоторой выходящей дуги вырабатывается в тот момент времени, когда предыдущий сигнал от этой дуги ещё находится в очереди входных символов, то новый сигнал замещает собой старый сигнал. Можно отметить, что таким новым сигналом может быть только сигнал появления дуги. Поэтому в очереди входных символов может быть не более одного сигнала для каяедой выходящей дуги. Тем самым, длина очереди входных символов автомата не превосходит степени вершины,
то есть не больше 2т (2т достигается для п=1, когда все дуги - петли, поскольку петля считается два раза: как входящая - для сообщений и как выходящая - для сигналов).
Мы ставим задачу разработки алгоритма работы автоматов, который обеспечивает сбор полной информации о графе в каяедой вершине графа. Такая информация может быть задана как набор описаний всех дуг. Описание дуги содержит идентификатор дуги и идентификатор её конца. Понятно, что если граф постоянно меняется, то мы не можем гарантировать, что описания текущего состояния всех его дуг отражены во всех его вершинах: сообщения о последних изменениях дуг просто «не дошли» до некоторых вершин. Поэтому требуется только, чтобы через время Т0 после изменения дуги все вершины графа «узнали» об этом или более позднем изменении дуги. Если после данного изменения дуга больше не меняется, по крайней мере, в течение времени Т0, то во всех вершинах графа будет одинаковое (и верное) описание этой дуги.
Для того чтобы время Т0 было конечным, нужно, чтобы сообщения могли распространяться по графу, доходя до каждой вершины. Для этого нужно, чтобы время х пересылки сообщения по дуге и время у срабатывания автомата были конечными. Кроме того, время г существования дуги должно быть достаточно велико, чтобы по дуге успевало пройти хотя бы одно сообщение. Такими «долгоживущими» дугами могут быть не все дуги: достаточно, чтобы в каждый момент времени «долгоживущие» дуги порождали сильно связный суграф (подграф, содержащий все вершины графа). Это усиление требования сильно связности графа в каждый момент времени.
Для ограниченности времени Т0 необходимо, чтобы х и у были ограничены сверху: х <Хиу <Т, аг - снизу: г >'/.. Выразим эту нижнюю границу 2 через X и 7. Сообщение можно посылать по дуге сразу после того, как она появилась или освободилась. Однако в этот момент времени сигнал появления или освобождения дуги ещё только ставится во входную очередь символов автомата начала дуги, длина которой может достигать 2т. Поэтому сообщение посылается по дуге не сразу, а через время, которое может достигать 2тУ. Следовательно, сообщение дойдёт до конца дуги и будет поставлено во входную очередь символов автомата конца дуги через время, которое может достигать 2тУ X. если в течение этого времени дуга не менялась. Поэтому будем предполагать, что нижняя граница времени существования «долгоживущих» дуг 2 >2тУ X.
Мы предложим алгоритм решения поставленной задачи, а время Т0 будем оценивать для простоты в предположении, что временем срабатывания автомата можно пренебречь, то есть У=0, время пересылки по дуге не превосходит 1 такта, то есть Х=1, а время существования «долгоживущей» дуги может быть минимально, то есть 2=2да7+Х=7. Кроме того, оценим время Ти за которое будет выполнен сбор полной информации о графе в каждой
вершине графа после того, как вообще прекратились все изменения в графе. Очевидно, что 7:, <Т0, однако прекращение изменений в графе позволяет существенно уменьшить по сравнению с Т0.
3. Идея алгоритма
Идея алгоритма заключается в том, чтобы каждый раз, когда обнаруживается изменение дуги, корректировать описание дуги и рассылать сообщение с этим описанием «веером» по всем дугам графа для того, чтобы каждая вершина его получила. Мы будем говорить, что рассылается описание дуги. Первое описание дуги создаётся в начале дуги по сигналу появления дуги при первом появлении этой дуги. Дуга, которая имеется в графе с самого начала, считается появляющейся в начальный момент времени.
Как выполнить рассылку описания дуги р «веером»? Для этого вершина, принимая по некоторой входящей дуге q описание дуги р первый раз, рассылает его по всем выходящим дугам, а повторные принимаемые описания дуги р игнорирует. Однако дуга может меняться несколько раз, поэтому если вершина принимает описание более позднего состояния дуги, чем то, о котором она уже «знает», она не должна игнорировать принимаемое описание. Для этого состояния дуги, соответствующие её последовательным изменениям, перенумеровываются. Этот номер называется рангом дуги и хранится в описании дуги. Вершина игнорирует принимаемое описание дуги только в том случае, если в нём ранг дуги меньше или равен рангу дуги в её описании, хранящемся в вершине. Если же ранг дуги в принимаемом описании больше, то принимаемое описание дуги замещает собой описание дуги в вершине, и далее вершина должна разослать это обновлённое описание дуги по всем выходящим дугам.
Каким образом обнаруживается изменение дуги? Схема работы алгоритма показана на рис. 1.
О появлении дуги извещается начало дуги с помощью сигнала появления дуги. В этот момент времени конец дуги ещё не известен, поэтому в описании дуги идентификатор конца дуги делается пустым. По дуге посылается её описание, причём указывается идентификатор дуги, по которой посылается описание. Когда это описание дойдёт до конца дуги, в описание дуги будет помещён идентификатор конца дуги и далее полученное описание дуги рассылается «веером». Когда это описание дойдёт до начала дуги, там тоже появится непустой идентификатор конца дуги.
Для того чтобы отслеживать изменение конца дуги, по дуге периодически посылается её описание. Если конец дуги не меняется, идентификатор конца дуги в посылаемом описании совпадает с идентификатором вершины, получившей описание, то есть с идентификатором конца дуги. В этом случае ничего делать не нужно. Если же конец дуги сменился, то идентификатор конца дуги в посылаемом описании будет отличаться от идентификатора
вершины, получившей опрос, т.е. от идентификатора нового конца дуги. В этом случае новый конец дуги рассылает «веером» описание дуги со своим собственным идентификатором как идентификатором конца дуги. Когда такое описание получит начало дуги, оно поменяет идентификатор конца дуги в своём описании дуги.
Об исчезновении дуги извещается начало дуги с помощью сигнала исчезновения дуги. Это происходит тогда, когда по дуге передаётся сообщение. Начало дуги делает пустым идентификатор конца дуги в своём описании дуги и рассылает это описание «веером».
Для того, чтобы описанная схема алгоритма работала, нужна правильная процедура изменения ранга дуги. Смысл этой процедуры в том, чтобы в описании более нового состояния дуги ранг был больше, чем во всех других имеющихся описаниях дуги.
Пусть в начале дуги в описании этой дуги указан максимальный ранг /. Если идентификатор конца дуги в этом описании неправильный (пустой после появления дуги или старый после изменения конца дуги), то конец дуги, получив по дуге такое её описание и обновив его (добавив свой идентификатор как идентификатор конца дуги), должен увеличить на 1 ранг дуги. Далее обновлённое описание дуги с максимальным рангом ]+1 будет распространяться по графу «веером», в том числе и до начала дуги. Однако здесь возникает проблема многократного изменения конца дуги. В этом случае уже не в одной, а в нескольких вершинах может оказаться максимальный ранг ]+1. Поскольку только одна из этих вершин в данный момент времени является текущим концом дуги, нужно, чтобы по графу распространялось описание дуги именно с текущим концом дуги, а не с каким-то другим, более ранним. Для решения этой проблемы начало дуги, получив описание с рангом ]+1 от какого-нибудь, возможно, более раннего конца дуги, ещё раз увеличивает ранг дуги на 1 так, что он становится равным ]+2. Но теперь такой ранг не просто максимальный: он имеется только в начале дуги. Если идентификатор конца дуги в этом описании правильный (т.е. начало дуги получило описание с рангом]+1 от текущего конца дуги), то это описание с максимальным рангом ]+2 будет распространяться по всему графу, пока не произойдёт следующего изменения дуги. Если же идентификатор конца дуги в описании не правильный (т.е. начало дуги получило описание с рангом ]+1 от более раннего конца дуги), то это описание с максимальным рангом ]+2 снова по дуге попадёт в текущий конец дуги, где ранг ещё раз будет увеличен на 1. Теперь в описании в конце дуги идентификатор конца правильный, а ранг, равный ]+3, не просто максимальный: он имеется только в конце дуги. Это описание будет распространяться по всему графу, пока не произойдёт следующего изменения дуги. В частности, такое описание с рангом ]+3 попадёт в начало дуги, где ранг снова будет увеличен до ]+4, а идентификатор конца дуги останется правильным.
Разумеется, во время выполнения этой процедуры возможно исчезновение дуги. В начале дуги идентификатор конца дуги в её описании станет пустым, что правильно после исчезновения дуги. Но нужно ещё увеличить ранг дуги, чтобы он стал больше, чем в любой другой вершине. Поскольку по приведённому выше описанию процедуры изменения ранга видно, что ранг дуги в начале дуги либо максимальный, либо на 1 меньше максимального, при исчезновении дуги в начале дуги достаточно увеличить ранг дуги на 2. Что делать с рангом дуги, если сигнал исчезновения дуги пропущен, поскольку был замещён последующим сигналом появления дуги? Пропущенный сигнал исчезновения дуги означает и пропущенное состояние дуги - «дуга исчезла». Этому состоянию дуги соответствует описание с пустым идентификатором конца дуги. Поэтому, если при появлении дуги идентификатор конца дуги в её описании в начале дуги не пустой, нужно в начале дуги не только сделать идентификатор конца дуги пустым, но и увеличить ранг так, чтобы он стал больше ранга дуги в любой другой вершине, то есть увеличить на 2. Это как раз и будет соответствовать пропущенному состоянию дуги. Если же при появлении дуги идентификатор конца дуги в её описании в начале дуги пустой, в начале дуги достаточно сделать идентификатор конца дуги пустым, а ранг увеличивать не нужно, поскольку описание дуги в её начале уже соответствует пропущенному состоянию дуги.
На рис. 1 выделен также случай, когда дуга является петлёй, то есть конец дуги совпадает с её началом. В этом случае не нужно сначала увеличить ранг на 1 в конце дуги, затем распространить это описание по графу до начала дуги, после чего ещё раз увеличить ранг на 1. Вместо этого нужно сразу увеличить ранг на 2.
появление Дуги р
появление дуги р (особый случай)
исчезновение свободной Дуги р
сигнал появления дуги р
сигнал появления дуги р
по дуге р посылается описание дуги р
-{+3
по дуге р посылается описание дуги/»
I
'——Н
исчезновение занятой Дуги р
конец дуги р принимает описание дуги р по дуге р
изменение конца дуги р
не петля
+1 —петля —
ТУр
-1
начало дуги р принимает описание дуги р с рангом на 1 больше
+
по дуге р посылается описание дуги р
конец дуги р принимает описание дуги р по дуге р
в принятом описании дуги р конец дуги
правильный
в принятс^л описании дуги р крнец дуги не правильный
не петля
+1----петля-
"П(п-1)
"П(п-1)
сигнал исчезновения дуги р
Ё)
3(п-1)
3(п-1)
во всех вершинах
правильное описание дуги р
Пунктирная линия - переход за 0 тактов, сплошная - за < 2 такта, жирная - за < 3(п-1) тактов. В двойной рамке - изменения дуги. Особый случай появления дуги: конец дуги известен, а сигнал исчезновения пропущен.
Рис. 1. Схема работы алгоритма
Также на рнс.1 показаны переходы, которые происходят либо за нулевое время (при условии, что временем срабатывания автомата мы пренебрегаем), либо за время не более 2 тактов, либо за время не более 3(п-1) тактов. На рисунке видно, что максимальная длительность цепочки переходов от изменения дуги до распространения описания этой дуги по состоянию после этого или последующих изменений дуги равна 2+3(п-1)+3(п-1)=6п-4. Если добавить ещё один такт, то информация о дуге окажется гарантированно правильной также и во всех описаниях, передаваемых по дугам. Строгое доказательство этих оценок приведено ниже в разделе 5.1. До сих пор мы молчаливо предполагали, что распространению по графу описания дуги ничто не мешает, кроме описаний этой же дуги с большими рангами, что соответствует более поздним состояниям дуги. Однако такому распространению могут препятствовать также изменения дуг. По «короткоживущим» дугам сообщения могут просто не успевать проходить, поэтому вся надежда на «долгоживущие» дуги, которые не меняются, по крайней мере, в течение 1 такта. В постановке задачи предполагается, что в каждый момент времени суграф, порожденный «долгоживущими» дугами, сильно связен.
Однако для того, чтобы воспользоваться этими предположениями, нужно успевать передавать по «долгоживущей» дуге все требуемые описания. А это означает, что в одном сообщении, посылаемом по некоторой дуге, нам нужно объединить все описания дуг, которые нужно передать по этой дуге. Что это за описания? Если дуга q появляется или меняет свой конец, то по ней нужно передавать все имеющиеся в начале дуги описания, поскольку возможен случай, когда после такого изменения дуги q в её конец ещё не передавались эти описания. Если дуга q исчезает, то по ней, конечно, ничего передавать нельзя. И только в том случае, когда не происходит изменение дуги ц. по ней можно было бы передавать только те описания, которые по ней ещё не передавались.
Однако когда мы посылаем сообщение по дуге, содержащее лишь часть хранящихся в начале дуги описаний, мы не знаем, сменит ли дуга свой конец до завершения передачи сообщения. Если через время х<1 тактов после посылки по дуге сообщения дуга меняет свой конец, то дуга ещё не освобождается; освобождение может произойти через 1 такт, после чего нам следует послать по дуге второе сообщение со всеми (или со всеми остальными) описаниями. Это второе сообщение может передаваться тоже 1 такт, поэтому в конец дуги все описания могут попасть через 2 такта. Однако время существования «долгоживущей» дуги ограничено снизу одним тактом, а не двумя.
Но даже если бы мы увеличили эту нижнюю границу времени существования «долгоживущей» дуги до 2 тактов, это не помогло бы. Дело в том, что о смене конца дуги узнаёт лишь автомат в конце дуги, а в начало дуги информация об этом попадает через длительное время в результате распространения описания 78
по графу. В течение этого длительного времени дуга может много раз менять свой конец, и каждый раз по дуге в её очередной конец попадёт только часть описаний.
Эти эвристические соображения приводят к выводу, что по дуге нужно посылать сообщение, содержащее сразу все описания, хранящиеся в начале дуги.
4. Описание алгоритма
4.1 Сообщения
Сообщение содержит:
• Г - идентификатор начала дуги, по которой сообщение передаётся,
• Г - номер дуги, по которой сообщение передаётся,
• Г - длина массива описаний дуг,
• Ь~[0..Г-1] - массив описаний дуг.
Описание е дуги содержит: 1) идентификатор начала дуги, обозначаемый \'(е). 2) номер дуги, обозначаемый ¡(е). 3) идентификатор конца дуги (быть может, пустой), обозначаемый К(е) и 4) ранг дуги, обозначаемый г(е). Идентификатор дуги - (Ы(е)А(е)).
4.2 Память автомата
Память автомата содержит:
• управляющее состояние (начальное или рабочее),
• / - идентификатор вершины,
• / - длина массива описаний дуг, хранящихся в вершине,
• Ь[0..1-1] - массив описаний дуг.
4.3 Работа автомата
4.3.1 Начальное состояние
Автомат опрашивает идентификатор вершины и запоминает его в I. Инициализируется: 1:=0. Автомат переходит в рабочее состояние.
4.3.2 Рабочее состояние
В этом состоянии автомат ожидает любого сигнала и любого сообщения.
4.3.2.1 Сигнал появления дуги, параметр: номер дуги и В массиве Ь ищется описание е с идентификатором дуги (I, ¡).
Если такого описания нет, то в массив L вставляется описание е = (l,i,e,0), l:=l+l.
К(е) ^е, то г(е):=г(е)+2 иК(е):=е. В любом случае по дуге i посылается сообщение (I,i,l,L).
4.3.2.2 Сигнал исчезновения дуги, параметр: номер дуги i.
В массиве L ищется описание дуги е с идентификатором дуги (I, i).
r(e):=r(e)+2 яК(е):=е.
4.3.2.3 Сигнал освобождения дуги, параметр: номер дуги i.
По дуге i посылается сообщение (I,i,l,L).
4.3.2.4 Сообщение
Просматривается массив L~ описаний дуг в принятом сообщении. Для каждого e~=L~(j~), где j~=l.T-l выполняются следующие действия.
1. В массиве L ищется описание дуги е с тем же идентификатором дуги, что в е~. Если такого описания нет, то в массив L вставляется описание е . 1:=1+1.
Далее п.2, п.З, п.4 или п.5 в зависимости от условий этих пунктов.
2. Дуга е - это петля, по которой пришло сообщение, т.е. идентификатор дуги в е равен (Г,Г) и Г=1.
Если K(e)?í, то г(е):=г(е)+2 и К(е):=1.
3. Дуга е - не петля (т.е. / W) и это дуга, по которой пришло сообщение, т.е. идентификатор дуги в е равен (Г,Г).
Если г(е~)>г(е) и К(е~)=1, то г(е):=г(е~) и К(е):=1. Если г(е~)>г(е) и K(e~)?í, то r(e):=r(e~) +1 и К(е):=1.
4. Дуга е - не петля (т.е. / #/). это не дуга, по которой пришло сообщение, т.е. идентификатор дуги в е не равен (Г,Г), и это выходящая дуга (N(e)=I). Если г(е~)>г(е), то г(е):=г(е~)+1 иК(е):=К(е~).
5. Дуга е - не петля (т.е. / #/). это не дуга, по которой пришло сообщение, т.е. идентификатор дуги в е не равен (Г,Г), и это не выходящая дуга (N(e)?$).
Если г(е~) > г(е), то г(е):=г(е~), К(е):=К(е~). 5. Оценка времени и памяти 5.1 Время работы алгоритма
Пусть выбрана дуга р и некоторый момент времени t0, который будем называть началом отсчёта. Мы будем рассматривать распространение по
графу информации о дуге р после момента времени /0. До первого появления дуги р во всех вершинах отсутствует описание дуги р. Такое «отсутствие описания» распространять не требуется, поэтому можно считать, что /0 -момент времени после первого появления дуги р, включая обработку автоматом сигнала появления дуги. Текущий момент времени обозначим через / > 1„.
Начало дуги р обозначим через а, а её текущий конец (конец в момент времени /) - через Ъ. Если дуги нет, будем считать, что Ъ=е. Через В обозначим множество концов, которые дуга р имела в интервале времени [Ы], включая <<;. если дуга р исчезала в этом интервале времени. Заметим, что множество В может только расти, за исключением случая выбора другого начала отсчёта.
Обозначим: V - множество идентификаторов вершин, Е - множество идентификаторов дуг графа.
Для краткости ранг дуги р в её описании в вершине х будем называть рангом в вершине х и обозначать гх. Если такое описание отсутствует, то будем считать, что гх = -1. Рангом на дуге ц будем называть ранг дуги р в её описании в сообщении, которое передаётся или (если сейчас по дуге сообщение не передаётся) последний раз передавалось по дуге д, и обозначать гч. Если по дуге д ещё не передавалось ни одного сообщения или ни в одном сообщении не было описания дуги р, то будем считать, что гч = -1. Просто рангом будем называть ранг в вершине или ранг на дуге. Максимальным рангом будем называть такой ранг, что во всех вершинах и на всех дугах ранг не больше. Идентификатор конца дуги р в её описании в вершине х будем называть концом в вершине х, и обозначать Кх. Если такое описание отсутствует, то будем считать, что Кх не определено. Концом на дуге ц будем называть идентификатор конца дуги р в её описании в сообщении, которое передаётся или (если сейчас по дуге сообщение не передаётся) последний раз передавалось по дуге д, и обозначать Кч. Если по дуге д ещё не передавалось ни одного сообщения или ни в одном сообщении не было описания дуги р, то будем считать, что Кч не определено. Просто концом будем называть конец в вершине или на дуге. Будем говорить, что конец К2 правильный, если К- еИ. иначе конец К2 - неправильный.
Состояние графа относительно выбранной дуги р в текущий момент времени I полностью описывается величинами V, /•.'. а, и,. Ь. В, К.. гг, где геУиЕ. При этом V, /•.'. а не зависят от I. Для события, которое может произойти в момент времени / и изменить состояние графа, обозначим значения величин после события через, соответственно, Г0, Ъ\ В\ К'.. г\, где геУиЕ. Также обозначим: г = га, г' = г\, К = Ка, К" = К\.
Из правил изменения дуг и описания алгоритма следует следующий перечень событий, меняющих состояние графа. Некоторые из этих событий являются последовательностью «микрособытий», приводящих к обработке автоматом
входного символа: сигнала или принимаемого сообщения. Например, повторное появление дуги р - это последовательность следующих «микрособытий»: исчезновение дуги, выработка сигнала исчезновения дуги и постановка его в очередь входных символов автомата, появление дуги, выработка сигнала появления дуги и замещение им в очереди входных символов автомата находящегося там сигнала исчезновения, обработка автоматом сигнала появления. Важно отметить, что в любом случае событие происходит в течение времени, сравнимого с временем срабатывания автомата, которым мы пренебрегаем; иными словами, мы можем считать, что событие происходит «мгновенно». Мы рассматриваем состояние графа между событиями, но не «внутри события», то есть не между «микрособытиями» внутри одного события. В перечне событий мы указываем для каждого события только те значения величин, определяющих состояние графа, которые меняются.
1. Смена начала отсчёта - выбор текущего момента времени как начала отсчёта.
2. Появление дуги р с концом х#<<;. включая обработку автоматом сигнала появления. Если в начале отсчёта и, дуги р не было, то ееВ, следовательно, ееВ\ Если в начале отсчёта 1„ дуга р была, то это повторное появление дуги, перед которым должно было быть исчезновение дуги после начала отсчёта, даже если сигнал исчезновения замещался в очереди входных символов автомата сигналом появления, и поэтому тоже ееВ\
Ь*=х, В"=Ви{е,х}. Если К^е, то г'=г+2 и К"=е. В любом случае К\=К\ г\=г\
3. Исчезновение дуги р, если сигнал исчезновения не замещается последующим сигналом появления, включая обработку автоматом сигнала исчезновения.
У=е, В*=Ви{е}, г' г 2. Г=е.
4. Смена конца дуги р на конец х^е. У=х,В^=Ви{х}.
5. аЬ-событие - поступление сообщения по дуге р в её конец Ь. когда Ь = а (дуга р является петлёй) и К ^ а, включая срабатывание автомата по приёму этого сообщения. Заметим, что сначала автомат принимает сообщение, приходящее по дуге-петле, и только после этого вырабатывается сигнал освобождения. Заметим, что если К = а, то состояние графа не меняется.
г' г 2. КУ=а.
6. b-событие - поступление сообщения по дуге р в её конец h #<<;. когда а т^Ь (дуга р не является петлёй), включая срабатывание автомата по приёму этого сообщения.
Если гр >гъ и Кр=Ь, то г\=гр и К\=Ь. Если гр >гъ и КртЬ, то г\=гр+1 и К\=Ь.
7. а-событие - поступление сообщения по дуге q^p в вершину а, когда rq > г, включая срабатывание автомата по приёму этого сообщения. Заметим, что если rq < г, то состояние графа не меняется.
г '=rq+l и r=Kq.
8. Приём - поступление сообщения по дуге q^p в вершину х когда rq > r v. включая срабатывание автомата по приёму этого сообщения. Заметим, что если rq < rv. то состояние графа не меняется.
^ X Vq? К х K-q.
9. Посылка - освобождение дуги q или появление дуги q ^р, имеющей начало в х, включая срабатывание автомату по сигналу освобождения или появления дуги, соответственно.
г' =r Ks =К Определим следующие состояния графа: \.Ъ*е& 3zeVrz > r&Kz0B. 2.b^e& \fzeVuErz <r & К0В. 3(w). 3zeVrz >w & VzeVuE (rz >w =>KzeB). 4. Vz eVuE KzeB.
Состояние 3(w) определяется для некоторого ранга w. Понятно, что если w \г
и EtzeVrz >w\ то состояние 3(\г) является также состоянием 3(\г'). Состояние
4 является, на самом деле, подсостоянием состояния 3 (w), когда во всех
вершинах и на всех дугах ранг не меньше w.
Лемма 1. Ранг дуги в вершине не уменьшается: VxeVr\ >гх.
Доказательство. Непосредственно следует из описания событий.
Лемма доказана.
Лемма 2. Ранг на дуге не превосходит ранга в начале дуги.
Доказательство. Как видно из описания событий, ранг на дуге может
измениться только при посылке сообщения по этой дуге (события появление и
посылка), а в этот момент времени ранг на дуге равен рангу в начале дуги.
Поскольку по лемме 1 ранг в начале дуги не уменьшается, ранг на дуге не
превосходит ранга в начале дуги.
Лемма доказана.
Лемма 3.
1) Ранги г я гр чётны.
2) Любой ранг не превосходит ранга в вершине а плюс 1: Vz eVuE rz<r+l.
3) Если ранг совпадает с рангом вершины а, то концы также совпадают:
УгеУиЕ (г, = г Кг = К).
4) Если событие увеличивает ранг г >г, то г'=г+2 и после события ранг г' максимальный и имеется только в вершине а и, быть может, на дуге р. Доказательство. Будем вести доказательство индукцией по событиям. Как видно из описания алгоритма, после первого появления дуги р имеем: гр=г=0, Кр=К=е, а для г и г г. -1. следовательно, утверждения леммы верны. Пусть до события утверждения леммы верны. Утверждения 1 и 4 могли бы быть нарушены только в результате событий появление, исчезновение, аЬ-события или а-события, которые меняют г или гр. Утверждения 2 и 3 дополнительно могли бы быть нарушены в результате Ь-события, меняющего гъ или Кь.
Появление. Если К^е, то г' г 2. КУ=е. В любом случае КУр=К\ гУр=г\ По предположению шага индукции для утверждения 1 г четно, следовательно, г ' = г или г'=г+2 и г'р=г' тоже четны, поэтому утверждение 1 остаётся верным. По предположению шага индукции для утверждения 2 г. <г /. следовательно, для и имеем г\ = гг <г+1 <г'+1, а гУр=г\ поэтому утверждение 2 остаётся верным. Если К к. то г ';, г ". КУр=К\ а для гтр ранг и конец не меняются, поэтому утверждение 3 остаётся верным и, поскольку г =г, утверждение 4 тоже верно. Если К # е, то г'р=г*=г+2, КУр=К\ а для и для ранг не меняется. Поскольку по предположению шага индукции для утверждения 2 гг <г+1, ранг г' после события максимальный и имеется только в вершине а и на дуге р, поэтому утверждение 3 остаётся верным и утверждение 4 тоже верно.
Исчезновение. Имеем г '=г+2, ' <<;. По предположению шага индукции для утверждения 1 г чётно, следовательно, г г 2 тоже чётно, поэтому утверждение 1 остаётся верным. По предположению шага индукции для утверждения 2 гг <г+1, следовательно, для гт^а имеем г\ = гг <г+1< г+2 = г\ поэтому утверждение 2 остаётся верным. Ранг г" после события максимальный и имеется только в вершине а, поэтому утверждение 3 остаётся верным и утверждение 4 тоже верно.
аЬ-событие. Имеем г' г 2. КУ=а. По предположению шага индукции для утверждения 1 г чётно, следовательно, г г 2 тоже чётно, поэтому утверждение 1 остаётся верным. По предположению шага индукции для утверждения 2 гг <г+1, следовательно, для гт^а имеем г\ = гг <г+1< г+2 = г\ поэтому утверждение 2 остаётся верным. Ранг г" после события максимальный и имеется только в вершине а, поэтому утверждение 3 остаётся верным и утверждение 4 тоже верно.
а-событие (гч>г). Имеем гУ=г9+1 и КУ=К9. Поскольку по предположению шага индукции для утверждения 2 г9<г+1, имеем г9 = г+1 и г'=г+2. По предположению шага индукции для утверждения 1 г чётно, следовательно,
г'=г+2 тоже четно, поэтому утверждение 1 остаётся верным. Также по предположению шага индукции для утверждения 2 г2<г+1, следовательно, для г^а имеем г\ = гг <г+1< г+2 = г\ поэтому утверждение 2 остаётся верным. Ранг г' после события максимальный и имеется только в вершине а, поэтому утверждение 3 остаётся верным и утверждение 4 тоже верно. Ь-событие. 1) Если гр >гь и КР=Ь, то г\=гр и К\=Ъ. 2) Если гр >гь и КртЬ, то г\=гр+1 и К\=Ъ. Поскольку Ь-событие не меняет г и гр, утверждение 1 остаётся верным. По лемме 2 гр<г. Следовательно, поскольку г\<гр+1, имеем г\<г+1, и, поскольку г'=г, г\<гУ+1. По предположению шага индукции для утверждения 2 г2<г+1, и, поскольку для гтЬ гг:. имеем г\ <г+1=гУ+1. Поэтому утверждение 2 сохраняется. В случае 1 по предположению шага индукции для утверждения 3, если гр=г, то КР=К, а тогда г\=г и К\=Ь=КР=К. В случае 2 г\=гр+1 и, поскольку по предположению шага индукции для утверждения 1 гр и г чётны, г \ нечётно и, следовательно, г\^г=г\ Поскольку остальные ранги и концы не меняются, утверждение 3 верно. Поскольку Ь-событие не меняется ранг в вершине а, то утверждение 4 верно. Лемма доказана.
Лемма 4. Если дуги нет (Ь=е), то ранг г максимальный \/2 еУиЕ гг <г и К=е. Доказательство. Поскольку начало отсчёта /о - это момент времени после первого появления дуги р, отсутствие дуги р (между событиями, а не «внутри» одного события между «микрособытиями») возможно только в результате события исчезновение, при котором г '=г+2, К к. а остальные ранги и концы не меняются. Поскольку по лемме 3 (утверждение 2) г2<г+1, для г^а имеем г\ = гг <г \ Поэтому, учитывая, что К' к. утверждение леммы верно. Лемма доказана.
Лемма 5. Пусть в некоторый момент времени в некоторой вершине х ранг гх /. Тогда не более чем через 3(п-1) тактов в каждой вершине у ранг г, >/. Доказательство. Пусть в некоторый момент времени . I #0 - это множество вершин у, в которых дуга р имеет ранг г, >/. В каждый момент времени суграф, порождённый «долгоживущими» дугами, сильно связен, время существования «долгоживущей» дуги не меньше 1 такта, время пересылки по дуге не больше 1 такта, а временем срабатывания автомата мы пренебрегаем. Кроме того, в каяедой вершине при появлении или освобождении дуги по ней сразу посылается сообщение.
Докажем утверждение о расширении множества А: с момента времени tl, когда образуется множество. I #0 и. I '. не более чем через 3 такта множество А будет расширено.
Поскольку по лемме 1 ранг дуги р в вершине не может уменьшаться, множество А может только расширяться. В любой момент времени, в том числе в момент времени 1]+2, должна существовать «долгоживущая» дуга ц.
ведущая из вершины хеА «наружу», т.е. в вершину у0.1. В момент времени (]+2 по дуге г/ передаётся сообщение 5". Это сообщение отправлено из х не ранее момента времени (11+2)-1=11+1, поэтому в ранг дуги р не меньше /. Возможны два случая.
1) Сообщение дойдёт до вершины у. Тогда это произойдёт не позднее момента времени ((1+2)+1=(1+3. Следовательно, в этом случае не более чем через 3 такта после момента времени tl множество А будет расширено.
2) Сообщение не дойдёт до вершины у. Это означает, что дуга д изменится до того, как по ней до вершины у дойдёт сообщение 5". А тогда, поскольку г/ - «долгоживущая» дуга, по ней должно дойти до вершины у предыдущее сообщение 5". Поскольку сообщение отправлено из х не ранее момента времени (¡+1, сообщение принято в у не ранее этого же момента времени. Следовательно, сообщение отправлено из х не ранее момента времени !)-! поэтому в ранг дуги р не меньше ]. Следовательно, в этом случае не более чем через 1 такт после момента времени множество^ будет расширено.
При каяедом расширении множества А в него добавляется хотя бы одна вершина. Поскольку с самого начала множество А содержит хотя бы одну вершину, а общее число вершин равно п, получается, что число расширений множества А не более п-1. Таким образом, требуется не более чем 3(п-1) тактов, чтобы в каждой вершине у оказался ранг г , > /. Лемма доказана.
Лемма 6 (о состоянии 1). Граф находится в состоянии 1 не более 3(п-1) тактов. Доказательство. Пусть в момент времени I граф находится в состоянии 1, тогда в некоторой вершине гх > г. По лемме 5 в момент времени / <7Л <1+3(п-1) во всех вершинах ранг будет не меньше г+1, в том числе и в вершине а. Рассмотрим событие, в результате которого в вершине а ранг первый раз увеличивается, т.е. г ' > г. По лемме 3 (утверждение 4) г' г 2 и после события ранг г' максимальный и имеется только в вершине а и, быть может, на дуге р. Если дуга р не исчезла (/> # <<;) и К' & И'. то мы имеем состояние 2. Если дугар не исчезла (Ь" # е) и К* еВ \ то, поскольку по лемме 3 (утверждение 3) К*Р=К\ мы имеем состояние З(г '). Если дуга исчезла (/> = <<;). то ееВ\ по лемме 4 ранг г' максимальный и К к. а по лемме 3 (утверждение
3) для любого г, где г\ = г \ также К\ = е. Следовательно, для любого г, где г\ максимальный ранг, имеет место К\еВ\ поэтому мы имеем состояние З(г'). Таким образом, через время не более 3(п-1) тактов граф покинет состояние 1. Лемма доказана.
Лемма 7 (о состоянии 2). Граф находится в состоянии 2 не более 2 тактов, после чего переходит в состояние 3(>е) для некоторого ранга м>. Доказательство. Рассмотрим различные события.
1. Смена начала отсчёта: ВУ={Ь}.
Поскольку ЬеВ ив состоянии 2 К 01 1. имеем КУ=К£В \ Поскольку Ь Ь. а в состоянии 2 /> #<<;. имеем Л' #<<;. Поскольку ранги не меняются, граф остаётся в состоянии 2.
2. Появление дуги р с концом й'=х, ВУ=Ви{е,х}. Если Кт^е, то г'=г+2, КУ=е. В любом случае КУр=К\ гУр=г\
Покажем, что ранг г' максимальный после события. Действительно, если К=е, то ранги не меняются, кроме г ';, г'. и поэтому ранг г' максимальный по условию состояния 2. Если /\"#<<;. то по лемме 1 ранг г г и тогда по лемме 3 (утверждение 4) ранг г максимальный.
По лемме 3 (утверждение 3) везде, где ранг равен г\ конец равен К\ Также в любом случае К"=е, а, поскольку ееВ\ имеем К'еВ'. Следовательно, граф переходит в состояние З(г').
3. Исчезновение дугир: ЪУ=е,ВУ=Ви{е}, г' г 2. КУ=е.
Поскольку г >г, по лемме 3 (утверждение 4) ранг г' максимальный. По лемме 3 (утверждение 3) везде, где ранг равен г\ конец равен К\ Поскольку К' к и ееВ\ имеем К"еВ\ Следовательно, граф переходит в состояние З(г').
4. Смена конца дугир на конец Ь '=х, ВУ=Ви{х}.
Если К=х, то КеН'. Ранг г' максимальный по условию состояния 2. По лемме 3 (утверждение 3) везде, где ранг равен г \ конец равен К\ Поэтому граф переходит в состояние 3(г ).
Если АГуфс, то, поскольку в состоянии 2 К0В, имеем КУ=К£В\ Ранг г' максимальный по условию состояния 2, Ь х^к. Поэтому граф остаётся в состоянии 2.
5. аЬ-событие: г' г 2. КУ=а.
Поскольку, если дуга р петля, то аеВ=В\ имеем КУ еВ\ Поскольку г' г. по лемме 3 (утверждение 4) ранг г' максимальный. По лемме 3 (утверждение 3) везде, где ранг равен г \ конец равен К\ Следовательно, граф переходит в состояние 3(г ).
6. Ь-событие: если гр >гь и КР=Ь, то г\=гр и К\=Ъ, а если гр >гъ и КртЬ, то г\=гр+1 ъК\=Ь.
6.1. Если гр>гь и Кр=Ь, то ранг г остаётся максимальным согласно условию состояния 2. Поскольку в состоянии 2 К0В, и Ь-событие не меняется конец в вершине а, имеем КУ=К£В=В\ Поскольку Ь />. а в состоянии 2 Ь^е, имеем />' #<<;. Следовательно, граф остаётся в состоянии 2.
6.2. Если гр>гь и КртЬ, то, поскольку в состоянии 2 ранг г максимальный, возможны два случая: гр<г и гр=г.
6.2.1. В первом случае (гр<г) ранг г остаётся максимальным согласно условию состояния 2. Поскольку в состоянии 2 К0В, и Ъ-событие не меняет конец в вершине а, имеем КУ=К0В=В\ Поскольку />' Ь. а в состоянии 2 /> #<<;. имеем /> V/;. Следовательно, граф остаётся в состоянии 2.
6.2.2. Во втором случае {гр=г) имеем г\>г и, поскольку в состоянии 2 ранг г до события был максимальным, после события ранг г\ максимальный и имеется только в вершине Ь. Поскольку Ь"=ЬеВ=В\ а К\=Ъ, имеем К'не/Г. Следовательно, граф переходит в состояние 3 (г\).
7. а-событие (г9 > г): гУ=г9+1 и КУ=К9.
Условие гч> г противоречит условию максимальности ранга г в состоянии
2, поэтому это событие в состоянии 2 невозможно.
8. Приём сообщения: г\=г9, К\=К9.
Это событие, очевидно, сохраняет состояние 2.
9. Посылка сообщения: г\=гх, К\=КХ.
Это событие, очевидно, сохраняет состояние 2. Таким образом, мы показали, что любое событие либо оставляет граф в состоянии 2, либо переводит его в состояние 3(\г) для некоторого ранга м>, но не в состояние 1. Теперь покажем, что не более чем через 2 такта граф перейдёт в состояние 3(\г). Рассмотрим момент времени ь. когда граф переходит в состояние 2. Начиная с момента времени ь ранг г может измениться только после событий появление, исчезновение или после аЬ-события (а-событие невозможно в состоянии 2). Однако каждое из этих событий гарантированно переводит граф в состояние 3(\г). Поэтому достаточно рассмотреть случай, когда эти события не происходят. Тогда ранг г не меняется всё время, пока граф остаётся в состоянии 2. Из описания событий следует, что без изменения ранга г не меняется конец К. Также условие К0В не меняется, пока граф остаётся в состоянии 2. Поскольку в состоянии 2 дуга р есть (Ь # <<;). в момент времени ь по дуге р передаётся сообщение, которое, возможно, было послано ещё до момента времени ь. Поскольку дуга р не появляется и не исчезает, через время не более 1 такта это сообщение гарантированно будет принято в конце дуги р, после чего по этой дуге будет послано второе сообщение. Это второе сообщение будет послано тогда, когда граф находится в состоянии 2, поэтому в этот момент времени будет Кр=К0В и гр=г. Поскольку дуга р не появляется и не исчезает, это второе сообщение также гарантированно будет принято в конце дуги р через время не более 1 такта, причём, поскольку г и К не меняются и не меняется условие К0В, будет Кр0В и гр=г. Поскольку в момент приёма сообщения в вершине Ь имеет место ЪеВ, имеем КртЬ. Поскольку в состоянии 2 ранг г максимальный и поскольку гр=г, имеем гр >гъ. А тогда, как показано выше для
Ь-события (6.2.2), граф переходит в состояние 3Итак, мы показали, что через время не более 2 тактов граф переходит из состояния 2 в состояние 3(>е). Лемма доказана.
Лемма 8 (о состоянии 3). Если не меняется начало отсчёта, то граф находится в состоянии 3(>е) для любого заданного м> не более Зп-2 тактов, после чего переходит в подсостояние 4, из которого уже не выходит. Смена начала отсчёта переводит состояние З(и') в состояние 1, 2 или 3(\г'). Доказательство. Рассмотрим различные события.
1. Смена начала отсчёта: ВУ={Ь}.
Если Ь=ё, то по лемме 4 ранг г максимальный и К=е=Ъ еВ\ По лемме 3 (утверждение 3) везде, где ранг равен г, конец равен К. Тогда, поскольку Ь г =г, КУ=К и для любого г К\=К2, граф переходит в состоянии 3(г). Если /> #<<;. то возможны четыре случая:
1) Ранг г максимальный и КтЬ.
Тогда К 0 В \ Граф переходит в состояние 2.
2) Ранг г максимальный и К=Ь.
Тогда К е В \ По лемме 3 (утверждение 3) для всех г таких, что гг=г, имеет место К~ К. Граф переходит в состоянии 3(г).
3) Максимальный ранг гтах > г, для некоторого г, где гг = гтах, Тогда К2 0 В \ Граф переходит в состояние 1.
4) Максимальный ранг гтах > г, для каждого г, где гг = гтах, К2 = Ь. Тогда 0 В\ Граф переходит в состояние 3(гтах).
Поскольку для любого другого события 5с£Г, нам достаточно показать, что если меняются ранг гили конец то конец становится
правильнымК\ 0В\
2. Появление дуги р с концом й'=х, ВУ=Ви{е,х}. Если Кт^е, то г'=г+2, КУ=е. В любом случае К*Р=К\ г\=г\
Поскольку К,р=К,=£ и ееВ\ граф остаётся в состоянии 3(\г).
3. Исчезновение дугир: ЪУ=е,ВУ=Ви{е}, г' г 2. КУ=е. Поскольку К' к и ееВ \ граф остаётся в состоянии 3(\г).
4. Смена конца дугир на конец х: Ь '=х, ВУ=Ви{х}. Граф остаётся в состоянии 3(\г).
5. аЬ-событие: г' г 2. КУ=а.
Поскольку К' а и для петли а еВ=В'. граф остаётся в состоянии 3(\г).
6. Ь-событие: если гр >гь и КР=Ь, то г\=гр и К\=Ъ, а если гр >гъ и КртЬ, то г\=гр+1 кК\=Ь.
Поскольку К\=Ъ и Ь еВ=В\ граф остаётся в состоянии 3(\г).
7. а-событие (гч > г): гУ=г9+1 иКУ=К9.
Если гч>г, то, поскольку по лемме 3 (утверждение 2) гд<г+1, имеем гд = г+1, следовательно, по лемме 3 (утверждение 2) гч максимальный ранг. А тогда в состоянии З(и') КчеВ, что влечёт КУ=К9еВ=В\ Поэтому граф остаётся в состоянии 3(>е).
8. Приём сообщения: г\=гд, К\=КЦ.
Это событие, очевидно, сохраняет состояние 3(>е).
9. Посылка сообщения: г\=гх, К\=КХ.
Это событие, очевидно, сохраняет состояние 3(>е). Таким образом, мы показали, что любое событие, кроме смены начала отсчёта, оставляет граф в состоянии 3(>е) без изменения ранга м>. Теперь покажем, что не более чем через Зп-2 тактов граф перейдёт в подсостояние 4. По лемме 2 не более чем через 3(п-1) тактов во всех вершинах будет ранг не менее м>. А тогда ещё не более чем через 1 такт на каждой дуге тоже будет ранг не менее м>. Для состояния З(и') это как раз и означает переход в подсостояние 4 через 3(п-1)+1=Зп-2 тактов. Лемма доказана.
Теорема 1. Через время не более бп-3 тактов в каждой вершине и на каждой дуге г будет КгеВ, т.е. Т0 =0(п).
Доказательство. Состояние 4 - это подсостояние 3(\г). когда в каждой вершине и на каждой дуге ранг не меньше м>. В этом случае как раз будет выполнено условие К2еВ. Поэтому нам надо показать, во-первых, что при любом выборе начала отсчёта граф окажется в одном из состояний 1, 2 или 3(\г). и, во-вторых, что после этого через время не более 4п-1 тактов он окажется в состоянии 4.
Если и, - момент времени непосредственно после обработки автоматом сигнала первого появления дуги р, то имеем: гр=г=0, Кр=К=е, а для г и г г- -/. что соответствует состоянию 2. По леммам 6, 7, 8 (о состояниях 1, 2, 3) выбор другого начало отсчёта переводит в одно из состояний 1, 2 или 3(\г) для некоторого ранга
По лемме 6 (о состоянии 1) в состоянии 1 граф находится не более 3(п-1) тактов. По лемме 7 (о состоянии 2) в состоянии 2 граф находит не более 2 тактов, после чего переходит в состояние 3(\г) для некоторого ранга м>. По лемме 8 (о состоянии 3) в состоянии 3(\г) граф находит не более Зп-2 тактов, после чего переходит в подсостояние 4, из которого уже не выходит, если не меняется начало отсчёта. Следовательно, через время не более 3(п-1)+2+Зп-2=6п-3 из любого состояния граф переходит в состояние 4. Теорема доказана.
Теорема 2. После прекращения изменений в графе полная информация о графе будет собрана в каждой его вершине через время не более 4Б+3 тактов, т.е. ТгОф).
Доказательство. После прекращения изменений графа порядок верхней границы времени распространения информации о дуге снижается с и до О. Действительно, рассмотрим множество вершин А из доказательства леммы 5, содержащее вершины, в которых ранг не меньше].
Поскольку дуги больше не меняются, модифицируется утверждение о расширении в доказательстве леммы 5: с момента времени tl, когда образуется множество А #0 и А '. множество А будет расширено не более чем через 2 такта (а не 3 такта).
Действительно, в любой момент времени, в том числе в момент времени (¡+1, должна существовать «долгоживущая» дуга ц. ведущая из вершины хеА «наружу», т.е. в вершину у&А. В момент времени / по дуге q передаётся сообщение 5". Это сообщение отправлено из х не ранее момента времени поэтому в ранг дуги р не меньше /. Поскольку после момента времени tl дуги не меняются, сообщение дойдёт до вершины у. Тогда это произойдёт не позднее момента времени Следовательно, не
более чем через 2 такта после момента времени множество А будет расширено.
Пусть . I „7^0 - это множество А с самого начала. Для каждой вершины х0Ао выберем входящую дугу, по которой в эту вершину первый раз пришло сообщение с рангом не меньше ]. Выбранные дуги, очевидно, образуют лес деревьев, ориентированных от своих корней, которыми являются вершины из множества А 0. Этот лес деревьев содержит все вершины. Поскольку дуги не меняются, с момента времени, когда в некоторой вершине х ранг становится не меньше _/, по всем выбранным дугам, выходящим из данной вершины х, пройдут сообщения с рангом не меньше ] за время не более 2 тактов, согласно модифицированному утверждению о расширении. А это означает, что сообщения с рангом не меньше ] пройдут по всем выбранным дугам за время не более чем 2Ь тактов, где Ь - максимальная длина маршрута из выбранных дуг. Поскольку выбранные дуги образуют лес деревьев, Ь<0. Следовательно, изменяется оценка времени в лемме 5: вместо 3(п-1) будет 2!) тактов. Соответственно, изменяются оценки в леммах 6 (о состоянии 1) и в лемме 8 (о состоянии 3): вместо 3(п-1) и Зп-2 будет 2!) и 2!) I. Поэтому максимальное время работы алгоритма уменьшается с 3(п-1)+2+Зп-2=6п-3 тактов до 20+2+20+1=40+3 тактов. Теорема доказана.
Заметим, что в доказательстве теоремы 2 не использовано ограничение на время существования дуги: до того, как прекращаются изменения в графе, время существования дуг может быть произвольным. Также до прекращения изменений граф может быть не сильно связным, и сильная связность графа требуется только после прекращения его изменений.
5.2 Размер сообщения
Сообщение содержит идентификатор вершины Г, номер дуги Г от 1 до s, длину Г массива описаний дуг и массив L~[0..Г-1] описаний дуг. Обозначим через sizeojl размер (в битах) памяти, требуемой для хранения идентификатора вершины. Поскольку разные вершины имеют разные идентификаторы, а число вершин равно п. имеем sizeojl > log2n. Нижняя оценка достигается, если вершины просто нумеруются от 0 до п-1. Номер дуги имеет размер log2(s+l), поскольку дуги нумеруются от 1 до s. Как следует из описания алгоритма, каждое изменение дуги приводит к увеличению ранга этой дуги не более чем на 2 (события появление, исчезновение, ab-событие или b-событие плюс а-событие). Обозначим через v (от variation) максимальное число изменений одной дуги. Тогда для данной дуги максимальный ранг не более 2v, поэтому для ранга достаточно log22v бит памяти. Длина Г массива не превосходит числа дуг т.
Итого: размер сообщения sizeof7+ log2(s+l)+ log2m + m(2sizeofl+ log2(s+l) + log22v) = 0(m(sizeofl+lgs)) + O(mlgv) бит. Поскольку s<m, это равно 0(m(sizeofl+lgm)) + O(mlgv). Если идентификатор вершины - это просто её номер от 0 до п, то, учитывая, что имеем 0(m(lgn+lgm)) + 0(mlgv) = Ofmlgm) + O(mlgv). Второе слагаемое - это память для хранения рангов, размер которой зависит от числа изменений дуги.
5.3 Память вершины (автомата в вершине)
Для хранения управляющего состояния (начальное или рабочее) достаточно 1 бита. Идентификатор вершины занимает sizeojl бит. Суммарно имеем размер памяти автомата в вершине:
l+sizeofl+ log2m + m(2sizeofl+ log2(s+l)+ log22v) = = 0(m(sizeofl+lgs)) + O(mlgv) бит.
Поскольку s<m, это равно 0(m(sizeofI+lgm)) + O(mlgv). Если идентификатор вершины - это просто её номер от 0 до п, то, учитывая, что п<т. имеем 0(m(lgn+lgm)) + 0(mlgv)= Ofmlgm) + O(mlgv). Заметим, что память, необходимая для хранения полного описания графа, - это первое из двух слагаемых суммы. Второе слагаемое - это память для хранения рангов, размер которой зависит от числа изменений дуги.
5.4. Модификация алгоритма для уменьшения размера памяти
Как показано выше, размер сообщения и памяти вершины зависит от числа изменений дуги. От этой зависимости можно избавиться, если использовать либо дополнительное предположение об изменениях дуг, либо дополнительную возможность для автомата.
Дополнительное предположение: все дуги долгоживущие. В этом случае каждая дуга меняется не чаще 1 раза в такт. Следовательно, за время работы алгоритма максимум бп-3 тактов дуга меняется не более бп-3 раз. Поскольку каждое изменение дуги увеличивает ранг не более чем на 2, можно сделать ранг циклическим с максимальным значением 2(бп-3). Тогда размер сообщения и размер памяти вершины равен (){т{.\1гео/1 + 0(т1'^у) =
0(т(А12ео/1+^т)) + 0(т^п) или, поскольку 0(т(ь12ео/1+^т)). Дополнительная возможность: временные сигналы для автомата. Пусть имеется таймер, посылающий автомату каждый такт специальный временной сигнал. Все те действия, которые автомат выполнял при обработке сигнала освобождения или появления дуги, теперь он будет выполнять при обработке временного сигнала. Это значит, что сообщения будут посылаться по дугам не при их освобождении или появлении, а, вообще говоря, позже - при обработке следующего за освобождением или появлением дуги временного сигнала. Тем самым, сообщения по дугам будут посылаться не чаще, чем раз в такт. Правда, в этом случае придётся предположить, что время существования «долгоживущих» дуг ограничено снизу не 1, а 2 тактами. Действительно, в противном случае может оказаться, что каждый раз при появлении дуги сообщение посылается по ней не сразу, а спустя какое-то время (до получения временного сигнала), из-за чего сообщение не успевает передаться по дуге до её изменения.
В общем случае рассмотрим г, - интервал между сигналами времени, т2 -максимальное время передачи сообщения по дуге, т3 - минимальное время жизни долгоживущей дуги. Тогда нужно, чтобы выполнялось следующее соотношение т1 + т2< т3.
В этом случае максимальное время пребывания графа в состоянии 2 будет не 2 такта, а 2т2+т}. В доказательстве леммы 5 время расширения множества .1 меняется с 3 на Зт2 2т¡. Соответственно, оценка времени в лемме 5 меняется с 3(п-1) на (Зт2+2т1)(п-1), время пребывания графа в состоянии 1 меняется с 3(п-1) на (Зт2+2т1)(п-1), время пребывания графа в состоянии 3 меняется с Зп-2 на (Зт2+2т1)(п-1)+(т2+т1). Эти утверждения легко доказываются, но эти доказательства мы опускаем.
Итак, максимальное время работы алгоритма, включая время «притормаживания» в ожидании временного сигнала, останется тем же по порядку, что и в теореме 1, Т0 = (Зт2+2т1)(п-1) + 2т2+т) + (.Зт2+2т1)(п-1) + (т2+т]) = (6т2+4т1)(п-1) + зт2+2т1 = (Зт2+2т,)(2п-1) = 0(п). Ранг станет циклическим и будет занимать память О(^п) бит. Соответственно, размер сообщения и памяти вершины равен 0(т(51геоА+^т)) + О(т^п) или, поскольку 0(т(ь12ео/1+^т)).
Соответственно, модифицируется утверждение теоремы 2: Т, (2т2 т,)1) +
2т2+г1 + (2т2+т,)0 + (т2+т,) = (4т2+2т])0 + Зт2+2тг = 0(0).
Список литературы
[1]. StevenS. Skiena. The Algorithm Design Manual. Springer-Verlag, New York, 1997.
[2]. И.Б. Бурдонов, А.С. Косачев, B.B. Кулямин. Неизбыточные алгоритмы обхода ориентированных графов. Детерминированный случай. Программирование, 2003 г., №5, с. 59-69.
[3]. И.Б. Бурдонов, А.С. Косачев, В.В. Кулямин. Неизбыточные алгоритмы обхода ориентированных графов. Недетерминированный случай. Программирование, 2004 г., №1, с. 2-17.
[4]. М.О. Rabin. Maze Threading Automata. An unpublished lecture presented at MIT and UC. Berkeley, 1967.
[5]. И.Б. Бурдонов. Обход неизвестного ориентированного графа конечным роботом. Программирование, 2004 г., № 4, с. 11-34.
[6]. И.Б. Бурдонов. Проблема отката по дереву при обходе неизвестного ориентированного графа конечным роботом. Программирование, 2004 г., № 6, с. 6-29.
[7]. И. Бурдонов, А. Косачев, В. Кулямин. Параллельные вычисления на графе. Программирование, 2015, №1,с. 3-20.
Труды ИСП РАН, том 27, вып. 1, 2015 г..
Monitoring of dynamically changed graph
Igor Burdonov <[email protected]> Alexander Kossatchev <[email protected]> Institute for System Programming of the Russian Academy of Sciences, 25, Alexander Solzhenitsyn st., Moscow, 109004, Russia.
Abstract. Monitoring of oriented graphs is a key task in many applications. Such monitoring is very specific when the graph models a communication network including Internet and GRID. A node of the network has local information about the network: if "knows" only about the arcs outgoing from this node, but does not "know" where (to which nodes) these arcs go. The nodes of the network exchange messages through the network links represented as arcs of the graph and act as message transfer channels. The graph monitoring is based on its traversal when message passes each arc in the graph. While there is an untraversed arc, we cannot be certain that it goes to still unmonitored part of the graph. Usually, the graph traversal is performed with a single message circulating in the network. Traversal can be done faster if performed in parallel: multiple messages simultaneously circulate in the network. In this paper we consider the parallel monitoring of a graph aimed at not just the graph traversal, but also collection of complete information about the graph in each its node. Another feature of this work is monitoring of a dynamically changing graph: its arcs can disappear, appear or change their destination nodes. An algorithm is proposed, which provides the collection of full information on the graph in each its node.
Keywords: directed graphs; graph exploration, graph traversal, communicating automata, parallel processing, dynamically changed graphs.
References
[1]. StevenS. Skiena. The Algorithm Design Manual. Springer-Verlag, New York, 1997.
[2]. I. B. Burdonov, A. S. Kossatchev, V. V. Kuliamin. Irredundant Algorithms for Traversing Directed Graphs: The Deterministic Case. Programming and Computer Software, 29(5):245-258, 2003.
[3]. I. B. Burdonov, A. S. Kossatchev, V. V. Kuliamin. Irredundant Algorithms for Traversing Directed Graphs: The Nondeterministic Case. Programming and Computer Software, 30(1):2-17, 2004.
[4]. M.O. Rabin. Maze Threading Automata. An unpublished lecture presented at MIT and UC. Berkeley, 1967.
[5]. I. B. Burdonov. Traversal of an unknown directed graph by a finite automaton. Programming and Computer Software, 30(4): 11-34, 2004.
[6]. I. B. Burdonov. Backtracking on a tree in traversal of an unknown directed graph by a finite automaton. Programming and Computer Software, 30(6): 6-29, 2004.
[7]. I. B. Burdonov, A. S. Kossatchev, V. V. Kuliamin. Parallel computations on graphs. Programming and computer Software, 41(1): 1-13, 2015.