Edit page

Otimização em Grafos

Definições e Teoremas

Árvore

Grafo conexo que não tem ciclos

Exemplo

Árvore Exemplo

Teorema 1

Se TT é uma árvore de ordem pp e tamanho qq, então

q=p1q = p-1

Relembrar

Ordem de um grafo (p)(p)

  • Número de vértices

Tamanho de um grafo (q)(q)

  • Número de arestas

Teorema 2

Um grafo gg de ordem pp é uma árvore, se e só se é conexo e tem tamanho q=p1q=p-1.

Árvore de cobertura

Seja gg um grafo, TT é a sua Árvore de Cobertura se:

  • É uma árvore
  • É um subgrafo de gg que contém todos os vértices
Exemplo

Cobertura Exemplo

Custo de árvore

Dada uma Rede (V,E,c)(V,E,c), o custo de uma árvore de cobertura TT da Rede é o somatório de todos os valores das arestas de TT.

Relembrar

Rede é um grafo com um valor real associado a cada aresta.

Exemplo

Custo Exemplo

O custo da árvore representada é 21.121.1

Árvore de cobertura mínima

Árvore de cobertura de uma Rede RR, cujo custo é menor ou igual que o custo de qualquer outra Árvore de cobertura de RR.

Árvore Económica

Árvore de cobertura construída através do Algoritmo de Kruskal.

Algoritmos

Algoritmo de Kruskal

Pseudo-Código

Kruskal Pseudo

Descrição Informal

Assinalam-se sempre as arestas de custo mínimo, se não formarem ciclos. Caso forme um ciclo, a aresta é identificada e ignorada durante resto da execução do Algoritmo.
O Algoritmo de Kruskal termina quando todas as arestas já foram analisadas. Tanto podem estar assinaladas ou identificadas como arestas que completam ciclos.
O resultado final é uma Árvore Económica, que também será uma Árvore de Custo mínimo.

NOTA

Por convenção, só se deve identificar arestas que formam ciclos, quando o valor dessa aresta for o mínimo das arestas ainda por analisar.

Exemplos:

Exemplo 1
Exemplo 2

Também se pode usar o Algoritmos de Kruskal para encontrar uma árvore de cobertura máxima, basta ir assinalando as arestas pela ordem inversa (1º as que têm valor máximo).
No entanto, esse método não pode ser chamado Algoritmo de Kruskal, é apenas uma adaptação

Teorema - Correção de Kruskal

AVISO

Mais um Teorema, cuja Demonstração é importante saber para preparar a Demonstração que sai no teste

Uma Árvore Económica de uma Rede é sempre uma árvore de custo mínimo dessa Rede.

Demonstração

Seja N=(V,E,c)N=(V,E,c) uma Rede, TT uma Árvore Económica construída com o Algoritmo de Kruskal e T0T_0 a árvore de custo mínimo (é conhecida).

Através do Teorema 1, sabe-se que TT e T0T_0 têm p1p-1 arestas (pp é o número de vértices da Rede NN).
Seja a1,,ai,,ap1a_1,\dots,a_i,\dots,a_{p-1} a sequência de arestas de TT assinaladas através do Algoritmo de Kruskal.
Seja aia_i a primeira aresta que pertence a TT e não pertence a T0T_0. Se adicionarmos aia_i a T0T_0, ficaríamos com um ciclo em vez de uma árvore, porque ficávamos com pp arestas, e, novamente pelo Teorema 1, uma árvore só pode ter p1p-1 arestas.
Nesse ciclo, há necessariamente uma aresta, aka_k, que não pertence a TT, se removermos aka_k de T0T_0 ficamos com uma nova árvore, T0T_0'.

T0=T0+aiakT_0' = T_0+a_i-a_k

Importante (chave do Teorema)
No Algoritmo de Kruskal escolhe-se sempre as arestas por ordem crescente do valor. Por isso, se aka_k não está em TT e todas as arestas até aia_i estão em TT e T0T_0 (foram feitas sempre as mesmas escolhas), das duas uma:

  • aka_k e aia_i têm o mesmo custo, mas se escolhermos uma delas a outra completará um ciclo, e para TT escolheu-se aia_i, ficando aka_k de fora
  • Custo de aka_k é superior, e as escolhas que foram feitas para TT fizeram com que aka_k completa-se um ciclo

Em suma, é impossível que o custo de aka_k seja inferior ao de aia_i.

Relembrando que T0T_0 é a árvore de custo mínimo, sabemos que:

  • c(T0)c(T0)\operatorname{c}(T_0')\geq \operatorname{c}(T_0)
  • c(T0)=c(T0)+c(ai)c(ak)\operatorname{c}(T_0') = \operatorname{c}(T_0)+\operatorname{c}(a_i)-\operatorname{c}(a_k)
  • c(ai)c(ak)\operatorname{c}(a_i)\leq \operatorname{c}(a_k)

Pelas condições apresentadas, conclui-se que a única solução possível será quando c(ai)=c(ak)\operatorname{c}(a_i) = \operatorname{c}(a_k), então c(T0)=c(T0)\operatorname{c}(T_0')=\operatorname{c}(T_0).

Repare-se que T0T_0' e TT têm mais uma aresta em comum, aka_k, do que T0T_0 e TT.

Este processo é recursivo. Seja TkT_k a árvore com custo igual a T0T_0 que se obtém no final de processo descrito acima, por exemplo, agora teríamos Tk=T0T_k=T_0'.
Se fossemos aplicando o processo para cada TkT_k (TkT_k seria agora o novo T0T_0), para todas as arestas que restam de TT (ai+1,(a_{i+1},\dots ap1)a_{p-1}), ignorando as arestas que já são comuns, no final, o último TkT_k será igual a TT e como o custo de TkT_k é igual ao de T0T_0, concluí-se que TT também será uma Árvore de custo mínimo.

QED

Algoritmo de Dijkstra

Este Algoritmo resolve o Problema da Trajetória mínima.

Pseudo-Código

Dijkstra Pseudo

Descrição Informal

Seja v1v_1 o vértice de partida, SS o conjunto de arestas, ainda não percorridas, que não fazem ciclos e que incidem nos vértices já percorridos (vamos chamar ao conjunto de vértices já percorridos QQ).
Seja F(i)\operatorname{F}(i) uma função que atribui a um vértice viv_i, já percorrido, o custo necessário para lá chegar.

No início Q={v1}Q=\{v_1\}, por isso, escolhe-se a aresta que incide em v1v_1 com menor valor associado.
Agora #Q>1\#Q>1, por isso, em vez de escolhermos a aresta com menor valor disponível em SS, escolhemos uma aresta que incida num novo vértice vkv_k, tal que ,de todos os vértices ainda por explorar, F(k)\operatorname{F}(k) é o mínimo de todos os F(i)\operatorname{F}(i) desse conjunto.
O Algoritmo termina quando tivermos um custo associado a todos os vértices.

O resultado final será uma Árvore de Cobertura, onde para cada viv_i, F(i)\operatorname{F}(i) é o custo mínimo possível.

Exemplos

Exemplo 1
Exemplo 2
Exemplo 3