Caminho Mínimo Geraldo Robson Mateus DCC - UFMG Definição Seja G=(N,A) um grafo simples finito ou não e um custo cij associado a cada arco (i,j) em G. Encontrar, se existir, um caminho com início N com custo em f e extremidade em T XXXX, mínimo. Modelo min i , j A cij xij 1 , se i O f xij xij 0 , se i N O D i , j S i i , j E i 1 , se i D s xij 0 i , j A Particularidades i. ii. iii. iv. v. Caso particular do problema de transbordo; Modelo de circulação de fluxo; xXXXXXX ij 0 ,1 ; Caminho para todos os nós ou um subconjunto Modelo linear - Algoritmo Simplex FCM Algoritmo Dijkstra Modelo dual max u f us ui u j cij ui livre u'i ui , i , j A ,i N u'i u'f menor distância do nó f ao nó i . cij 0 Caminho Mínimo - XXXX Inicialização: faça u'f 0 , X f Processo iterativo: (n-1 iterações) faça X N X seja u'p c pq min i , j X , X u'i cij faça u'q u'p c pq , q X Caminho Mínimo – cij quaisquer “A soma dos custos nos arcos de qualquer circuito em G é não negativa” u'i ui , i N max u u ' s ' f u u cij , i , j ' j ' i u livre , i N ' i Algoritmo cij quaisquer faça u'f 0 , u'i , i f ; se u'j u'i cij i , j então PARE selecione p , q tal que u'q u'p c pq faça u'q u'p c pq Como identificar circuito negativo? Recuperação do caminho se u's então não existe um caminho se u então existe nó k tal que u u cks ' s ' s ' k Algoritmo de Dijkstra S f ; para i N f faça d i c fi ; fimpara ; para i 1, n 1 faça escolha j N S tal que d j é mínimo ; faça S S j ; para k N S faça d k min d k , d j c jk fimpara ; fimalgoritmo ; Algoritmo (2) Seja P o conjunto dos nós cujo caminho mínimo foi encontrado. P N P; L j vetor contendo para cada j P do arco minimal de j . u'j - comprimento do caminho do nó inicial ao nó j. Inicialização para j N f faça L j f ; c se existe o arco u'j ij caso contrário ; fimpara ; P f ; P N f ; Processo f , j A; s P iterativo repita selecione k P tal que u'k min u'j ; jP faça P P k ; P P k ; para todo j P faça se u'k ckj u'j então faça u'j u'k ckj ; L j k ; fimse ; fimpara ; até P ; fimalgoritmo; Algoritmo cij quaisquer d(f) = 0 e L(f) = 0 d(j) = ∞ para todo j ∈ N – f Enquanto algum arco (i,j) satisfaz d(j) > d(i) + cij faça d(j) = d(i) + cij L(j) = i fimenquanto fimalgoritmo Complexidade: O(2 n) Exemplo 3 4 1 2 2 3 8 7 9 2 5 1 6 3 8 2 3 3 6 6 2 8 9 Extensões Um único nó destino, um conjunto de nós destinos, caminho mínimo para todos os nós Um único nó fonte, um conjunto de fontes, caminho mínimo de todos para o destino Algoritmo orientado ao alvo Caminho mínimo com janela de tempo Grafos n-partido Caminho mínimo entre quaisquer pares de nós Caminho crítico (PERT/CPM) Algoritmo para todo par de nós d(f) = 0 e L(f) = 0 d(i,j) = ∞ para todo (i,j) ∈ N x N d(i,i) = 0 para todo i ∈ N Para cada (i,j) ∈ A faça d(i,j) = cij , L(j) = i Enquanto a rede contem i, j, k | d(i,j) > d(i,k) + d(k,j) faça d(i,j) = d(i,k) + d(k,j) L(j) = pred(k,j) (predecessor de j no caminho de k para j. fimenquanto fimalgoritmo Complexidade: O(n3C) Algoritmo de Floyd-Warshall d(i,j) = ∞ para todo (i,j) ∈ N x N e pred(i,j) = 0 d(i,i) = 0 para todo i ∈ N Para cada (i,j) ∈ A faça d(i,j) = cij , pred(i,j) = i Para cada K = 1, …, n faça Para cada (i,j) ∈ N x N faça Se d(i,j) > d(i,k) + d(k,j) então faça d(i,j) = d(i,k) + d(k,j) pred(i,j) = pred(k,j) fimse fimalgoritmo Complexidade: O(n3) Algoritmos e complexidade Algoritmo Autor Bellman-FordMoore Descrição Complexidade - O(nm) Com Parent Checking O(nm) Dijkstra - O(n2) Dial Usando buckets Cherkassky et al. Com Overflow Bags O(m+n(C/α+α)) Approximate buckets O(mβ+n(β+C/ β)) Double buckets O(m+n(β+C/ β)) Fibonacci Heap O(m+nlogn) Dijkstra Fredman e Tarjan K-array heap Ahuja et al. R-heap O(m+nC) O(mlogn) O(m+nlogC) Algoritmos e complexidade Algoritmo Autor Descrição Incremental Graph Pape O(n2n) Pallotino O(n2m) Threshold algorithm Glover et al. O(nm) Topological Ordering Goldberg e Radzik O(nm) Com atualizações de distância Comp. O(nm)