Post on 08-Nov-2018
10/10/2011
1
TGR – BCCO problema do Caminho mínimo
Prof. Ricardo José Pfitscher
Cronograma
• O problema do caminho mínimo
• Algoritmo de Dijkstra
10/10/2011
2
O problema
• Em um grafo simples, ponderado e conexo, com pesos positivos.
• Vimos com a matriz de alcançabilidade que existe um caminho entre quaisquer vértices x e y.– Podem haver vários caminhos.
• Como encontrar o caminho com menor peso?
• Pesos normalmente representam distâncias, então denominou-se “Caminho mínimo”
O Problema
• Dado o grafo:
– Como encontrar o menor caminho entre duas cidades?
10/10/2011
3
O Problema
• Em um grafo pequeno é uma tarefa simples, pode até ser resolvido de forma visual. E em um grafo complexo?
Algoritmos
• Alguma idéia para resolvermos o problema?
10/10/2011
4
Algoritmo de Dijkstra
• Quem foi Edsger Dijkstra?– Primeiro programador nos países baixos– Primeiro compilador para ALGOL 60– Introduziu o conceito de pilha na tradução de programas recursivos– Em 1972, recebeu o prêmio turing
• Contribuições– Problema do caminho mínimo– Sistema operacional THE– Semáforos (coordenação de múltiplos processadores e programas)– Auto-estabilização, deadlock– Arvores de Extensão mínima
Algoritmo de Dijkstra
• Capaz de encontrar o menor caminho entre dois vértices
• Algoritmo completo
– Se existe um menor caminho o algoritmo encontra
• Ótimo e Eficiente
– Não há caminho menor que o encontrado
• Ressalva:
– Não consegue lidar com caminhos de pesos negativos
10/10/2011
5
Algoritmo de Dijkstra
• Funcionamento:
– Quer se saber a distância entre x e y
– Utiliza-se um conjunto IN, que contém inicialmente x• IN contém os vértices para os quais já foram determinados os
menores caminhos a partir de x
– Para cada vértice z fora de IN, mantemos a menor distância d[z] entre x e z, usando caminhos onde o único vértice que não esteja em IN seja z
– Armazenamos o vértice adjacente a z neste caminho s[z]
Algoritmo de Dijkstra
• Funcionamento
– Como fazer com que IN cresça? Qual o vértice deve ser adicionado a seguir?
• Escolhemos o vértice fora de IN com menor distância d
• Depois de escolhido, chamaremos ele de p, em IN
• Recalcular d para todos os vértices restantes fora de IN, pois pode haver um caminho menor a partir de x passando por p do que aqueles antes de termos p
• Se houver caminho mais curto, devemos atualizar s[z] de forma a indicar que p é o vértice adjacente a z pelo novo caminho mais curto.
10/10/2011
6
Algoritmo de Dijkstra
• Funcionamento
– Quando y for incluído em IN, este para de receber novos elementos.
– O Valor corrente de d[y] é a distância do menor caminho.
– E seus vértices podem ser obtidos examinando: y, s[y] e s[s[y]], até que tenhamos voltado a x
Algoritmo de Dijkstra
• Fácil??
• Simplificando:
– Para cada vértice fora de IN, a distancia d[v] é comparada com a distancia até ele percorrida pelo menor caminho já encontrado
– O menor caminho é: final, s[final], s[s[final]]], ...
pi
ippii
i
p
vvs
vvavalorArestvdvdvd
vNI
vvvIN
com ][ marca segundo se
]},[][],[min{][
,...}{...,
},...,,{ 21
+=
=
=
10/10/2011
7
Algoritmo de Dijkstra
pi
ippii
i
p
vvs
vvavalorArestvdvdvd
vNI
vvvIN
com ][ marca segundo se
]},[][],[min{][
,...}{...,
},...,,{ 21
+=
=
=
Algoritmo de Dijkstra
• Exercício: fazer na mão:– Jaragua – Criciuma
– Garuva – Massaranduba
10/10/2011
8
Algoritmo de Dijkstra - Exercícios
A) Menor caminho de A para D
B) Menor caminho de A para D, considerando o número de saltos apenas
Algoritmo de Dijkstra - Exercícios
• C � D
• B � A
10/10/2011
9
Implementação
• Implementar o algoritmo de Dijkstra
• O usuário deve entrar com:– Tamanho da Matriz
– Matriz de adjacências
– Origem e destino
• O programa deve apontar:– Qual o menor caminho para o destino
– Qual o custo deste menor caminho
• Restrição: Não usar listas• Dica: Utilize Vij para representar um vértice, onde i é linha e j é coluna
Algoritmo de Bellman-Ford
10/10/2011
10
Algoritmo de Bellman-Ford
• Uma alternativa para busca de caminho mínimo
• Vantagem:
– Pode ser utilizado em arestas com peso negativo
• Bem utilizado em grafos orientados
Algoritmo de Bellman-Ford
• Busca de caminho mínimo a partir de uma origem até todos os outros vértices do grafo
– Em dijkstra a busca era de 1 para 1
• Também denominado de Vetor de distância
10/10/2011
11
Algoritmo de Bellman-Ford
• Princípio de Funcionamento:
– Busca pelo número de saltos
• Procura todas as distâncias para os destinos com 1 salto
• Procura todas as distâncias para os destinos com 2 saltos
• …
• Até o máximo de n-1 saltos, onde n é o número de vértices
– Se existe um caminho não pode ser maior que n-1
Algoritmo de Bellman-Ford
• Aplicação:
– Amplamente utilizado em roteadores
– Os roteadores mantém uma tabela atualizada com a menor distância conhecida até um destino, e qual caminho deve ser utilizado para se chegar lá.
10/10/2011
12
Algoritmo de Bellman-Ford
• Roteadores
Algoritmo de Bellman-Ford
• Atualizando as tabelas de roteamento
10/10/2011
13
Algoritmo de Bellman-Ford
• Utilizando o algoritmo
• Considerar o grafo abaixo
Algoritmo de Bellman-Ford
• Elaborando a tabela
Saltos A B C D E F G
1 X INF 2,A 50,A 10,A INF INF
2 X 6,C 51,D 11,E 51,D 3,C 12,E
3 X 6,F 12,D 11,B 4,D 9,B 4,F
4 X 5,G 17,B 11,B 6,G 8,G 5,E
5 X 7,G 17,F 7,E 9,B 7,G 9,B
6 X 10,F 17,F 10,E 11,D 10,B 12,F
10/10/2011
14
Algoritmo de Bellman-Ford
• Com base na tabela, encontrar menor caminho de A para B
• Custo do caminho: 5
• Caminho: A-C-F-G-B
Saltos A B C D E F G
1 X INF 2,A 50,A 10,A INF INF
2 X 6,C 51,D 11,E 51,D 3,C 12,E
3 X 6,F 12,D 11,B 4,D 9,B 4,F
4 X 5,G 17,B 11,B 6,G 8,G 5,E
5 X 7,G 17,F 7,E 9,B 7,G 9,B
6 X 10,F 17,F 10,E 11,D 10,B 12,F
Algoritmo de Bellman-Ford
A-C-F-G-B
Custo � 5
10/10/2011
15
Exercícios
• C�D
• B�A
procedure OutroCaminhoMínimo{A: matriz n X n; x: vértice; var d: vetor de inteiros; var s: vetor de vértices};
{ Algoritmo de Bellman-Ford —A é uma matriz de adjacências modificada para um grafo simples, ponderado e conexo; x é um vértice no grafo; quando o procedimento termina, os vértices no caminho mínimo de x a y são y, s[y],
s[s[y]],..., x; a distância deste caminho é d[y].}
var
z,p: vértice; {vértices temporários}
t: vetor de inteiros;
Continua....
10/10/2011
16
begin
{inicia os vetores d e s — estabelece os caminhos mínimos de comprimento 1 a partir de x }d[x]:=0;
for todos os vértices z diferentes de x do
begin
d[z] := A[x, z];
s[z]:=x;
end;
{encontra os caminhos mínimos de comprimentos 2, 3, etc.}for i: = 2 to n — 1 do
begin
t := d; {copia o vetor d corrente em t}{altera t a fim de guardar os menores caminhos de comprimento i}for todos os vértices z diferentes de x do
begin {encontra o caminho mínimo com uma aresta a mais}p : = vértice em G para o qual (d[p] + A[p, z]) é mínimot[z]:=d[p] +A[p,z];
if not (p = z) then
s[z] := p;
end;
d := t; {copia t de volta para d}
end; {laço for}end;
AGM – Arvore Geradora Mínima
10/10/2011
17
Problema
• Um dos problemas mais encontrados em relação ao projeto de redes é conectar todos os vértices de forma eficiente (computadores, telefones, etc)
• A AGM fornece uma solução econômica, que precise de pouco cabo, pouca tubulação, ou pouca quantidade de qualquer que seja o meio de conexão
Conceito
• A árvore geradora mínima de um grafo não direcionado G=(V,A) é um subgrafo T´=(V’,A’) de G– T é conectado, sem ciclos com V’=V– A cada aresta (i,j) em A é associado um peso C(i,j)
• Grafo Ponderado
• Definição formal:“Uma árvore geradora de um grafo é uma árvore não-enraizada cujo o conjunto de vértices coincide com o conjunto de vértices do grafo e cujas arestas são algumas das arestas do grafo”
10/10/2011
18
Exemplo
• Para o grafo abaixo, qual seria a AGM?
A
B C
ED
20 10
5
515
10
20
A
B C
ED
10
5
5
10
Algoritmos para encontrar a AGM
• Veremos dois Algoritmos para encontrar a AGM que tenha peso mínimo:– Algoritmo de PRIM– Algoritmo de KRUSKAL
• Como detectar os ciclos?– Para todos os nós do grafo executar (L é uma lista de nós):
1. L=[ ] , todos os nós do grafo são desmarcados2. Insira o nó atual em L e verifique se aparece duas vezes, se sim,
o grafo tem um ciclo, e o algoritmo termina3. Ache um arco desmarcado saindo do nó corrente
i. Se houver, marque o arco e visite o nó, voltando ao passo 2ii. Se não houver, retire o nó corrente de L e retorne ao nó anterior,
voltando ao passo 3i. Se for o primeiro, o algoritmo termina, e não há ciclos.
10/10/2011
19
Algoritmo de PRIM
IN: conjunto de vértices; //contém inicialmente vértice arbitrárioz: vértice; //vértices a serem testadosd: vetor de inteiros; //menor distância d[z] entre z e qualquer vértice em INS: vetor de vértices; //vértices testados a cada interaçãoinício{
//escolhe vértice inicial arbitrárioIN= {x}
for todos os vértices z que não pertençam a IN {
//avalia menor distância d[z] entre z e qualquer vértice em IN// Se não formar cicloIN=z; //IN recebe novo vértice que não está em IN e cuja distância seja mínimaS= {x,z};
}
} //O algoritmo se encerra quando todos os vértices forem incluídos em IN formando uma árvore conexa e acíclica.
Algoritmo de PRIM
• ExemploA
B C
ED
20 10
5
515
10
20
IN: {A}; S={{A,C}}
10/10/2011
20
Algoritmo de PRIM
• ExemploA
B C
ED
20 10
5
515
10
20
IN: {A,C}; S={{A,C},{C,B}}
Algoritmo de PRIM
• ExemploA
B C
ED
20 10
5
515
10
20
IN: {A,C,B}; S={{A,C},{C,B},{B,E}}
10/10/2011
21
Algoritmo de PRIM
• ExemploA
B C
ED
20 10
5
5 15
10
20
IN: {A,C,B,E}; S={{A,C},{C,B},{B,E},{E,D}}
Algoritmo de PRIM
• ExemploA
B C
ED
20 10
5
5 15
10
20
IN: {A,C,B,E,D}; S={{A,C},{C,B},{B,E},{E,D}}
10/10/2011
22
Algoritmo de KRUSKAL
• Inclui arestas na ordem de suas distâncias crescentes, sempre que elas puderem pertencer ao grafo
• Empates são resolvidos arbitrariamente;
• Restrição: Uma aresta não será incluída se sua inclusão resultar em um ciclo
• O algoritmo termina quando todos os grafos tiverem sido incorporados em uma estrutura conexa
Algoritmo de KRUSKAL
Outro AGM (A: matriz nxn, T:coleção de arestas){//Algoritmo de Kruskal para obtenção de uma AGM//T inicialmente está vazia; ao fim, T=AGMinicio {
ordena as arestas de G de forma crescente;do{if (próxima aresta na ordem não cria um ciclo)
inclui a aresta em T;}while(T é conexo e contém todos os vértices de G)
}
10/10/2011
23
Algoritmo de KRUSKAL
• Exemplo
A
B C
ED
20 10
5
515
10
20
Ordem das arestas:
(B,C) = 5
(B,E) = 5
(A,C) = 10
(D,E) = 10
(C,E) = 15
(A,B) = 20
(B,D) = 20
Algoritmo de KRUSKAL
• Exemplo
A
B C
ED
Ordem das arestas:
(B,C) = 5
(B,E) = 5
(A,C) = 10
(D,E) = 10
(C,E) = 15
(A,B) = 20
(B,D) = 20
AGM: {A},{B},{C},{D},{E}
10/10/2011
24
Algoritmo de KRUSKAL
• Exemplo
A
B C
ED
Ordem das arestas:
(B,C) = 5
(B,E) = 5
(A,C) = 10
(D,E) = 10
(C,E) = 15
(A,B) = 20
(B,D) = 20
AGM: {A},{B},{C},{D},{E}
Desempilha (B,C)
5
Algoritmo de KRUSKAL
• Exemplo
A
B C
ED
Ordem das arestas:
(B,E) = 5
(A,C) = 10
(D,E) = 10
(C,E) = 15
(A,B) = 20
(B,D) = 20
AGM: {A},{B,C},{D},{E}
Desempilha (B,C)
Desempilha (B,E)
5
5
10/10/2011
25
Algoritmo de KRUSKAL
• Exemplo
A
B C
ED
Ordem das arestas:
(A,C) = 10
(D,E) = 10
(C,E) = 15
(A,B) = 20
(B,D) = 20
AGM: {A},{B,C},{B,E},{D}
Desempilha (B,C)
Desempilha (B,E)
Desempilha (A,C)
5
5
10
Algoritmo de KRUSKAL
• Exemplo
A
B C
ED
Ordem das arestas:
(D,E) = 10
(C,E) = 15
(A,B) = 20
(B,D) = 20
AGM: {A,C},{B,C},{B,E},{D}
Desempilha (B,C)
Desempilha (B,E)
Desempilha (A,C)
Desempilha (D,E)
5
5
10
10
10/10/2011
26
Algoritmo de KRUSKAL
• Exemplo
A
B C
ED
Ordem das arestas:
(C,E) = 15
(A,B) = 20
(B,D) = 20
AGM: {A,C},{B,C},{B,E},{D,E}
Desempilha (B,C)
Desempilha (B,E)
Desempilha (A,C)
Desempilha (D,E)
5
5
10
10
PESO = 30
Obs: Caso
tivéssemos um
ciclo, não iria
desempilhar
Conclusões
• Utilização da árvore geradora mínima:
– Otimização de redes
– Telecomunicações
– Construção de estradas
– Problema de escalonamento de tarefas
10/10/2011
27
Exercício: Rede óptica entre Tabas
Os caciques da região de Tutuaçu pretendemintegrar suas tribos à chamada “aldeia global”. Aprimeira providência foi a distribuição de telefonescelulares a todos os pajés. Agora, planejam montaruma rede de fibra ótica interligando todas as tabas.Esta empreitada requer que sejam abertas novaspicadas na mata, passando por reservas de flora efauna. Conscientes da necessidade de preservar omáximo possível o meio ambiente, os caciquesencomendaram um estudo do impacto ambientaldo projeto.
Exercício: Rede óptica entre Tabas
• Considerações:– Os caciques conseguiram as informações do impacto
ambiental causado pela construção dos ramos
– Alguns ramos não foram considerados no estudo poissua construção é impossível
136
12
6
15
5
D
C B
A
E
10/10/2011
28
Exercício: Rede óptica entre Tabas
• Problema:– Como determinar quais ramos devem ser construídos,
possibilitando a comunicação entre todas as tabas e causando menor impacto ambiental
• Solução, gerar a AGM: Utilize os dois algoritmos
136
12
6
15
5
D
C B
A
E
Exercício: Rede óptica entre Tabas
• Solução:– Aplicando os conceitos, e os algoritmos devemos
chegar no grafo abaixo– Indicando quais ramos devem ser construídos
6
12
6 5
D
C B
A
E