A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Grafos - 1 Grafos oGrafo G = (V, E) V conjunto de vértices E conjunto de arestas (ou arcos) - cada aresta é um par de vértices (v, w), em que v, w V -

Apresentações semelhantes


Apresentação em tema: "Grafos - 1 Grafos oGrafo G = (V, E) V conjunto de vértices E conjunto de arestas (ou arcos) - cada aresta é um par de vértices (v, w), em que v, w V -"— Transcrição da apresentação:

1 Grafos - 1 Grafos oGrafo G = (V, E) V conjunto de vértices E conjunto de arestas (ou arcos) - cada aresta é um par de vértices (v, w), em que v, w V - se o par for ordenado, o grafo é dirigido, ou digrafo - um vértice w é adjacente a um vértice v se e só se (v, w) E - num grafo não dirigido com aresta (v, w) e, logo, (w, v) w é adjacente a v e v adjacente a w - as arestas têm por vezes associado um custo ou peso G1= (Cruzamentos, Ruas) G2 = (Cidades, Estradas)

2 Grafos - 2 Mais definições caminho sequência de vértices v 1, v 2, …, v n tais que (v i, v i+1 ) E, 1 i

3 Grafos - 3 Representação omatriz de adjacências a[u][v] = 1 sse (u, v) E elementos da matriz podem ser os pesos (sentinelas indicam não aresta) apropriada para grafos densos 3000 cruzamentos e troços de ruas (4 por cruzamento) de elementos na matriz!

4 Grafos - 4 Lista de adjacências oestrutura típica para grafos esparsos para cada vértice, mantém-se a lista dos vértices adjacentes vector de cabeças de lista, indexado pelos vértices espaço é O(|E| + |V|) pesquisa dos adjacentes em tempo proporcional ao número destes ografo não dirigido: matriz simétrica; lista com o dobro do espaço

5 Grafos - 5 Arestas class Edge { public Vertex dest; // Second vertex in Edge public double cost; // Edge cost public Edge( Vertex d, double c ) { dest = d; cost = c; }

6 Grafos - 6 Vértices class Vertex { public String name; // Vertex name public List adj; // Adjacent vertices public double dist; // Cost public Vertex prev; // Previous vertex on shortest path public int scratch;// Extra variable used in algorithm public Vertex( String nm ) { name = nm; adj = new LinkedList( ); reset( ); } public void reset( ) { dist = Graph.INFINITY; prev = null; pos = null; scratch = 0; } public PriorityQueue.Position pos; // Used for dijkstra2 (Chapter 23) }

7 Grafos - 7 Ordenação topológica impossível se o grafo for cíclico não é necessariamente única ( ) ou ( ) no exemplo anterior oalgoritmo simples: - descobrir um vértice sem arestas de chegada - imprimir o vértice - eliminá-lo e às arestas que dele saem - repetir o processo no grafo restante Indegree(v) é o número de arestas (w, v) passagem sequencial do vector é O(|V|); com |V| chamadas: tempo é O( |V| 2 ) Ordenação dos vértices de um DAG tal que, se existe um caminho de v para w, então v aparece antes de w

8 Grafos - 8 Versão ineficiente void topsort()throws CycleFound { Vertex v, w; for(int conta = 0; conta <= NUM_VERTEX; conta ++) { v = novo_Vertice_Indegree_Zero(); if( v == null ) throw new CycleFound(); v.topNum = conta; for each w adjacent to v w.indegree--; }

9 Grafos - 9 Refinamento da ordenação topológica melhoria: em cada iteração, colocar numa fila (ou pilha) os vértices com indegree=0 em cada passo, é retirado da fila um qualquer dos vértices presentes ao actualizar o indegree na lista de adjacências do vértice a eliminar colocam- se na fila os que passam a ter indegree=0 inicialização põe na fila os vértices com indegree=0 à partida tempo de execução O(|E| + |V|) - o corpo do ciclo de actualização do indegree é executado no máximo uma vez por aresta - as operações na fila são executadas no máximo uma vez por vértice - a inicialização leva um tempo proporcional ao tamanho do grafo

10 Grafos - 10 Algoritmo refinado void topsort ()throws CycleFound { int counter = 0; Vertex v, w; Queue q; q= new Queue(); for each vertex v if ( v.indegree == 0 ) q.enqueue( v ); while( !q.isEmpty() ) { v = q.dequeue(); v.topNum = ++counter; for each w adjacent to v if( --w.indegree == 0 ) q.enqueue( w ); } if( counter != NUM_VERTEX ) throw new CycleFound(); }

11 Grafos - 11 Execução no grafo de exemplo indegree anterior a cada operação dequeue Vértice v v v v v v v enqueue v1v2v5v4v3,v7v6 dequeue v1v2v5v4v3v7v6

12 Grafos - 12 Caminho mais curto Dado um grafo pesado G = (V, E) e um vértice s, obter o caminho pesado mais curto de s para cada um dos outros vértices em G oExemplo: rede de computadores, com custo de comunicação e de atraso dependente do encaminhamento (o caminho mais curto de v7 para v6 tem custo 1) arestas com custo negativo complicam o problema ciclos com custo negativo tornam o caminho mais curto indefinido (de v4 a v7 o custo pode ser 2 ou -1 ou -7 ou …) oOutro exemplo: se o grafo representar ligações aéreas, o problema típico poderá ser: Dado um aeroporto de partida obter o caminho mais curto para um destino não há algoritmo que seja mais eficiente a resolver este problema do que a resolver o mais geral

13 Grafos Caminho não pesado opretende-se o comprimento dos caminhos: pode ser visto como um caso particular em que o peso de cada aresta é unitário começa-se por marcar o vértice inicial s com comprimento 0 sucessivamente, passa-se aos que lhe estão adjacentes e marcam-se com mais 1 do que o valor do caminho até ao antecedente progride-se por níveis, passando ao nível seguinte só depois de ter esgotado o anterior oeste tipo de pesquisa em grafos designa-se por pesquisa em largura semelhante à travessia por níveis de uma árvore ocódigo usa uma tabela em que regista, para cada vértice v - a distância de cada vértice ao inicial (dist) - se o vértice já foi processado (known) - qual o antecessor no caminho mais curto (path)

14 Grafos - 14 Evolução da marcação do grafo v1v2 v3 v4v5 v6v7 v1v2 v3 v4v5 v6v7 v1v2 v3 v4v5 v6v v1v2 v3 v4v5 v6v

15 Grafos - 15 Algoritmo básico void unweighted( Vertex s) { Vertex v, w; s.dist = 0; for(int currDist = 0; currDist < NUM_VERTEX; currDist++) for each vertex v if( !v.known && v.dist == currDist ) { v.known = true; for each w adjacent to v if( w.dist == INFINITY ) { w.dist = currDist + 1; w.path = v; }

16 Grafos - 16 Eficiência do algoritmo básico tempo de execução O(|V|^2), devido aos ciclos for encaixados oremoção da ineficiência semelhante à da ordenação topológica em cada momento, só existem dois tipos de vértices não processados com Dist - os do nível corrente ( dist = currDist ) ainda não processados e os adjacentes a estes já marcados no nível seguinte ( dist= currDist+1 ) podiam guardar-se em duas caixas diferentes mas, como só se marca o primeiro do nível seguinte depois de ter todos os do nível corrente, basta usar uma fila o atributo known não é usado nesta solução

17 Grafos - 17 Algoritmo refinado otempo de execução é O(|E| + |V|), com grafo representado por lista de adjacências void unweighted( Vertex s) { Vertex v, w; Queue q; q= new Queue(); q.enqueue (s); s.dist = 0; while( !q.isEmpty() ) { v = q.dequeue(); v.known = true; //agora desnecessário for each w adjacent to v if( w.dist == INFINITY ) { w.dist = v.dist + 1; w.path = v; q.enqueue( w ); } }}

18 Grafos - 18 Evolução da estrutura de dados v v v 3 1 1v 3 11v 3 v v 1 0 2v 1 v v v 1 0 2v 1 v v v 3 01v 3 11v 3 v Q v3v3 v 6, v 2, v 4 v 2, v 4 v 1, v 6 Início Visita v 3 Visita v 1 Visita v 6 knownd v p v

19 Grafos - 19 Evolução da estrutura de dados v v 1 11v 3 11v 3 1 1v 3 11v 3 v 2 1 2v 1 1 2v 1 1 2v 1 1 2v 1 v v 4 0 2v 1 1 2v 1 1 2v 1 1 2v 1 v 5 0 3v 2 0 3v 2 1 3v 2 1 3v 2 v 6 11v 3 11v 3 11v 3 11v 3 v v 4 0 3v 4 0 3v 4 Q v7v7 (vazia)v 5, v 7 Visita v 4 Visita v 5 Visita v 7 Knownd v p v v 4, v 5 Visita v 2

20 Grafos Caminho pesado oa solução é uma modificação da anterior cada vértice mantém uma distância ao inicial, obtida somando pesos nos caminhos quando se declara um vértice known, exploram-se os seus adjacentes; se o caminho através deste nó é melhor que o já registado, modifica-se este distância corrente em cada vértice: a melhor usando apenas vértices já processados o ponto crucial: escolher para declarar known o vértice que tiver o menor custo até ao momento é o único cujo custo não pode diminuir todas as melhorias de caminhos que usam este vértice são exploradas oeste é um exemplo de um algoritmo ganancioso: em cada passo faz o que melhora o ganho imediato orestrição: só é válido se não existirem custos negativos oregista-se o vértice antecedente, responsável directo pelo custo estimado; seguindo a sequência recupera-se o caminho mínimo

21 Grafos - 21 Evolução do algoritmo de Dijkstra v1v2 v3 v4v5 v6v , 8 9, 8, 6

22 Grafos - 22 Estádios do algoritmo de Dijkstra v1v2 v3 v4v5 v6v v1v2 v3 v4v5 v6v v1v2 v3 v4v5 v6v v1v2 v3 v4v5 v6v

23 Grafos - 23 Estádios do algoritmo de Dijkstra v1v2 v3 v4v5 v6v v1v2 v3 v4v5 v6v v1v2 v3 v4v5 v6v v1v2 v3 v4v5 v6v

24 Grafos - 24 Evolução da estrutura de dados v v v v 1 0 2v 1 1 2v 1 v v 4 0 3v 4 v v 1 1 1v 1 1 1v 1 v v 4 03v 4 v v 4 09v 4 v v 4 05v 4 Início Visita v 1 Visita v 4 Visita v 2 knownd v p v

25 Grafos - 25 Evolução da estrutura de dados v v v 2 1 2v 1 12v 1 1 2v 1 1 2v 1 v 3 0 3v 4 1 3v 4 1 3v 4 1 3v 4 v 4 1 1v 1 11v 1 1 1v 1 1 1v 1 v 5 13v 4 13v 4 13v 4 13v 4 v 6 09v 4 08v 3 06v 7 16v 7 v 7 05v 4 05v 4 15v 4 15v 4 Visita v 3 Visita v 7 Visita v 6 knownd v p v Visita v 5

26 Grafos - 26 Algoritmo de Dijkstra void Dijkstra( Vertex s) { Vertex v, w; s.dist = 0; for( ; ; ) { v = vertice_a_menor_distancia; if( v == null ) break; v.known = true; for each w adjacent to v if( !w.known ) if v.dist + c(v,w) < w.dist ) { w.dist = v.dist + c(v,w); w.path = v; } }}

27 Grafos - 27 Análise do algoritmo oproblema: pesquisa do mínimo método de percorrer a tabela até encontrar o mínimo é O(|V|) em cada fase; gasta- se O(|V| 2 ) tempo ao longo do processo tempo de corrigir a distância é constante por actualização e há no máximo uma por aresta, num total de O(|E|) tempo de execução fica O(|E| + |V| 2 ) = O(|V| 2 ) se o grafo for denso |E| = (|V| 2 ) e o resultado é satisfatório pois corre em tempo linear no número de arestas se o grafo fôr esparso |E| = (|V|), o algoritmo é demasiado lento omelhoria: manter as distâncias numa fila de prioridade para obter o mínimo eficientemente O(log |V|), com uma operação deleteMin como as distâncias vão sendo alteradas no processo e a operação de Busca é ineficiente nas filas de prioridade, pode-se meter na fila mais do que um elemento para o mesmo vértice, com distâncias diferentes, e ter o cuidado, ao apagar o mínimo, de verificar se o vértice já está processado O(|E| log |V|) actualização dos pesos com operação decreaseKey na fila O(|V| log |V|) percorrer os vértices com operação deleteMin para cada Tempo de execução total: O(|E| log |V|)

28 Grafos Arestas com custos negativos oAlgoritmo de Dijkstra não funciona custo ao longo de um caminho não é monótono depois de se marcar um vértice como processado pode aparecer um caminho mais longo mas com custo inferior oCombinar os algoritmos para os caminhos pesado e sem peso usar uma fila; colocar o vértice inicial em cada passo -retirar um vértice v da fila -para cada vértice w adjacente a v tal que dist(w) dist(v) + cost(v, w) actualizar dist(w), path(w) e colocar w na fila, se lá não estiver -manter uma indicação de presença na fila

29 Grafos - 29 Exemplo: custos negativos Achar os caminhos de menor custo a começar em 1.     0 Dijkstra vértice 2 não altera nada … seria necessário rever 4 e propagar as alterações; piora o tempo … pretendido:

30 Grafos - 30 Algoritmo com custo negativo pode ser necessário processar cada vértice mais do que uma vez (max: |V|) actualização pode ser executada O(|E|.|V|), usando listas de adjacência void weightedNegative( Vertex s) { Vertex v, w; Queue q; q = new Queue(); q.enqueue (s); while( !q.isEmpty() ) { v = q.dequeue(); for each w adjacent to v if v.dist + c(v,w) < w.dist ) { w.dist = v.dist + c(v,w); w.path = v; if(w not in q) ) q.enqueue(w); } ciclo de custo negativo algoritmo não termina teste de terminação: algum vértice sai da fila mais do que |V|+1 vezes

31 Grafos Grafos acíclicos osimplificação do algoritmo de Dijkstra exigência de selecção, em cada passo, do vértice mínimo é dispensável nova regra de selecção: usar a ordem topológica um vértice processado jamais pode vir a ser alterado: não há ramos a entrar não é necessária a fila de prioridade ordenação topológica e actualização das distâncias combinadas numa só passagem oaplicações em processos não reversíveis não se pode regressar a um estado passado (certas reacções químicas) deslocação entre dois pontos em esqui (sempre descendente) oaplicações de Investigação Operacional modelar sequências de actividades em projectos grafos nó-actividade - nós representam actividades e respectiva duração - arcos representam precedência (um arco de v para w significa que a actividade em w só pode ser iniciada após a conclusão da de v) acíclico

32 Grafos - 32 Grafos Nó-Actividade Qual a duração total mínima do projecto? Quais as actividades que podem ser atrasadas e por quanto tempo (sem aumentar a duração do projecto)? A(3) D(2) E(1) C(3) B(2) F(3) G(2) K(4) H(1) iníciofim Nó: actividade e tempo associado Arco: precedência

33 Grafos - 33 Reformulação em Grafo Nó-Evento Nó: evento - completar actividade Arco: actividade reformulação introduz nós e arcos extra para garantir precedências A/3 B/2 C/3 E/1 D/ F/3 G/ H/1 K/4

34 Grafos - 34 Menor Tempo de Conclusão menor tempo de conclusão de uma actividade caminho mais comprido do evento inicial ao nó de conclusão da actividade problema (se grafo não fosse acíclico): ciclos de custo positivo adaptar algoritmo de caminho mais curto MTC(1) = 0 MTC(w) = max( MTC(v) + c(v,w) ) (v, w) E A/3 B/2 C/3 E/1 D/ F/3 G/ H/1 MTC : usar ordem topológica K/4 3

35 Grafos - 35 Último Tempo de Conclusão último tempo de conclusão: mais tarde que uma actividade pode terminar sem comprometer as que se lhe seguem UTC(n) = MTC(n) UTC(v) = min( UTC(w) - c(v, w) ) (v, w) E UTC : usar ordem topológica inversa A/3 B/2 C/3 E/1 D/ F/3 G/ H/ K/ valores calculados em tempo linear mantendo listas de adjacentes e de precedentes dos nós

36 Grafos - 36 Folgas nas actividades folga da actividade folga(v,w) = UTC(w)-MTC(v)-c(v,w) A/3/0 B/2/2 C/3/0 E/1/2 D/2/1 F/3/0 G/2/2 H/1/ K/4/ Caminho crítico: só actividades de folga nula (há pelo menos 1)


Carregar ppt "Grafos - 1 Grafos oGrafo G = (V, E) V conjunto de vértices E conjunto de arestas (ou arcos) - cada aresta é um par de vértices (v, w), em que v, w V -"

Apresentações semelhantes


Anúncios Google