Projeto e Análise de Algoritmos Prof. André Amaral Tarefa L12 Pg. 1

Propaganda
Projeto e Análise de Algoritmos
Tarefa L12
Pg. 1
Prof. André Amaral
1. Uma etapa de relaxamento sobre uma aresta (u, v) é executada pelo código:
RELAX(u, v, w)
1 if d[v] > d[v] + w(u, v)
2
then d[v] ← d[v] + w(u, v)
3
π[v] ← u
Para demonstrar a correção do algoritmo de Dijkstra, do algoritmo de caminhos mais curtos para
grafos acíclicos orientados, e do algoritmo de Bellman-Ford, recorreremos a várias propriedades
de caminhos mais curtos e relaxamento. Para cada uma dessas propriedades abaixo, enunciar e
apresentar uma prova formal. Note que as cinco últimas dessas propriedades, que se referem a
estimativas de caminhos mais curtos ou ao subgrafo predecessor, supõem implicitamente que o
grafo é inicializado com uma chamada a
INlTIALIZE-SINGLE-SOURCE ( G, s)
e que o único modo de modificar as estimativas de caminhos mais curtos e o subgrafo
predecessor é empregar alguma seqüência de etapas de relaxamento.
1. Desigualdade de triângulos
2.
Propriedade do limite superior
3.
Propriedade de nenhum caminho
4.
Propriedade de convergência
5. Propriedade de relaxamento de caminho
6. Propriedade de subgrafo predecessor
2. Dado um grafo orientado ponderado G = (V, E) , mostre que o algoritmo de Bellman-Ford
resolve o problema de caminhos mais curtos de única origem no caso geral em que arestas
podem ter peso negativo, retornando TRUE se o grafo G não contém nenhum ciclo de peso
negativo acessível a partir da origem, e FALSE em caso contrário.
3. O algoritmo de Dijkstra resolve o problema de caminhos mais curtos de única origem em um
grafo orientado ponderado G = (V, E) mas exige que os pesos de arestas sejam não negativos.
Mostre que, com uma boa implementação, o algoritmo de Dijkstratem um tempo de execução
menor que o do algoritmo de Bellman-Ford.
Projeto e Análise de Algoritmos
Tarefa L12
Pg. 2
Prof. André Amaral
4. Mostre como a pesquisa primeiro em profundidade pode ser usada para executar uma
ordenação topológica (i.e., uma ordenação linear sobre os vértices) em um grafo acíclico
orientado: GAO (ver Seção 22.4).
5. Mostre a correção do algoritmo de tempo linear (Seção 24.2, livro texto) para calcular
caminhos mais curtos a partir de uma única origem em um GAO (grafo acíclico orientado)
ponderado. Descreva a aplicação desse algoritmo na determinação de caminhos críticos na
análise diagramas PERT. Execute DAG-SHORTEST-PATHS sobre o grafo orientado da Figura
24.5 do livro texto, usando o vértice r como origem.
6. Mostre como o algoritmo de Bellman-Ford pode ser usado para resolver um sistema de
restrições de diferenças.
7. Prove o Corolário 24.3 do livro texto.
8. Dado um grafo orientado ponderado G = (V, E) sem ciclos de peso negativo, seja m o máximo
sobre todos os pares de vértices u, v ∈ V do número mínimo de arestas em um caminho mais
curto de u até v. (Aqui, o caminho mais curto é por peso, não pelo número de arestas.) Sugira
uma mudança simples no algoritmo de Bellman-Ford que permita encerrá-lo em m + 1
passagens.
9. Modifique o algoritmo de Bellman-Ford de modo que ele defina d[v] como – ∞ para todos os
vértices v para os quais existe um ciclo de peso negativo em algum caminho a partir da origem
até v.
10. Seja G = (V, E) um grafo orientado ponderado com função peso w : E→ R. Forneça um
algoritmo de tempo O(|V||E|) afim de encontrar, para cada vértice v em V, o valor
δ*(v) = min u∈ V { δ(u, v) } .
11. Suponha que um grafo orientado ponderado G = (V, E) tenha um ciclo de peso negativo.
Forneça um algoritmo eficiente para listar os vértices de um tal ciclo. Prove que seu algoritmo é
correto.
12. Suponha que mudamos a linha 3 de DAG-PATHS para:
3 for os primeiros |V| – 1 vértices, tomados em seqüência ordenada topologicamente.
Mostre que o procedimento continuaria sendo correto.
Projeto e Análise de Algoritmos
Tarefa L12
Pg. 3
Prof. André Amaral
13. A formulação de diagramas PERT dada anteriormente é um tanto antinatural. Seria mais
natural que os vértices representassem serviços e arestas, restrições de sequenciamento; isto é, a
aresta (u, v) indicaria que o serviço u deve ser executado antes do serviço v. Então, seriam
atribuídos pesos a vértices, e não a arestas. Modifique o procedimento DAG-SHORTESTPATHS (Seção 24.2 do livro texto) de forma que ele encontre um caminho mais longo em um
grafo acíclico orientado com vértices ponderados em tempo linear .
14. Forneça um algoritmo eficiente para contar o número total de caminhos em um grafo acíclico
orientado. Analise seu algoritmo.
15. Pelo fato do algoritmo de Dijkstra sempre escolher o vértice "mais leve" ou "mais próximo"
em V– S para adicionar ao conjunto S, dizemos que ele utiliza uma estratégia gulosa. Note que,
as estratégias gulosas nem sempre produzem resultados ótimos em geral, mas, o algoritmo de
Dijkstra realmente calcula caminhos mais curtos. Mostrar que se executarmos o algoritmo de
Dijkstra sobre um grafo orientado ponderado G = (V, E) com função peso não negativa w e
origem s, ele termina com d[u] = δ(s, u) para todos os vértices u ∈ V.
16. Explique o algoritmo de pesquisa primeiro na extensão (ver Seção 22.2 do livro texto).
17. Explique porque o algoritmo de Dijkstra é semelhante à pesquisa primeiro na extensão.
18. Explique porque o algoritmo de Dijkstra é semelhante ao algoritmo para calcular árvores de
amplitude mínima de Prim .
19. Execute o algoritmo de Dijkstra sobre o grafo orientado da Figura 24.2 do livro texto,
primeiro usando o vértice s como origem, e depois usando o vértice y como origem. No estilo da
Figura 24.6 do livro texto, mostre os valores de d e pi e os vértices no conjunto S após cada
iteração do loop while.
20. Forneça um exemplo simples de um grafo orientado com arestas de peso negativo para o qual
o algoritmo de Dijkstra produza respostas incorretas. Por que a prova do Teorema 24.6 do livro
texto não é válida quando são permitidas arestas de peso negativo?
21. Suponha que mudamos a linha 4 do algoritmo de Dijkstra para o seguinte:
4 while |Q| > 1
Essa mudança faz o loop while ser executado |V|– 1 vezes em lugar de |V| vezes. Esse algoritmo
proposto é correto?
Projeto e Análise de Algoritmos
Tarefa L12
Pg. 4
Prof. André Amaral
22. Temos um grafo orientado G = (V, E) no qual cada aresta (u, v) em E tem um valor associado
r(u, v), o qual é um número real no intervalo 0 ≤ r(u, v) ≤ 1 que representa a confiabilidade de um
canal de comunicação do vértice u até o vértice v. Interpretamos r( u, v) como a probabilidade de
que o canal de u até v não venha a falhar, e supomos que essas probabilidades são independentes.
Forneça um algoritmo eficiente para encontrar o caminho mais confiável entre dois vértices
dados.
23. Seja G = (V, E) um grafo orientado ponderado com função peso w : E → {1, 2, ..., W} para
algum inteiro positivo W, e suponha que não existam dois vértices com os mesmos pesos de
caminhos mais curtos a partir do vértice de origem s. Agora, suponha que definimos um grafo
orientado não ponderado G' = (V ∪ V' , E') substituindo cada aresta (u, v) ∈ E por w(u, v) arestas
de peso unitário em série. Quantos vértices G' tem? Suponha agora que executamos uma
pesquisa primeiro na extensão sobre G' . Mostre que a ordem em que os vértices em V são
coloridos de preto na pesquisa primeiro na extensão de G' é igual à ordem em que os vértices de
V são extraídos da fila de prioridades na linha 5 de DIJKSTRA quando executado sobre G.
24. Seja G = (V, E) um grafo orientado ponderado com função peso w :E → {0,1, ..., W} para
algum inteiro não negativo W. Modifique o algoritmo de Dijkstra para calcular os caminhos mais
curtos a partir de um vértice de origem s dado no tempo O(W.|V| + |E|)
25. Modifique seu algoritmo do exercício anterior para ser executado no tempo
O((|V| +|E|) lg |W| ). (Sugestão: Quantos valores de caminhos mais curtos distintos podem existir
em V– S em qualquer instante?)
26. Suponha que temos um grafo orientado ponderado G = (V, E) em que as arestas que saem do
vértice de origem s pode ter pesos negativos, todos os outros pesos de arestas são não negativos e
não existe nenhum ciclo de peso negativo. Demonstre que o algoritmo de Dijkstra encontra
corretamente caminhos mais curtos a partir de s nesse grafo.
27. Seja A.x ≤ b um sistema de m restrições de diferenças em n incógnitas. Mostre que o
algoritmo de Bellman-Ford, quando é executado sobre o grafo de restrição correspondente,
n
maximiza
∑x
i =1
i
de acordo com A.x ≤ b e xi ≤ 0 para todo xi.
28. Mostre que o algoritmo de Bellman-Ford, quando executado sobre o grafo de restrição para
um sistema A.x ≤ b de restrições de diferenças, minimiza a quantidade (max{ xi } – min{ xi } ) de
acordo com A.x ≤ b. Explique como esse fato poderia ser útil se o algoritmo fosse usado para
programar serviços de construção.
Projeto e Análise de Algoritmos
Tarefa L12
Pg. 5
Prof. André Amaral
29. Suponha que toda linha na matriz A de um programa linear A.x ≤ b corresponda a uma
restrição de diferença, uma restrição de variável única da forma xi ≤ bk, ou a uma restrição de
variável única da forma –xi ≤ bk. Mostre como o algoritmo de Bellman-Ford pode ser adaptado
para resolver essa variedade de sistema de restrições.
30. Forneça um algoritmo eficiente para resolver um sistema A.x ≤ b de restrições de diferenças
quando todos os elementos de b são valores reais e todas as incógnitas xi devem ser inteiros.
31. Forneça um algoritmo eficiente para resolver um sistema A.x ≤ b de restrições de diferenças
quando todos os elementos de b são valores reais e um subconjunto especificado de algumas,
mas não necessariamente todas, as incógnitas xi devem ser inteiros.
32. Uma caixa d dimensional com dimensões (x1,x2,...,xd) se aninha dentro de outra caixa com
dimensões (y1,y2, ...,yd) se existe uma permutação π sobre {1, 2, ..., d} tal que xπ(1) < y1, xπ(2)
<y2,..., xπ(d) <y d.
a. Demonstre que a relação de aninhamento é transitiva.
b. Descreva um método eficiente para determinar se uma caixa d dimensional se aninha ou
não dentro de outra.
c. Suponha que você tenha recebido um conjunto de n caixas d dimensionais {B1, B2, ..., Bn}.
Descreva um algoritmo eficiente para determinar a mais longa seqüência Bi1 , Bi2 ,..., Bin de
caixas tal que Bi j fique aninhada dentro de Bi j +1 para j = 1, 2, ..., k – l. Expresse o tempo de
execução do seu algoritmo em termos de n e d.
Download