árvore geradora mínima caminhos mínimos problemas tipo 1 desejase conectar todos os computadores em um prédio usando a menor quantidade possível de cabos uma companhia aérea deseja voar para algumas cidades mas usando um conjunto de rotas que minimize o total de distâncias percorridas problema tipo 2 alguém precisa se deslocar de uma cidade para outra. Existem várias estradas que passam por diversas cidades. Qual delas oferece uma trajetória de menor caminho? como resolver esses problemas? dentre as possibilidades de conexão, achar a que usa menor quantidade de cabos e achar a que usa menor distância entre as cidades (problemas tipo 1); e encontrar o caminho mínimo entre duas cidades (problema tipo 2) C421C árvore geradora de um grafo um grafo não orientado G é uma árvore se satisfizer às condições G é conexo (para garantir a interligação de todos os vértices) G não tem ciclos e possui n vértices e n1 arestas uma árvore obtida pela remoção dos ciclos de um grafo é chamada de árvore geradora de um grafo seja o grafo G abaixo, a remoção de qualquer uma das arestas do ciclo, leva a uma árvore geradora G: C421C 1
uma árvore geradora mínima T é dentre todas as possíveis árvores geradoras do grafo, aquela que contém todos os vértices do grafo e apresenta a menor soma dos valores (pesos) associados às arestas árvore geradora mínima T cujo peso total é 12 T não é única, como podese observar no desenho abaixo: a aresta (3,5), pode ser substituída pela aresta (2,5), obtendose outra árvore geradora mínima de custo 12, também C421C solução dos problemas 1 e 2 obter um subconjunto T A (árvore geradora mínima) acíclico que conecta todos os vértices de G e cujo peso total p(t) = Σ p(u,v) T é minimizado algoritmos para obter a árvore geradora grafos não valorados algoritmo de PATON algoritmos para obter a árvore geradora mínima grafos valorados *** algoritmo de KRUSKAL algoritmo de PRIM *** os que serão abordados no curso C421C 2
algoritmo de KRUSKAL (1956) passo 1) inicie com os n vértices e nenhuma aresta passo 2) ordene (em ordem ascendente de peso) as arestas em um FILA passo 3) acrescente uma aresta ainda não colocada e que não fecha ciclo passo 4) repita o passo 3 até que as n1 arestas tenham sido colocadas encontre a árvore geradora mínima, por Kruskal para o grafo abaixo: C421C pseudocódigo do algoritmo de KRUSTAL procedimento KRUSKAL; início para cada v G faça {para cada vértice do conjunto de vértices do grafo G} defina um conjunto disjunto C(v) {v}; {v é representante de C(v) e não pode pertencer a outro} crie uma fila ordenada Q com todas as arestas de G {em ordem ascendente de peso} T ; {inicializa a árvore geradora mínima} enquanto (T tem menos de n1 arestas) faça {n é o número de vértices de G} início retire {u, v} da fila Q; se (C(u) <> C(v)) {aresta que não forma um ciclo, os vértices não pertencem à mesma árvore} então início insira aresta {u, v} em T; unifique C(u) e C(v) em um grupo C(u,v); {o representante pode ser u ou v} destrua C(u) e C(v); fim; fim; {enquanto} liste T; {imprime as arestas da árvore geradora mínima T} fim; C421C 3
algoritmo de KRUSKAL árvore geradora mínima do grafo anterior (T) T = {(1,4), (5,6), (1,2), (4,6), (2,3)} animação do algoritmo de KRUSKAL http://students.ceid.upatras.gr/~papagel/project/kruskal.htm C421C algoritmo de PRIM (1957) notação: Grafo não orientado G (V,A) S V S = V S δs = conjunto de arestas (u,v) de G com um extremo (u) em S e o outro (v) em S T = árvore geradora mínima passo 1) construa a matriz de adjacências MA de G com pesos em MA[u,v] passo 2) escolha um vértice u qualquer de G, faça S = {u} e S = V S passo 3) encontre em MA a aresta (u,v) de menor custo de δs cujo extremo v esteja em S passo 4) inclua v em S, retireo de S passo 5) inclua (u,v) em T passo 6) repita os passos 3, 4 e 5 até que n1 arestas tenham sido incluídas em T C421C 4
pseudocódigo do algoritmo de PRIM procedimento PRIM; início construa a matriz de adjacências (MA) de G; {MA[i, j] contém o peso associado à aresta} escolha um vértice u qualquer de G; S {u}; {inclua u no conjunto S} S V S; {faça S igual aos elementos de V os elementos de S} T ; {inicializa T} enquanto (T tem menos de n1 arestas) faça {n é o número de vértices} início construa δs; {conjunto de arestas (u,v) de G com um extremo (u) em S e o outro (v) em S } encontre em MA a aresta (u,v) de menor custo de δs; S S + {v}; {inclua v no conjunto S} S S {v}; {retira v do conjunto S } insira aresta {u,v} emt; fim; {enquanto} liste T; {imprime as arestas da árvore geradora mínima T} fim; C421C algoritmo de PRIM encontre a árvore geradora mínima por Prim para o grafo abaixo: T = {(1,4), (5,6), (1,2), (4,6), (2,3)} animação do algoritmo de PRIM http://students.ceid.upatras.gr/~papagel/project/prim.htm C421C 5
Grafos: caminhos mínimos quando o grafo é sem pesos, a determinação de um caminho mais curto pode ser feita através de uma busca em largura caminho mais curto é aquele que apresenta o menor número de arestas quando o grafo tem pesos associados às arestas, o caminho mais curto pode não ser o que usa menos arestas dado um grafo dirigido e ponderado G = (V,A), desejase obter o caminho P mais curto a partir de um dado vértice origem s V até cada v V o comprimento (ou peso) de um caminho P é a soma dos pesos das arestas que compõem P C421C Grafos: caminhos mínimos exemplo prático: alguém precisa se deslocar de uma cidade para outra. Para isso, ela dispõe de várias estradas, que passam por diversas cidades. Qual delas oferece uma trajetória de menor caminho? algoritmos para solucionar o problema do caminho mais curto: Dijkstra (grafos dirigidos e não dirigidos com pesos não negativos) *** BellmanFord (grafos com pesos negativos) *** o que será abordado no curso C421C 6
Grafos: caminhos mínimos algoritmo de DIJKSTRA (1959) encontra o comprimento (ou peso) mínimo a partir de um vértice de partida s até todos os outros vértices do grafo comprimento (ou peso) mínimo de origem única se o vértice de partida for outro (# s), rodase o algoritmo novamente notação: grafo dirigido ponderado G (V,A) s é o vértice origem D[v] é o menor comprimento (ou peso) estimado de s até v em um determinado instante se é igual a, não existe caminho entre s e v Q = V S (lista ordenada com menor valor de D[v]) S contém os vértices com os caminhos mais curtos calculados até o momento NVERT é o número de vértices do grafo G MA = matriz de adjacências e LA = lista de adjacências C421C algoritmo de DIJKSTRA Grafos: caminhos mínimos passo 1) inicialização de D[v]: D[s]=0 e demais, iguais a passo 2) usase dois conjuntos: S, que representa todos os vértices v com caminhos calculados até o momento e o Q, simbolizando todos os outros vértices (V S) passo 3) realizase uma série de relaxamentos das arestas (distância dos menores caminhos são atualizadas) relaxamento (ou relaxação) de uma aresta (u,v) consiste em verificar se é possível melhorar o melhor comprimento (mínimo) até v obtido até o momento (se isto acontecer, D[v] deve ser atualizado) C421C 7
Grafos: caminhos mínimos pseudocódigo do algoritmo de DIJKSTRA procedimento DIJKSTRA (V, MA, LA, s, NVERT); início para i 0 até NVERT1 faça {para todo vértice pertencente ao grafo} D[i] infinito; D[s] 0; Q V; S ; enquanto (Q <> ) faça {enquanto houver vértice em Q} início u retira (Q); S S + {u}; {retira de Q o vértice com menor valor de D[ ]} para cada v LA[u] faça {para cada adjacente de u} se (D[v] > D[u] + MA[u,v]) {relaxamento de (u,v)} então D[v] D[u] + MA[u,v]; fim; para i 0 até NVERT1 faça imprima de, s, até, i, =, D[ i ]; {imprime o comprimento mais curto de s a i} fim; C421C algoritmo de DIJKSTRA exemplo_1 Grafos: caminhos mínimos C421C 8
algoritmo de DIJKSTRA exemplo_1 (cont.) Grafos: caminhos mínimos C421C algoritmo Dijkstra em C++ http://www.misalgoritmos.com/source154.html animação do algoritmo de Dijkstra http://students.ceid.upatras.gr/~papagel/project/kef5_7_1.htm alguns links de animações de jogos utilizando teoria de grafos http://www.math.ucalgary.ca/~laf/colorful/colorful.html problemas clássicos da literatura que envolvem grafos sete pontes de Königsberg caixeiro viajante C421C 9
o problema das sete pontes de Königsberg: foram construídas sete pontes que cruzavam o rio Pregel, ligando diferentes partes da cidade (antiga Prússia) como mostra a figura: é possível fazer um percurso de tal forma que se inicie e volte à mesma posição passando por todas as pontes somente uma única vez? C421C o problema das sete pontes de Königsberg marca o início da teoria dos grafos o matemático suíço, Leonhard Euler, em 1736, provou que não existia caminho que possibilitasse tais restrições para isso transformou os caminhos (pontes) em retas (arestas) e suas intersecções (ilhas, áreas de terra) em pontos (vértices) 4 vértices e 7 arestas C421C 10
o problema das sete pontes de Königsberg a ser resolvido é possível achar um caminho que comece e termine num vértice qualquer (A, B, C, ou D) e passe por cada aresta uma única vez? partindo do vértice A, toda vez que se passa por qualquer outro vértice, duas arestas são usadas: a de chegada e a de saída se for possível achar uma rota que usa todas as arestas do grafo e que começa e termina em A, por exemplo, o número total de chegadas e saídas de cada vértice deve ser um valor múltiplo de 2 no entanto, grau(a) = grau(c) = grau(d) = 3 e grau(b) = 5 (????) portanto a travessia proposta não é possível, cada ponto deve ter um número par de caminhos (um para entrar e outro para sair) C421C o problema do caixeiro viajante: traveling salesman problem (TSP): determinar a viagem de custo mínimo que o vendedor deve efetuar para visitar todas as cidades no seu território de vendas, começando e acabando na mesma localidade suponha o mapa abaixo mostrando quatro cidades (A,B,C,D) e as distâncias em km entre elas C421C 11
o problema do caixeiro viajante solução: enumere todos os possíveis circuitos começando e terminando em A calcule a distância de cada um deles determine o menor deles Rota (distância em km): ABCDA 30+30+25+40 = 125 ABDCA 30+35+25+50 = 140 ACBDA 50+30+35+40 = 155 ACDBA 50+25+35+30 = 140 ADBCA 40+35+30+50 = 155 ADCBA 40+25+30+30 = 125 tanto a rota ABCDA ou ADCBA tem uma distância total de 125 km C421C o problema do caixeiro viajante algoritmo para resolver o TSP atualmente, por força bruta, como feito no exemplo anterior para o grafo com 30 vértices existem 29! 8.84 10 30 circuitos diferentes começando e terminando num determinado vértice mesmo se cada circuito puder ser achado e calculado em apenas 1µs, seriam necessários, aproximadamente, 2.8 10 17 anos para solucionar o problema de descoberta dos possíveis circuitos neste tipo de computador C421C 12
Exercício 1) Existem 5 computadores em um prédio de 2 andares e a direção da empresa deseja interligálos de forma que cada um possa se comunicar a qualquer outro através de cabos: as distâncias (em metros) entre os pares de computadores são dadas pela tabela abaixo Utilizando o algoritmo de KRUSKAL, ache qual deve ser o projeto de interligação dos computadores para que se utilize o menor número possível de cabos. Apresente a quantidade total (em metros) de cabo necessário para a execução do projeto. C1 C2 C3 C4 C5 C1 C2 4 C3 10 27 C4 34 18 16 C5 22 15 33 36 C421C Exercício 2) Existem 6 pequenas ilhas em um arquipélago e o governo deseja construir 5 pontes conectandoas de forma que cada ilha possa ser alcançada de qualquer outra ilha através de uma ou mais pontes: o custo de construção de uma ponte é proporcional ao seu comprimento as distâncias (em milhas) entre os pares de ilhas são dadas pela tabela abaixo Utilizando o algoritmo de PRIM, ache quais pontes devem ser construídas para que o custo da construção seja mínimo e apresente a extensão total (em milhas) das pontes a serem construídas. I1 I2 I1 I2 24 I3 21 27 I4 34 18 I5 12 22 I6 28 16 I3 16 33 30 I4 36 40 I5 31 I6 C421C 13
Exercício 3) O grafo abaixo corresponde ao projeto de uma rede de computadores. Os vértices correspondem às máquinas e as arestas correspondem à possibilidade de conexão entre duas máquinas, juntamente com o correspondente custo de operação (por unidade de tempo) de cada uma. Esta rede deverá ser construída de forma que cada computador possa se comunicar (direta ou indiretamente) com cada um dos outros computadores, sempre a um custo mínimo de operação. como se poderia determinar quais as conexões que são inúteis? qual é o custo de operação mínimo da rede? C421C Exercício 4) Execute o algoritmo de Dijkstra para os grafos (a e b) abaixo: considerando como vértice origem s, o vértice 4 para a) considerando como vértice origem s, o vértice 1 para b) C421C 14
Exercício 5) A Empresa Brasileira de Correios e Telégrafos de Santa Rita mantém vários postos de coleta de correspondência espalhados pela cidade, inclusive em bairros mais afastados. A localização e a quantidade destes postos são algumas vezes modificadas de forma que diariamente o motorista responsável por recolher a correspondência recebe um esquema que mostra o melhor percurso para passar em todos os postos de coleta. Este esquema é montado manualmente por um funcionário da E.C.T. Este funcionário não agüenta mais as reclamações do motorista de que as rotas que ele traça nunca são as melhores. O chefe, sem saber como tratar o problema, resolve contratar um especialista (você), para resolvêlo. Como você modelaria o problema? Como encontrar a melhor rota? Que particularidades devem ser tratadas? C421C 15