на тему рефераты
 
Главная | Карта сайта
на тему рефераты
РАЗДЕЛЫ

на тему рефераты
ПАРТНЕРЫ

на тему рефераты
АЛФАВИТ
... А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я

на тему рефераты
ПОИСК
Введите фамилию автора:


Реферат: Распределенные алгоритмы


Клику можно обойти путем последовательного опроса; алгоритм очень похож на Алгоритм 6.6, но за один раз опрашивается только один сосед инициатора. Только когда получен ответ от одного соседа, опрашивается следующий; см. Алгоритм 6.10.

var    recp        : integer      init  0 ; (* только для инициатора *)

Для инициатора:

          (* обозначим Neighp = {q1, q2, .., qN-1} *)

          begin   while  recp < # Neighp  do

                               begin  send <tok>  to qrecp+1 ;

                                        receive <tok>;  recp := recp + 1

                               end ;

                     decide

          end

Для не-инициатора:

          begin  receive <tok>  from q ;  send <tok>  to q  end

Алгоритм 6.10 Последовательный алгоритм опроса.

Теорема 6.26  Последовательный алгоритм опроса (Алгоритм 6.10) является алгоритмом 2x-обхода для клик.

Доказательство.  Легко заметить, что к тому времени, когда алгоритм завершается, каждый процесс послал инициатору ответ. (2x-1)-е сообщение - это опрос для qx, а (2x)-е - это его ответ. Следовательно, когда было передано 2x сообщений, был посещен x+1 процесс p, q1, ..., qx.

6.3.2  Обход торов

Тором n´n называется граф G = (V,E), где

            V = Zn ´ Zn = { (i, j) : 0 £ i, j < n}  и

            E = {(i, j)(i¢, j¢) : (i = i¢  &  j = j¢ ±1) Ú (i = i¢ ±1  &  j = j¢) };

см. Раздел B.2.4. (Сложение и вычитание здесь по модулю n.) Предполагается, что тор обладает чувством направления (см. Раздел B.3), т.е. в вершине (i, j) канал к (i, j+1) имеет метку Up, канал к (i, j-1) - метку Down, канал к (i+1, j) - метку Right, и канал к (i-1, j) - метку Left. Координатная пара (i, j) удобна для определения топологии сети и ее чувства направления, но мы предполагаем, что процессы не знают этих координат; топологическое знание ограничено метками каналов.

Для инициатора (выполняется один раз):

          send <num, 1>  to Up

Для каждого процесса при получении маркера <num,k>:

          begin   if  k=n2  then  decide

                     else  if n|k then  send <num,k+1> to Up

                                      else send <num,k+1> to Right

          end

Алгоритм 6.11 Алгоритм обхода для торов.

Тор является Гамильтоновым графом, т.е. в торе (произвольного размера) существует Гамильтонов цикл и маркер передается по циклу с использованием Алгоритма 6.11. После k-го перехода маркера он пересылается вверх, если n|k (k делится на n), иначе он передается направо.

Теорема 6.27  Алгоритм для тора (Алгоритм 6.11) является алгоритмом x-обхода для торов.

Доказательство. Как легко заметить из алгоритма, решение принимается после того, как маркер был передан n2 раз. Если маркер переходит от процесса p к процессу q с помощью U переходов вверх и R переходов вправо, то p = q тогда и только тогда, когда (n|U & n|R). Обозначим через p0 инициатор, а через pk - процесс, который получает маркер <num, k>.

Из n2 переходов маркера n - переходы вверх, а оставшиеся n2-n - переходы вправо. Т.к. и n, и n2-n кратны n, то pn2 = p0, следовательно, алгоритм завершается в инициаторе.

Далее будет показано, что все процессы с p0 по pn2 -1 различны; т.к. всего n2 процессов, то  отсюда следует, что каждый процесс был пройден. Предположим, что pa = pb для 0 £ a < b < n2. Между pa и pb маркер сделал несколько переходов вверх и вправо, и т.к. pa = pb, количество переходов кратно n. Изучив алгоритм, можно увидеть, что отсюда следует, что

# k : a £ k < b  &  n  кратно n, и

# k  кратно n.

Размеры двух множеств в сумме составляют b-a, откуда следует, что n|(b-a). Обозначим (b-a) = l*n, тогда множество {k: a £ k < b} содержит l кратных n. Отсюда следует, что n|l, а значит n2|(b-a), что приводит к противоречию.

Т.к. все процессы с p0 по pn2 -1 различны, после x переходов маркера будет посещен x+1 процесс.

6.3.3  Обход гиперкубов

N-мерным гиперкубом называется граф G = (V,E), где

            V = { (b0,...,bn-1) : bi = 0, 1} и

            E = { (b0,...,bn-1),(c0,...,cn-1) : b и c отличаются на 1 бит};

см. Подраздел B.2.5. Предполагается, что гиперкуб обладает чувством направления (см. Раздел B.3), т.е. канал между вершинами b и c, где b и c различаются битом с номером i,  помечается «i» в обеих вершинах. Предполагается, что метки вершин не известны процессам; их топологическое знание ограничено метками каналов.

Как и тор, гиперкуб является Гамильтоновым графом, и Гамильтонов цикл обходится с использованием Алгоритма 6.12. Доказательство корректности алгоритма похоже на доказательство для Алгоритма 6.11.

Для инициатора (выполняется один раз):

          send <num, 1>  по каналу  n -1

Для каждого процесса при получении маркера <num,k>:

          begin   if  k=2n  then  decide

                     else  begin  пусть l - наибольший номер : 2l|k ;

                                        send <num,k+1>  по каналу l

                               end                      

          end

Алгоритм 6.12 Алгоритм обхода для гиперкубов.

Теорема 6.28  Алгоритм для гиперкуба (Алгоритм 6.12) является алгоритмом x-обхода для гиперкуба.

Доказательство.  Из алгоритма видно, что решение принимается после 2n пересылок маркера. Пусть p0 - инициатор, а pk - процесс, который получает маркер <num,k>. Для любого k < 2n, обозначения pk и pk+1 отличаются на 1 бит, индекс которого обозначим как l(k), удовлетворяющий следующему условию:

Т.к. для любого i < n существует равное количество k Î {0, ..., 2n} с l(k) = i, то p0 = p2n и решение принимается в инициаторе. Аналогично доказательству Теоремы 6.27, можно показать, что из pa = pb следует, что 2n|(b-a), откуда следует, что все p0, ..., p2n-1 различны.

Из всего этого следует, что, когда происходит завершение, все процессы пройдены, и после x переходов маркера будет посещен x+1 процесс.

6.3.4  Обход связных сетей

Алгоритм обхода для произвольных связных сетей был дан Тарри в 1895 [Tarry; T1895]. Алгоритм сформулирован в следующих двух правилах; см. Алгоритм 6.13.

R1. Процесс никогда не передает маркер дважды по одному и тому же каналу.

R2. Не-инициатор передает маркер своему родителю (соседу, от которого он впервые получил маркер), только если невозможна передача по другим каналам, в соответствии с правилом R1.

var  usedp[q]      : boolean     init  false для всех q Î Neighp ;

                                             (* Признак того, отправил ли p сообщение q *)

       fatherp        : process     init udef ;

      

Для инициатора (выполняется один раз):

          begin   fatherp := p ;  выбор  q Î Neighp ;

                     usedp[q] := true ;  send <tok>  to q ;

          end

Для каждого процесса при получении <tok> от q0:

          begin   if  fatherp = udef  then  fatherp := q0 ;

                     if  "q Î Neighp : usedp[q]

                        then  decide

                        else  if  $q Î Neighp : (q ¹ fatherp  &  Øusedp[q])

                                    then  begin  выбор  q Î Neighp \ {fatherp}  с Øusedp[q] ;

                                                       usedp[q] := true ;  send <tok>  to q

                                             end

                                    else  begin  usedp[fatherp] := true ;

                                                      send <tok>  to fatherp

                                             end

          end

Алгоритм 6.13 Алгоритм обхода Тарри.

Теорема 6.29  Алгоритм Тарри (Алгоритм 6.13) является алгоритмом обхода.

Доказательство. Т.к. маркер передается не более одного раза в обоих направлениях через каждый канал, всего он передается не более 2|E| раз до завершения алгоритма. Т.к. каждый процесс передает маркер через каждый канал не более одного раза, то каждый процесс получает маркер через каждый канал не более одного раза. Каждый раз, когда маркер захватывается не-инициатором p, получается, что процесс p получил маркер на один раз больше, чем послал его. Отсюда следует, что количество каналов, инцидентных p, превышает количество каналов, использованных p, по крайней мере, на 1. Таким образом, p не принимает решение, а передает маркер дальше. Следовательно, решение принимается в инициаторе.

Далее, за 3 шага будет доказано, что когда алгоритм завершается, каждый процесс передал маркер.

(1) Все каналы, инцидентные инициатору, были пройдены один раз в обоих направлениях. Инициатором маркер был послан по всем каналам, иначе алгоритм не завершился бы. Инициатор получил маркер ровно столько же раз, сколько отправил его; т.к. инициатор получал маркер каждый раз через другой канал, то маркер пересылался через каждый канал по одному разу.

(2) Для каждого посещаемого процесса p все каналы, инцидентные p были пройдены один раз в каждом направлении. Предположив, что это не так, выберем в качестве p первый встретившийся процесс, для которого это не выполняется, и заметим, что из пункта (1) p не является инициатором. Из выбора p, все каналы, инцидентные fatherp были пройдены один раз в обоих направлениях, откуда следует, что p переслал маркер своему родителю. Следовательно, p использовал все инцидентные каналы, чтобы переслать маркер; но, т.к. маркер в конце остается в инициаторе, p получил маркер ровно столько же раз, сколько отправил его, т.е. p получил маркер по одному разу через каждый инцидентный канал. Мы пришли к противоречию.

(3) Все процессы были посещены и каждый канал был пройден по одному разу в обоих направлениях. Если есть непосещенные процессы, то существуют соседи p и q такие, что p был посещен, а q не был. Это противоречит тому, что все каналы p были пройдены в обоих направлениях. Следовательно, из пункта (2), все процессы были посещены и все каналы пройдены один раз в обоих направлениях.

Каждое вычисление алгоритма Тарри определяет остовное дерево сети, как показано в Лемме 6.3. В корне дерева находится инициатор, а каждый не-инициатор p в конце вычисления занес своего родителя в дереве в переменную fatherp. Желательно, чтобы каждый процесс также знал (в конце вычисления), какие из его соседей являются его сыновьями в дереве. Этого можно достигнуть, посылая родителю fatherp специальное сообщение.

6.4  Временная сложность: поиск в глубину

Процессы в алгоритме Тарри достаточно свободны в выборе соседа, которому передается маркер, в результате чего возникает большой класс остовных деревьев. В этом разделе будут обсуждаться алгоритмы, которые вычисляют остовные деревья с дополнительным свойством: каждое листовое ребро соединяет две вершины, одна из которых является предком другой. Листовое ребро - это ребро, не принадлежащее остовному дереву. В данном корневом остовном дереве T сети G для каждого p T[p] обозначает множество процессов в поддереве p, а A[p] обозначает предков p, т.е. вершины на пути в T от корня до p. Заметим, что q Î T[p] Û p Î A[q].

Определение 6.30  Остовное дерево T сети G называется деревом поиска в глубину, если для каждого листового ребра pq  q Î T[p] Ú q Î A[p].

Деревья поиска в глубину, или DFS-деревья (DFS - Depth-First Search), используются во многих алгоритмах на графах, таких как проверка планарности, проверка двусвязности, и для построения интервальных схем маркировки (см. Подраздел 4.4.2). В Разделе 6.4.1 будет показано, что незначительная модификация алгоритма Тарри (а именно, ограничение свободы выбора процессов) позволяет алгоритму вычислять деревья поиска в глубину. Получившийся алгоритм будем называть классическим алгоритмом поиска в глубину. В Подразделе 6.4.2 будут представлены два алгоритма, которые вычисляют деревья поиска в глубину за меньшее время, чем классический алгоритм. Понятие временной сложности распределенных алгоритмов будет определено ниже. В Подразделе 6.4.3 будет представлен алгоритм поиска в глубину для сетей с начальным знанием идентификации соседей. В этом случае Теорема 6.6 неприменима, и фактически может быть дан алгоритм, использующий только 2N-2 сообщений.

Временная сложность распределенных алгоритмов. Исключительно в целях анализа распределенных алгоритмов, будут сделаны некоторые идеализированные временные предположения. Корректность алгоритмов никак не зависит от этих предположений.

Определение 6.31  Временная сложность распределенного алгоритма - это максимальное время, требуемое на вычисление алгоритма при следующих предположениях:

T1. Процесс может выполнить любое конечное количество событий за нулевое время.

T2. Промежуток времени между отправлением и получением сообщения - не более одной единицы времени.

Временные сложности всех волновых алгоритмов этой главы изложены в Таблице 6.19. Проверка величин из этой таблицы, не доказанных в этой главе, оставлена читателю в качестве упражнения. Альтернативные определения временной сложности обсуждаются в Подразделе 6.5.3.

Лемма 6.32  Для алгоритмов обхода временная сложность равна сложности сообщений.

Доказательство. Сообщения пересылаются последовательно, и каждое может занять одну единицу времени.

6.4.1  Распределенный поиск в глубину

Классический алгоритм поиска в глубину получается, когда свобода выбора соседа для передачи маркера в алгоритме Тарри ограничивается следующим, третьим правилом; см. Алгоритм 6.14.

R3. Когда процесс получает маркер, он отправляет его обратно через тот же самый канал, если это позволяется правилами R1 и R2.

Теорема 6.33  Классический алгоритм поиска в глубину (Алгоритм 6.14) вычисляет остовное дерево поиска в глубину, используя 2|E| сообщений и 2|E| единиц времени.

Доказательство. Т.к. алгоритм реализует алгоритм Тарри, это алгоритм обхода и он вычисляет остовное дерево T. Уже было показано, что каждый канал передает два сообщения (по одному в обоих направлениях), что доказывает оценку сложности сообщений, а оценка для временной сложности следует из того, что 2|E| сообщений передаются одно за другим, причем каждое занимает не более одной единицы времени. Остается показать, что из правила R3 следует, что получающееся дерево - дерево поиска в глубину.

Во-первых, из R3 следует, что за первым проходом по листовому ребру немедленно следует второй, в обратном направлении. Пусть pq - листовое ребро и p первым использует ребро. Когда q получает маркер от p, q уже посещен (иначе q присвоит fatherq p и ребро не будет листовым) и usedp[q] = false (т.к. по предположению p первый из двух процессов использовал ребро). Следовательно, по правилу R3, q немедленно отправляет маркер обратно p.

Теперь можно показать, что если pq - листовое ребро, используемое сначала p, то q Î A[p]. Рассмотрим путь, пройденный маркером, пока он не был переслан через pq. Т.к. pq - листовое ребро, q был посещен до того, как маркер попал в q через это ребро:

                                                ..., q, ..., p, q

Получим из этого пути возможно более короткий путь, заменив все комбинации r1, r2, r1, где r1r2 - листовое ребро, на r1. Из предыдущих наблюдений, все листовые ребра теперь убраны, откуда следует, что получившийся путь - это путь в T, состоящий только из ребер, пройденных до первого прохождения pq. Если q не является предком p, то отсюда следует, что ребро от q до fatherq было пройдено до того, как было пройдено ребро qp, что противоречит правилу R2 алгоритма.

var  usedp[q]      : boolean     init  false для всех q Î Neighp ;

                                             (* Признак того, отправил ли p сообщение q *)

       fatherp        : process     init udef ;

      

Для инициатора (выполняется один раз):

          begin   fatherp := p ;  выбор  q Î Neighp ;

                     usedp[q] := true ;  send <tok>  to q ;

          end

Для каждого процесса при получении <tok> от q0:

          begin   if  fatherp = udef  then  fatherp := q0 ;

                     if  "q Î Neighp : usedp[q]

                        then  decide

                        else  if  $q Î Neighp : (q ¹ fatherp  &  Øusedp[q])

                                    then  begin  if  fatherp ¹ q0  &  Øusedp[q0]

                                                           then q := q0

                                                           else  выбор  q Î Neighp \ {fatherp} 

                                                                                            с Øusedp[q] ;

                                                       usedp[q] := true ;  send <tok>  to q

                                             end

                                    else  begin  usedp[fatherp] := true ;

                                                      send <tok>  to fatherp

                                             end

          end

Алгоритм 6.14 Классический алгоритм поиска в глубину.

Сложность сообщений классического распределенного поиска в глубину равна 2|E|, по Теореме 6.6 это наилучшая сложность (за исключением множителя 2), если идентификация соседей не известна изначально. Временная сложность также составляет 2|E|, что по Лемме 6.32, является наилучшей сложностью для алгоритмов обхода в этом случае. Распределенная версия поиска в глубину была впервые представлена Cheung [Che83].

В Подразделе 6.4.2 будут рассмотрены два алгоритма, которые строят дерево поиска в глубину в сети без знания идентификации соседей за O(N) единиц времени. Следовательно, эти алгоритмы не являются алгоритмами обхода. В Подразделе 6.4.3 знание о соседях будет использовано для получения алгоритма с временной сложностью и сложностью сообщений O(N).

6.4.2 Алгоритмы поиска в глубину за линейное время

Причина высокой временной сложности классического алгоритма поиска в глубину состоит в том, что все ребра, как принадлежащие дереву, так и листовые, обходятся последовательно. Сообщение-маркер <tok> проходит по всем листовым ребрам и немедленно возвращается обратно, как показано в доказательстве Теоремы 6.33. Все решения с меньшей временной сложностью основаны на том, что маркер проходит только по ребрам дерева. Очевидно, на это потребуется линейное время, т.к. существует только N-1 ребро дерева.

Решение Авербаха. В алгоритм включается механизм, который предотвращает передачу маркера через листовое ребро. В алгоритме Авербаха [Awerbuch; Awe85b] гарантируется, что каждый процесс в момент, когда он должен передать маркер, знает, какие из его соседей уже были пройдены. Затем процесс выбирает непройденного соседа, или, если такого не существует, посылает маркер своему родителю.

Когда процесс p впервые посещается маркером (для инициатора это происходит в начале алгоритма), p сообщает об этом всем соседям r, кроме его родителя, посылая сообщения <vis>. Передача маркера откладывается, пока p не получит сообщения <ack> от всех соседей. При этом гарантируется, что каждый сосед r процесса p в момент, когда p передает маркер, знает, что p был посещен. Когда позже маркер прибывает в r, r не передаст маркер p, если только p не его родитель; см. Алгоритм 6.15.

Из-за передачи сообщений <vis> в большинстве случаев usedp[fatherp] = true, даже если p еще не послал маркер своему родителю. Поэтому в алгоритме должно быть явно запрограммировано, что только инициатор может принимать решения; а не-инициатор p, для которого usedp[q] = true для всех соседей q, передает маркер своему родителю.

Теорема 6.34  Алгоритм Авербаха (Алгоритм 6.15) вычисляет дерево поиска в глубину за 4N-2 единиц времени и использует 4|E| сообщений.

Доказательство. По существу, маркер передается по тем же самым каналам, как и в Алгоритме 6.14, за исключением того, что пропускается передача по листовым каналам. Т.к. передача по листовым каналам не влияет на конечное значение fatherp для любого процесса p, то в результате всегда получается дерево, которое может получиться и в Алгоритме 6.14.

Маркер последовательно проходит дважды через каждый из N-1 каналов дерева, на что тратится 2N-2 единиц времени. В каждой вершине маркер простаивает перед тем, как быть переданным, не более одного раза из-за обмена сообщениями <vis>/<ack>, что приводит к задержке не более чем на 2 единицы времени в каждой вершине.

Каждое листовое ребро передает два сообщения <vis> и два сообщения <ack>. Каждое ребро в дереве передает два сообщения <tok>, одно <vis> (посылаемое от родителя потомку), и одно <ack> (от потомка родителю). Следовательно, передается 4|E| сообщений.

var  usedp[q]      : boolean     init  false для всех q Î Neighp ;

                                             (* Признак того, отправил ли p сообщение q *)

       fatherp        : process     init udef ;

      

Для инициатора (выполняется один раз):

          begin   fatherp := p ;  выбор  q Î Neighp ;

                     forall  r Î Neighp  do  send <vis>  to r ;

                     forall  r Î Neighp  do  receive <ack>  from r ;

                     usedp[q] := true ;  send <tok>  to q ;

          end

Для каждого процесса при получении <tok> от q0:

          begin   if  fatherp = udef  then 

                          begin  fatherp := q0 ;

                                      forall  r Î Neighp\ {fatherp}  do  send <vis>  to r ;

                                      forall  r Î Neighp\ {fatherp}  do  receive <ack>  from r ;

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42


на тему рефераты
НОВОСТИ на тему рефераты
на тему рефераты
ВХОД на тему рефераты
Логин:
Пароль:
регистрация
забыли пароль?

на тему рефераты    
на тему рефераты
ТЕГИ на тему рефераты

Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое.


Copyright © 2012 г.
При использовании материалов - ссылка на сайт обязательна.