Você está na página 1de 38

Trabalho Matemática Discreta

Teoria de Grafos

Nome : Waldir Escouto Pereira

Turma : 156

Matricula : 2014102865
Introdução

Ao contrário de muitos ramos da matemática, nascidos de especulações


puramente teóricas, a teoria dos grafos tem sua origem no confronto de problemas
práticos. A teoria dos grafos estuda objetos combinatórios -os grafos- que são um
bom modelo para muitos problemas em vários ramos da matemática, da informática,
da engenharia, da química, da psicologia e da indústria. Muitos dos problemas sobre
grafos tornaram-se célebres porque são um interessante desafio intelectual e porque
têm importantes aplicações práticas. É inevitável esbarrar em questões de
complexidade computacional, pois muitos dos problemas da teoria dos grafos têm
motivação algorítmica.
Breve Histórico

Enquanto outros temas de matemática têm uma longa e gloriosa história, isto
não acontece com a Teoria de Grafos. O primeiro problema cuja solução envolveu
conceitos do que veio a ser a teoria dos grafos (séc. XVII) foi resolvido por Euler e
não passava de uma especulação matemática. Acredita-se que um dos primeiros
exemplos da utilização de grafos teria surgido devido as Pontes de Königsberg. Na
cidade de Königsberg (atual Kaliningrado), antiga capital da Prússia Oriental, o rio
Pregel circunda uma ilha e separa a cidade em quatro zonas que, no séc. XVII
estavam ligadas por sete pontes como na figura 1:

Figura 1
CONCEITOS E APLICAÇÕES BÁSICAS DA TEORIA DE GRAFOS

Grafo simples

Um grafo G(V,A) é definido pelo par de conjuntos V e A, onde:

V - conjunto não vazio: os vértices ou nodos do grafo;

A - conjunto de pares ordenados a=(v,w), v e w ∈ V: as arestas do grafo.

Seja, por exemplo, o grafo G(V,A) dado por:

V = { p | p é uma pessoa }

A = { (v,w) | < v é amigo de w > }

Esta definição representa toda uma família de grafos. Um exemplo de elemento


desta família (ver G1) é dado por:
V = { Maria, Pedro, Joana, Luiz }
A = { (Maria, Pedro), (Pedro, Maria), (Joana, Maria), (Maria, Joana), (Pedro,
Luiz), (Luiz, Pedro), (Joana, Pedro) , (Pedro, Joana) }

Neste exemplo estamos considerando que a relação <v é amigo de w> é


uma relação simétrica, ou seja, se <v é amigo de w> então <w é amigo de v>. Como
conseqüência, as arestas que ligam os vértices não possuem qualquer orientação

Figura 2
Digrafo (Grafo Orientado ou Direcionado)

Considere, agora, o grafo definido por:


V = { p | p é uma pessoa da família Castro }

A = { (v,w) | < v é pai/mãe de w > }

Um exemplo de deste grafo (ver G2) é :


V = { Emerson, Isadora, Renata, Antonio, Cecília, Alfredo }
A = {(Isadora, Emerson), (Antonio, Renata), (Alfredo, Emerson), (Cecília,
Antonio), (Alfredo, Antonio)}

Figura 3

A relação definida por A não é simétrica pois se <v é pai/mãe de w>, não é o
caso de <w é pai/mãe de v>. Há, portanto, uma orientação na relação, com um
correspondente efeito na representação gráfica de G.

O grafo acima é dito ser um grafo orientado (ou digrafo), sendo que as
conexões entre os vértices são chamadas de arcos.

Ordem
A ordem de um grafo G é dada pela cardinalidade do conjunto de vértices, ou
seja, pelo número de vértices de G. Nos exemplos acima:

 ordem(G1) = 4
 ordem(G2) = 6
Adjacência

Em um grafo simples (a exemplo de G1) dois vértices v e w são adjacentes (ou


vizinhos) se há uma aresta a=(v,w) em G. Está aresta é dita ser incidente a ambos, v e w.
É o caso dos vérticesMaria e Pedro em G1. No caso do grafo ser dirigido (a exemplo
de G2), a adjacência (vizinhança) é especializada em:

Sucessor: um vértice w é sucessor de v se há um arco que parte de v e chega


em w. Em G2, por exemplo, diz-se que Emerson e Antonio são sucessores de Alfredo.

Antecessor: um vértice v é antecessor de w se há um arco que parte de v e


chega em w. Em G2, por exemplo, diz-se que Alfredo e Cecília são antecessores
de Antonio.

GRAU

O grau de um vértice é dado pelo número de arestas que lhe são incidentes.
Em G1, por exemplo:

 grau(Pedro) = 3
 grau(Maria) = 2

No caso do grafo ser dirigido (a exemplo de G2), a noção de grau é


especializada em:

Grau de emissão: o grau de emissão de um vértice v corresponde ao número de


arcos que partem de v. Em G2, por exemplo:

 grauDeEmissão(Antonio) = 1
 grauDeEmissao(Alfredo) = 2
 grauDeEmissao(Renata) = 0

Grau de recepção: o grau de recepção de um vértice v corresponde ao número


de arcos que chegam a v. Em G2, por exemplo:

 grauDeRecepção(Antonio) = 2
 grauDeRecepção(Alfredo) = 0
 grauDeRecepção(Renata) = 1

Fonte
Um vértice v é uma fonte se grauDeRecepção(v) = 0. É o caso dos
vértices Isadora, Alfredo e Cecília em figura 3.

Sumidoro

Um vértice v é um sumidouro se grauDeEmissão(v) = 0. É o caso dos


vértices Renata e Emerson em figura 3.

Laço
Um laço é uma aresta ou arco do tipo a=(v,v), ou seja, que relaciona um vértice a
ele próprio. Em figura 4 há três ocorrências de laços para um grafo não orientado.

Figura 4

Grafo regular
Um grafo é dito ser regular quando todos os seus vértices tem o mesmo grau.
O grafo figura 5, por exemplo, é dito ser um grafo regular-3 pois todos os seus vértices
tem grau 3.

Figura 5
Grafo completo
Um grafo é dito ser completo quando há uma aresta entre cada par de seus
vértices. Estes grafos são designados por Kn, onde n é a ordem do grafo.
Um grafo Kn possui o número máximo possível de arestas para um dados n. Ele
é, também regular-(n-1) pois todos os seus vértices tem grau n-1.

Figura 6

Grafo bipartido
Um grafo é dito ser bipartido quando seu conjunto de vértices V puder ser particionado
em dois subconjuntos V1 e V2, tais que toda aresta de G une um vértice de V1 a outro
de V2.

Para exemplificar, sejam os conjuntos H={h | h é um homem} e M={m | m é um


mulher} e o grafo G(V,A) (ver o exemplo figura 7 ) onde:

 V=HUM

 A = {(v,w) | (v ∈ H e w ∈ M) ou (v ∈ M e w ∈ H)
e <v foi namorado de w>}

Figura 7

O grafo figura 8 é uma K3,3, ou seja, um grafo bipartido completo que contém duas
partições de 3 vértices cada. Ele é completo pois todos os vértices de uma partição estão
ligados a todos os vértices da outra partição.
K3,3
Figura 8

Grafo rotulado
Um grafo G(V,A) é dito ser rotulado em vértices (ou arestas) quando a cada vértice (ou
aresta) estiver associado um rótulo. G5 é um exemplo de grafo rotulado.

Grafo valorado
Um grafo G(V,A) é dito ser valorado quando existe uma ou mais funções
relacionando V e/ou A com um conjunto de números.

Para exemplificar (ver o grafo figura 9), seja G(V,A) onde:

 V = {v | v é uma cidade com aeroporto}


 A = {(v,w,t) | <há linha aérea ligando v a w, sendo t o tempo esperado de voo>}

Figura 9
Multigrafo
Um grafo G(V,A) é dito ser um multigrafo quando existem múltiplas arestas entre pares
de vértices de G. No grafo figura 10, por exemplo, há duas arestas entre os
vértices A e C e entre os vértices A e B, caracterizando-o como um multigrafo.

Figura 10

Subgrafo
Um grafo Gs(Vs, As) é dito ser subgrafo de um grafo G(V,A) quando Vs ⊆ V e As ⊆ A. O
grafo figura 11, por exemplo, é subgrafo de figura 10.

Figura 11

Hipergrafo
Um hipergrafo H(V,A) é definido pelo par de conjuntos V e A, onde:
V - conjunto não vazio;
A - uma família e partes não vazias de V.
Seja, por exemplo, o grafo H(V,A) dado por:
V = { x1, x2, x3, x4}
A = { {x1, x2, x4}, {x2, x3, x4}, {x2, x3}}

Figura 12
Cadeia
Uma cadeia é uma sequência qualquer de arestas adjacentes que ligam dois
vértices. O conceito de cadeia vale também para grafos orientados, bastando que se
ignore o sentido da orientação dos arcos. A sequência de vértices (x6, x5, x4, x1) é um
exemplo de cadeia em figura 13.

Uma cadeia é dita ser elementar se não passa duas vezes pelo mesmo vértice.

É dita ser simples se não passa duas vezes pela mesma aresta (arco).

O comprimento de uma cadeia é o número de arestas (arcos) que a compõe.

Figura 13

Caminho
Um caminho é uma cadeia na qual todos os arcos possuem a mesma orientação. Aplica-
se, portanto, somente a grafos orientados. A sequência de vértices (x1, x2, x5, x6, x3) é
um exemplo de caminho em figura 13.

Ciclo
Um ciclo é uma cadeia simples e fechada (o vértice inicial é o mesmo que o
vértice final). A seqüência de vértices (x1, x2, x3, x6, x5, x4, x1) é um exemplo de ciclo
elementar em figura 13.

Circuito
Um circuito é um caminho simples e fechado. A seqüência de vértices (x1, x2, x5,
x4, x1) é um exemplo de circuito elementar em figura 13.
Fecho Transitivo
O fecho transitivo direto (ftd) de um vértice v é o conjunto de todos os vértices
que podem ser atingidos por algum caminho iniciando em v. O ftd do vértice x5 do
grafo figura 19, por exemplo, é o conjunto: {x1, x2, x3, x4, x5, x6}. Note que o próprio
vértice faz parte do ftd já que ele é alcançável partindo-se dele mesmo.
O fecho transitivo inverso (fti) de um vértice v é o conjunto de todos os
vértices a partir dos quais se pode atingir v por algum caminho. O fti do vértice x5 do
grafo figura 19, por exemplo, é o conjunto: {x1, x2, x4, x5, x7}. Note que o próprio
vértice faz parte do fti já que dele se pode alcançar ele mesmo.

Grafo conexo
Um grafo G(V,A) é dito ser conexo se há pelo menos uma cadeia ligando cada
par de vértices deste grafo G.

Figura 14

Grafo desconexo
Um grafo G(V,A) é dito ser desconexo se há pelo menos um par de vértices que
não está ligado por nenhuma cadeia.

Figura 15

Figura 16
Componente conexa
Um grafo G(V,A) desconexo é formado por pelo menos dois subgrafos conexos,
disjuntos em relação aos vértices e maximais em relação à inclusão. Cada um destes
subgrafos conexos é disto ser uma componente conexa de G.

Figura 17

Grafo fortemente conexo


No caso de grafos orientados, um grafo é dito ser fortemente conexo (f-conexo) se todo
par de vértices está ligado por pelo menos um caminho em cada sentido, ou seja, se cada
par de vértices participa de um circuito. Isto significa que cada vértice pode ser
alcançável partindo-se de qualquer outro vértice do grafo.

Figura 18

Componente fortemente conexa


Um grafo G(V,A) que náo é fortemente conexo é formado por pelo menos dois
subgrafos fortemente conexos, disjuntos em relação aos vértices e maximais em relação
à inclusão. Cada um destes subgrafos é disto ser uma componente fortemente conexa
de G, a exemplo dos subgrafos identificados por S1, S2 e S3 em figura 19
Figura 19

Vértice de corte
Um vértice é dito ser um vértice de corte se sua remoção (juntamente com as arestas a
ele conectadas) provoca um redução na conexidade do grafo. Os vértices x2 em figura
15 e figura 16 são exemplos de vértices de corte.

Ponte
Uma aresta é dita ser um a ponte se sua remoção provoca um redução na conexidade do
grafo. As arestas (x1, x2) em figura 15 e figura 16 são exemplos de pontes.

Base
Uma base de um grafo G(V,A) é um subconjunto B ⊆ V, tal que:

 dois vértices quaisquer de B não são ligados por nenhum caminho;


 todo vértice não pertencente a B pode ser atingido por um caminho partindo de
B.

Figura 20
Anti-base
Uma anti-base de um grafo G(V,A) é um subconjunto A ⊆ V, tal que:

 dois vértices quaisquer de A não são ligados por nenhum caminho;


 de todo vértice não pertencente a A pode ser atingir A por um caminho.

Raiz

Se a base de um grafo G(V,A) é um conjunto unitário, então esta base é a raiz de G.

Figura 21

Anti-raiz
Se a anti-base de um grafo G(V,A) é um conjunto unitário, então esta anti-base é a anti-
raiz de G.

Árvore
Uma árvore é um grafo conexo sem ciclos.

Seja G(V,A) um grafo com ordem n ≥ 2. As propriedades seguintes são


equivalentes e suficientes para caracterizar G como uma árvore:

1. G é conexo e sem ciclos;


2. G é sem ciclos e tem n-1 arestas;
3. G é conexo e tem n-1 arestas;
4. G é sem ciclos e por adição de uma aresta se cria um ciclo e somente
um;
5. G é conexo, mas deixa de sê-lo se uma aresta é suprimida (todas as
arestas são pontes);
6. todo par de vértices de G é unido por uma e somente uma cadeia
simples.
Figura 22

Arborescência
Uma arborescência é uma árvore que possui uma raiz. Aplica-se, portanto, somente a
grafos orientados.

Figura 23

FLORESTA
Uma floresta é um grafo cujas componentes conexas são árvores.

Figura 24

Grafo planar
Um grafo G(V,A) é dito ser planar quando existe alguma forma de se dispor seus
vértices em um plano de tal modo que nenhum par de arestas se cruze.
Ao lado aparecem três representações gráficas distintas para uma K4 (grafo
completo de ordem 4). Apesar de haver um cruzamento de arestas na primeira das
representações gráficas, a K4 é um grafo planar pois admite pelo menos uma
representação num plano sem que haja cruzamento de arestas (duas possíveis
representações aparecem nas figuras a baixo).

K4:
Já uma K5 e uma K3,3 são exemplos de grafos não planares. Estes dois grafos
não admitem representações planares.

K3,3: K5:

Coloração
Seja G(V,A) um grafo e C um conjunto de cores. Uma coloração de G é uma
atribuição de alguma cor de C para cada vértice de V, de tal modo que a dois vértices
adjacentes sejam atribuídas cores diferentes. Assim sendo, uma coloração de G é uma
função f: V → C tal que para cada par de vértices (v,w) ∈ A → f(v) ≠ f(w).

Uma k-coloração de G é uma coloração que utiliza um total de k cores. O


exemplo ao lado mostra um 4-coloração para o grafo.

Figura 25

Número cromático
Denomina-se número cromático X(G) de um grafo G ao menor número de cores k, para
o qual existe uma k-coloração de G. O exemplo ao lado mostra uma 3-coloração para o
grafo, que é o número cromático deste grafo.
Figura 26

Isomorfismo
Sejam dois grafos G1(V1,A1) e G2(V2,A2). Um isomorfismo de G1 sobre G2 é um
mapeamento bijetivo f: V1 ↔ V2 tal que (x,y) ∈ A1 se e somente se (f(x),f(y)) ∈ A2, para
todo x,y ∈ V1.
Os grafos ao lado são isomorfos pois há a função { (a,2), (b,1), (c,3), (d,4), (e,6), (f,5) }
que satisfaz a condição descrita acima.

Figura 27

Figura 28

Scie (Subconjunto Internamente Estável) (por vezes também conhecido


como conjunto independente)
Seja G(V,A) um grafo não orientado. Diz-se que S ⊂ V é um subconjunto internamente
estável se dois vértices quaisquer de S nunca são adjacentes entre si. Para o grafo ao
lado, são exemplos de SCIE os conjuntos:

{2, 3}, {1, 4} e {2, 3, 4}

Agora, se dado um SCIE S não existe um outro SCIE S' tal que S' ⊂ S, então S é dito ser
um SCIE maximal. Para o grafo ao lado, são exemplos de SCIE maximais os conjuntos:
{2, 3, 4}, {1, 6} e {4, 5}

Figura 29

SCEE (Subconjunto Externamente Estável) (por vezes também conhecido


como conjunto absorvente)
Seja G(V,A) um grafo orientado. Diz-se que T ⊂ V é um subconjunto
externamente estável se todo vértice não pertencente a T tiver pelo menos um vértice
deT como sucessor.

Agora, se dado um SCEE S não existe um outro SCEE S' tal que S' ⊂ S,
então S é dito ser um SCEE minimal. Para o grafo ao lado, são exemplos de SCEE
minimais os conjuntos
{x2, x4, x6} e {x1, x5, x3}

Este conceito também pode ser aplicado a grafos não orientados, bastando que
consideremos que todo vértice exterior a T deva ter como adjacente pelo menos um
vértice de T.
Figura 30

DEFINIÇÕES BÁSICAS

Um grafo G = (V,E) é um conjunto não-vazio V, cujos elementos são


chamados vértices, e um conjunto E de arestas. Uma aresta é um par não-ordenado
(vi,vj), onde vi e vj são elementos de V. Normalmente, utiliza-se uma representação
gráfica de um grafo. Eis um exemplo de grafo, com a sua representação gráfica:

V = {v1, v2, v3 , v4, v5 }


E = {a1, a2, a3, a4, a5, a6, a7, a8}
onde a1 = (v1,v2), a2 = (v1,v3), a3 = (v1,v3), a4 = (v2,v3), a5 = (v2,v5), a6 = (v5,v5), a7 =
(v3,v5), a8 = (v3,v4).

Figura 31

Note que nessa definição são permitidos laços (veja a aresta a6) e arestas
paralelas (as arestas a2 e a3, por exemplo). Um grafo que não contém nenhum laço e
nenhumas arestas paralelas é chamado grafo simples. Essa definição não impede que
um grafo seja infinito. Mas esse tipo de grafo não será estudado aqui. Um grafo que
contém no mínimo um laço é um pseudografo. Um grafo que contém arestas paralelas é
um multigrafo.

PROBLEMAS CLÁSSICOS DA LITERATURA

As pontes de Königsberg.

O problema das pontes de Königsberg é um problema antigo que foi resolvido


por Euler, com a criação da teoria dos grafos. O problema é o seguinte. Considerando
um rio com duas ilhas e 7 pontes como ilustrado na figura 32, é possível identificar um
caminho que atravesse todas as pontes uma vez só e que retorne ao ponto de partida?

Figura 32

Para resolver esse problema, Euler o representou com o grafo ilustrado na figura 32.
Com essa representação, e considerando as propriedades do grafos que serão
apresentadas mais tarde nesse curso, é possível resolver facilmente esse problema.
Figura 33

Problema do carteiro chinês Grafo semi-euleriano

O Problema do Carteiro Chinês O PCC busca um caminho tal que todas as ruas
devem ser visitadas e que o caminho seja mínimo (não que passe, necessariamente,
exatamente uma vez por cada rua do percurso). O estudo de grafos eulerianos é
importante, pois nos dá o melhor resultado possível para um grafo.

PCC Dado um grafo G=(V,E) conexo com pesos nas arestas, o objetivo do
Problema do Carteiro Chinês é encontrar um caminho fechado de peso mínimo
passando por cada aresta pelo menos uma vez. Como é possível esta solução para o
grafo a
Figura 34

Solução para o PCC • Solução 1: Se o grafo for de Euler, então o caminho pode
ser encontrado usando, por exemplo, o algoritmo de Hierholzer. • Solução 2: Se o grafo
não for de Euler, então algumas arestas terão que ser repetidas. A maneira clássica de
resolver este problema é acrescentando arestas artificiais ao grafo original de forma a
obter um novo grafo G’=(V,E’). Isto deve ser feito de maneira que as arestas artificiais
acrescentadas transformem todos os vértices de grau ímpar de G, em vértices de grau
par. As arestas artificiais correspondem aos eventuais percursos repetidos de custo
mínimo entre pares de vértices de grau impar.

Árvore geradora mínima

O Problema da Árvore Geradora Mínima Probabilística é uma generalização do


problema clássico da Árvore Geradora Mínima em que se considera a situação na qual
nem todos os nós estão deterministicamente presentes, mas estão presentes conforme
uma determinada probabilidade. Dado um grafo, G = (V, E), que possui um custo
associado a cada aresta em E e uma probabilidade de cada vértice em V estar ativo,
pretende-se construir uma árvore geradora T em G a priori, tal que o custo esperado de
T para um momento futuro seja mínimo. Este problema é provado como NP-Difícil em
seu caso geral. Nesta dissertação, a versão homogênea do problema, situação em que
todos os nós têm a mesma probabilidade de estarem ativos, é descrita, analisada e
resolvida através de algoritmos de busca local. Apresenta-se uma heurística construtiva
capaz de encontrar soluções viáveis para o problema. A partir de uma técnica que avalia
os custos de soluções vizinhas de maneira eficiente, propõe-se a incorporação de
algoritmos de busca local a um algoritmo de Busca Tabu, capaz de gerar soluções de
melhor qualidade para o problema. Propõe-se, também, uma modelagem que permite a
resolução do problema por Programação Inteira. A análise dos resultados revela que os
algoritmos, quando comparados à resolução do modelo exato, mostraram ser uma
ferramenta bastante eficiente para lidar com um problema computacionalmente difícil.

O Problema do Caixeiro Viajante

O Problema do Caixeiro Viajante (PCV) ´e o nome que usualmente se da a uma


série de problemas reais importantes que podem ser modelados em termos de ciclos
Hamiltonianos em grafos completos. De seguida apresentaremos três exemplos deste
tipo de problema, começando com um que da o nome a esta classe de problemas.
Exemplo (Zé Pedro, o caixeiro viajante). O Zé Pedro é um caixeiro viajante que tem
clientes em cinco cidades, que abreviamos por A, B, C, D e E. Ele precisa de planear
uma viagem de negócios com cidade de partida e de destino final A (a cidade onde
mora), passando por cada uma das restantes quatro cidades precisamente uma vez. O
grafo abaixo representa o custo de cada viagem (em qualquer um dos sentidos) entre
APLICAÇÕES EM REDES DE COMPUTADORES

Algoritmo de Dijkstra para cálculo do Caminho de Custo Mínimo

O Algoritmo de Dijkstra (E.W. Dijkstra) é um dos algoritmos que calcula o


caminho de custo mínimo entre vértices de um grafo. Escolhido um vértice como raiz
da busca, este algoritmo calcula o custo mínimo deste vértice para todos os demais
vértices do grafo. Ele é bastante simples e com um bom nível de performance. Ele não
garante, contudo, a exatidão da solução caso haja a presença de arcos com valores
negativos.

Este algoritmo parte de uma estimativa inicial para o custo mínimo e vai
sucessivamente ajustando esta estimativa. Ele considera que um vértice estará fechado
quando já tiver sido obtido um caminho de custo mínimo do vértice tomado como raiz
da busca até ele. Caso contrário ele dito estar aberto.

Algoritmo: Seja G(V,A) um grafo orientado e s um vértice de G:

1. Atribua valor zero à estimativa do custo mínimo do vértice s (a raiz da busca) e


infinito às demais estimativas;
2. Atribua um valor qualquer aos precedentes (o precedente de um vértice t é o
vértice que precede t no caminho de custo mínimo de s para t);
3. Enquanto houver vértice aberto:
o seja k um vértice ainda aberto cuja estimativa seja a menor dentre todos
os vértices abertos;
o feche o vértice k
o Para todo vértice j ainda aberto que seja sucessor de k faça:
 some a estimativa do vértice k com o custo do arco que une k a j;
 caso esta soma seja melhor que a estimativa anterior para o
vértice j, substitua-a e anote k como precedente de j.

A sequência de diagramas* ilustra o funcionamento do Algoritmo de Dijkstra.


Quando todos os vértices tiverem sido fechados, os valores obtidos serão os
custos mínimos dos caminhos que partem do vértice tomado como raiz da busca até os
demais vértices do grafo. O caminho propriamente dito é obtido a partir dos vértices
chamados acima de precedentes.

Para exemplificar, considere o caminho de custo mínimo que vai de s até v, cujo
custo mínimo é 9. O vértice precendente de v na última das tabelas acima é u. Sendo
assim, o caminho é:

s  ... uv

Por sua vez, o precedente de u é x. Portanto, o caminho é:

s  ... x uv

Por último, o precedente de x é o próprio vértice s. Logo, o caminho de custo


mínimo é:

s x uv

Como apresentado o algoritmo de Dijkstra computa apenas um único caminho


de custo mínimo entre um dado par de vértices. Para se obter todos os caminhos de
custo mínimo entre dois vértices é necessário modificar a forma de anotação dos
precedentes. A modificação no passo 3 indicada a seguir é suficiente para permitir o
cômputo de todos os caminhos por um processo similar ao descrito acima.

Para todo vértice j ainda aberto que seja sucessor de k faça:

 some a estimativa do vértice k com o custo do arco que une k a j;


 caso esta soma seja melhor que a estimativa anterior para o
vértice j, substitua-a e anote k como precedente único de j;
 caso esta soma seja igual à estimativa anterior para o
vértice j, adicione k ao conjunto dos precedentes de j;

Supondo que o peso do arco (y,v) no grafo acima fosse 2, haveriam dois
caminhos de custo mínimo do vértice s para v. Esta duplicidade resulta em dois
precedentes para o vértice v:
Sendo assim, os dois caminhos são dados por: (s  ... uv) e
(s  ... yv). Seguindo as precedências para u e y nestes dois casos
obtemos os dois caminhos: (s x uv) e (s x yv).

Algoritmo Vetor de Distância

O algoritmo de vetor de distância DV – distance vector - é interativo, assíncrono


e distribuído. É distribuído porque cada nó recebe alguma informação com respeito a
um ou mais vizinhos diretamente conectados, faz cálculos e, após, distribui os
resultados de seus cálculos para seus vizinhos. O interativo vem da troca de dados
constante, até que não seja mais possível realizar tal troca. E assíncrono porque não
requer que todos os nós rodem simultaneamente (KUROSE ; ROSS, 2009).

Os algoritmos de roteamento, que usam vetor de distância, operam de forma que


cada roteador mantenha uma tabela (isto é, um vetor), que fornece a melhor distância
conhecida até o destino, e também indica qual linha deve ser utilizada para a
transmissão. Tais tabelas são atualizadas através da troca de informações com os
vizinhos. Esse algoritmo pode ser conhecido também como Bellman-Ford (algoritmo
recebe esse nome pelo seu em homenagem aos seus pesquisadores, Bellman, 1957 e
Ford em 1962) (TANEMBAUM, 2003)

No roteamento de vetor de distância, cada roteador mantém uma tabela de


roteamento indexada por cada roteador da sub-rede, e contém a entrada para cada um de
tais roteadores. A entrada possui duas partes: a linha de saída a ser usada e uma
estimativa do tempo ou da distância até o ponto final. Duas unidades métricas podem
ser usadas: o número de hops ou o tempo em [ms] (TANEMBAUM, 2003)

Contagem até o Infinito


Pode-se dizer que o método de vetor de distância tem um funcionamento na
teoria, entretanto apresenta um sério problema na prática: sua convergência pode ser
morosa.

“Em particular, ele reage com rapidez a boas notícias, mas reage devagar
a más notícias (TANEMBAUM, 2003, p. 381).”

Para verificar a velocidade com que o vetor de distância reage a boas notícias,
considere a uma sub-rede de cinco nós, como o exposto na Figura 6. Neste exemplo, a
unidade métrica usada é o número de hops. Suponha que A esteja inativo e que todos os
outros roteadores têm conhecimento desta noticia. Já quando A se tornar ativo, os outros
roteadores terão conhecimento dele através da troca de vetores. Na primeira troca de
vetores, B toma conhecimento de que seu vizinho da esquerda não possui mais retardo
infinito, agora possui o valor 0 até A. Na seguinte troca, C sabe que B tem um caminho
de comprimento 1 até A, com isso, C atualiza sua tabela de roteamento para indicar um
comprimento de 2 até A. Após, D e E saberão de tais caminhos, dessa forma, todos
saberão quais linhas e roteadores voltaram a ser ativos (TANEMBAUM, 2003).

Figura 35

Problema contagem até o infinito

Agora se considera a imagem da direita. Para verificar a velocidade com que o


vetor de distância reage a boas notícias, considere a uma sub-rede de cinco nós na
Figura 6. Neste exemplo, a unidade métrica usada é o número de hops. Suponha que A
esteja inativo e que todos os outros roteadores têm conhecimento dessa notícia. Já
quando A se tornar ativo, os outros roteadores terão conhecimento dele através da troca
de vetores. Na primeira troca de vetores, B toma conhecimento de que seu vizinho da
esquerda não possui mais retardo infinito, agora possui o valor 0 até A. Na seguinte
troca, C sabe que B tem um caminho de comprimento 1 até A, com isso, C atualiza sua
tabela de roteamento para indicar um comprimento de 2 até A. Após, D e E saberão de
tais caminhos, dessa forma, todos saberão quais linhas e roteadores voltaram a ser
ativos, em que todas as linhas e roteadores estão ativos inicialmente. Os roteadores B,
C, D e E possuem distâncias até A iguais a 1, 2 3, e 4, respectivamente. de repente A é
desativado, ou também, pode ocorrer uma falha na conexão no meio de transmissão.

Na primeira troca de pacotes, B não detecta nada em A. Assim, C informa que


possui o caminho até A, com comprimento 2, apesar de B saber que o caminho de C
passa por B. O roteador C pode conter outra linhas de saída independentes até A, de
comprimento 2. Com isso, B imagina que pode chegar até A via C. Os roteadores D e E
não atualizam sua tabela na primeira troca (TANEMBAUM, 2003).

Na próxima troca, C percebe que seus vizinhos alegam ter uma caminho até A
de comprimento 3. Dessa forma, C seleciona um desses caminhos ao acaso e torna 4 a
sua nova distância até A.

Por meio do que foi exposto no parágrafo anterior, percebe-se que as más
notícias possuem uma propagação lenta. Nenhum roteador possui um valor maior que
uma unidade a mais que o valor mínimo de todos seus vizinhos. Gradualmente, todos os
roteadores seguem o seu caminho até o infinito, mas o número de trocas necessárias
varia de acordo com o valor numérico usado para o infinito. Por causa desse motivo, é
melhor definir infinito como o caminho mais longo e mais uma unidade. Devido ao que
foi comentado, surge o nome contagem ao infinito (TANEMBAUM, 2003).

Além do problema de contagem ao infinito, o algoritmo de vetor de distância


mantém todos os registros das mudanças ocorridas na rede através
do broadcasting periódico de atualizações das tabelas de roteamento, isso para as
interfaces ativas. Dessa forma, tal processo consome largura de banda considerável e faz
com que a utilização do CPU seja incrementada (FILIPPETTI, 2008).

Algoritmo Estado de Enlace

O algoritmo de estado de enlace possui o conhecimento de topologia da rede e


todos os custos de enlaces. Isso é possível com a transmissão de pacotes por cada um
dos nós para todos os outros. Com isso é que se chega ao custo de cada link (KUROSE ;
ROSS, 2009).

Torna-se possível o referido acima através de transmissão broadcasting de


estado de enlace (PERLMAN, 1999).

“O resultado da transmissão broadcasting dos nós é que todos os nós tem


uma visão idêntica e completa da rede (KUROSE ; ROSS, 2009, p. 278).”

O algoritmo de roteamento de estado de enlace é conhecido como Dijkstra, o


nome do seu idealizador. Outro algoritmo que guarda relação muito próxima com ele é
o Prim.

“A ideia por trás do roteamento por estado de enlace é simples e pode ser
estabelecida como cinco partes. Cada roteador deve fazer o seguinte (TANEMBAUM,
2003, p. 383)”.
 Descobrir seus vizinhos e aprender seus endereços de rede;
 Medir o roteador ou custo até cada um de seus vizinhos;
 Criar um pacote que informe tudo o que ele acabou de aprender;
 Enviar esse pacote a todos os outros roteadores;
 Calcular o caminho mais curto até cada um dos outros roteadores.

Conhecendo Vizinhos

Quando um roteador é iniciado, sua primeira ação é aprender quem são seus
vizinhos. Isso é realizado enviando-se um pacote HELLO especial em cada linha ponto
a ponto. Assim, o roteador na outra ponta deve enviar de volta uma resposta,
identificando-se (TANEMBAUM, 2003)

Menor Custo de Linha

O método por estado de enlace exige que cada roteador conheça o retardo para
cada um de seus vizinhos. Para que isso seja possível, um pacote especial ECHO é
enviado pela linha, e a outra ponta deve responder tal pacote. Dessa forma, usa a
metodologia de se medir o tempo de ida e volta e dividi-lo por dois. O roteador pode
obter uma estimativa razoável do vizinho (TANEMBAUM, 2003).

Uma questão interessante a ser levantada é se deve-se levar a carga em


consideração na medição do retardo?

Há argumentos a favor das duas opções. A utilização da carga, quando um


roteador tiver que escolher entre duas linhas com a mesma largura de banda, será a rota
sobre a linha não carregada, ou seja, aquela com o caminho mais curto . Com isso, será
alcançado um desempenho superior (TANEMBAUM, 2003).

Entretanto, há um argumento que vai contra a inclusão da carga no cálculo do


retardo. Na Figura 7 apresentam-se duas redes, separadas por duas partes, Leste e Oeste,
interconectados por duas linhas, CF e EI.
Figura 36

Sub-rede com duas partes

Primeiramente supõe-se que a parte mais considerável do tráfego entre leste e


oeste está usando as linhas CF. Assim, esse caminho sofrerá com retardos longos e
estará carregado o link excessivamente. Incluindo o retardo no enfileiramento no cálculo
da rota, tornará o caminho EI mais indicado. Após a atualização das tabelas de rotas, a
maior parte do tráfego Leste-Oeste será transmitida através de EI, sobrecarregando essa
linha. Com isso, na próxima interação, CF parecerá mais curto. Isso pode ocasionar em
uma oscilação nas tabelas de roteamento e, assim, potencializando problemas. Porém, a
não utilização da carga como parâmetro pode fazer com que esse problema não ocorra.
Há outras soluções para evitar tal problema, como distribuir a carga por várias linhas de
saída, usando alguma fração de carga conhecida que está sendo utilizada na transmissão
de cada linha (TANEMBAUM, 2003).

Criação de Pacotes

Um pacote inicia com a identidade do transmissor, seguida por um número de


sequência, pela idade e lista de vizinhos. Um exemplo de sub-rede é listado na figura
36, sendo os retardos mostrados como rótulos de linha. Os pacotes de estado de enlace
subsequentes a todos os roteadores estão na figura 37, sendo os retardos mostrados
como rótulos de linha.
Figura 37

Sub – redes

Figura 38

Pacotes correspondentes

Distribuição de Pacotes

A Principal ideia é fazer uso de um algoritmo de inundação para a distribuição


dos pacotes de estado de enlace. Para que seja possível controlar tal algoritmo, cada
pacote contém um número de sequência que é incrementando a cada pacote que é
transmitido. Os roteadores realizam o controle de todos os pares (roteador de origem,
sequência) que vêm. Quando recebido, o novo pacote é verificado na lista de pacotes
enviados. Se por algum motivo um pacote contiver um número de sequência mais baixo
que o mais alto número de sequência detectado até o momento, ele será descartado, pois
o roteador terá informações mais recentes (TANEMBAUM, 2003).

O algoritmo citado possui alguns problemas, mas que podem ser solucionados.
Primeiramente, se os números de sequência se repetirem, uma confusão imperará. A
solução encontrada é usar números de sequência de 32 bits. Com um pacote de estado
de enlace por segundo, seriam necessários 137 anos para um número se repetir.

O segundo problema é se um roteador apresentar alguma falha, o mesmo perderá


o controle do número de sequência. Se ele iniciar novamente pelo zero, o pacote em
frente apresentará falha, por ser considerada uma cópia.

Um terceiro problema evidente é se um número de sequência for adulterado e o


número 65.540 for recebido no lugar do número 4 (erro de 1 bit), os pacotes de 5 até
65.540 serão rejeitados como obsoletos, pois o 65.540 será considerado um número de
sequência atual (TANEMBAUM, 2003).

Para resolver esses problemas, é incluso a idade em cada pacote após o número
de sequência e decrementá-lo uma vez por segundo. Dessa forma, quando a idade
atingir zero, as informações deste roteador serão descartadas.

Porém, podem-se adicionar alguns aprimoramentos neste algoritmo, para assim


torná-lo mais resistente. Quando um pacote de estado de enlace chega a um roteador
para inundação, ele não é imediatamente enfileirado para a transmissão. Ao contrário,
ele é posicionado em uma área de retenção para aguardar um tempo. Se outro pacote de
estado de enlace da mesma origem chegar antes da transmissão do primeiro pacote, seus
números de sequência serão comparados. Se forem iguais, a cópia será descartada. Já se
forem diferentes, o mais antigo será descartado. Com relação aos erros nas linhas entre
dois roteadores, todos os pacotes de estado de enlace possuem uma confirmação.
Quando uma linha se apresentar ociosa, a área de retenção será varrida sequencialmente,
com o objetivo de selecionar um pacote ou uma confirmação a ser enviada
(TANEMBAUM, 2003).

Cálculo de Rotas

Quando uma rota acumula um conjunto completo de pacotes de estado de


enlace, a mesma poderá criar um grado da sub-rede completo, pois todo o enlace poderá
ser representado. Entretanto, todo o enlace é representando duas vezes, uma vez em
cada sentido.

Dessa forma, o algoritmo Dijkstra pode ser executado no local, com a finalidade
de criar o caminho mais curto até todos os destinos possíveis. Os resultados desse
algoritmo podem ser instalados nas tabelas de roteamento e a operação normal pode ser
retomada.

Em uma sub-rede com n roteadores, cada qual com K vizinhos, a memória


necessária para armazenar os dados de entrada é proporcional a kn. Em redes de grande
porte, isso pode se tornar um problema. Além disso, o tempo de cálculo também pode
ser de grande importância. Contudo, em muitas ações práticas, o roteamento por estado
de enlace possui um funcionamento satisfatório (TANEMBAUM, 2003).
REFERÊNCIA BIBLIOGRÁFICA
http://www.inf.ufsc.br/grafos/definicoes/definicao.html
http://www.professeurs.polymtl.ca/michel.gagnon/Disciplinas/Bac/Grafos/Euler
Ham/euler_ham.html
http://www.teleco.com.br/tutoriais/tutorialredeipec1/pagina_3.asp

Você também pode gostar