Edson Prestes
Caminhos de custo mínimo em grafo orientado Este problema consiste em determinar um caminho de custo mínimo a partir de um vértice fonte a cada vértice do grafo. Considere um grafo orientado G = < V, E > com 5 vértices: V = {a, b, c, d, e} e 6 arestas com a seguinte matriz de custos:
Algoritmo: Custo mínimo de caminhos a partir de fonte em grafo orientado Inicialização [v 0,v i ] Iteração Finalização
O algoritmo recebe como entrada Um grafo orientado valorado G com fonte v 0 e uma matriz de custos fornece como saída Um vetor dist (com os custos dos melhores caminhos a partir de v 0 ). Consideremos um grafo orientado G com conjunto V = { v 0, v 1,, v n } de vértices. As operações fundamentais do algoritmo são as manipulações com conjuntos (de vértices) e matrizes; e para o tamanho da entrada o número n de vértices não fonte.
O desempenho do Algoritmo tem contribuições dadas por suas componentes: inicialização, iteração e finalização. Inicialização A inicialização fornece valores iniciais às variáveis. Portanto, temos Logo,
A iteração executa n vezes a seleção, remoção e inclusão de um elemento na resposta parcial se viável. } As variáveis p e dist variam da seguinte maneira Iteração
No ínicio da i-ésima iteração, p i = n - i + 1 O desempenho da iteração é dado pela soma das contribuições das linhas de 4 a 5 e das linhas de 6 a 9. As cotas superiores para as linhas 4 e 5 são Iteração Logo,
As cotas superiores para o desempenho das linhas 7 e 8 são Logo, temos Iteração O desempenho do corpo da iteração na i-ésima iteração é
A iteração repete n vezes o corpo da iteração, logo o seu desempenho é
O desempenho do algoritmo é dado predominantemente pelo desempenho da inicialização e da iteração. Assim, temos A complexidade pessimista do algoritmo é
A complexidade pessimista de um algoritmo guloso é A complexidade pessimista da iteração é dada por
Programação Dinâmica A programação dinâmica costuma ser aplicada a problemas de otimização resultando, em geral, em algoritmos mais eficientes que os mais diretos. Esse método é útil quando não é fácil chegar a uma seqüência ótima de decisões sem testar todas as seqüências possíveis para então escolher a melhor. A cada passo são eliminadas subsoluções que certamente não farão parte da solução ótima do problema. Ele reduz drasticamente o número total de seqüências viáveis através de um mecanismo que evita aquelas seqüências que sabidamente não podem resultar em seqüências ótimas.
Em alguns casos, o algoritmo direto tem complexidade exponencial, enquanto que o algoritmo desenvolvido por programação dinâmica é polinomial. Outras vezes, a complexidade continua exponencial, mas de ordem mais baixa. A programação dinâmica pode ser aplicada em diversos problemas : - multiplicação de várias matrizes; - caminhos de custo mínimo em grafos orientados; - projeto de sistemas confiáveis; - casamento de strings; - problema do caixeiro viajante; - problema de linha de montagem; - extração de eixo de rodovias em processamento de imagens aéreas, entre outros
Problema de Multiplicação de Matrizes Consiste em determinar a seqüência ótima de multiplicações de n matrizes Sabemos que Este cálculo exige p.q.r multiplicações. Considere o seguinte exemplo
1a. Maneira A quantidade de operações é dada por = 218000 operações 2a. Maneira A quantidade de operações é dada por = 18150 operações
Para este caso, o algoritmo direto tem complexidade exponencial no número de matrizes Usando a programação dinâmica encontramos um algoritmo de complexidade polinomial. Multiplicação de Matrizes Série de Fibonacci
Multiplicação de Matrizes
Como minimizar ou reduzir a redundância de trabalho? Devemos resolver os problemas menores e utilizá-los para resolver os maiores
Dado o problema Considere o subproblema (ou subseqüência) Com 1 i <j n e custo mínimo dado por i m j.. Considere i m i =0, para i=1,, n
A matriz 2 M 3 é uma matriz 3 x 40, ou seja, b 1 x b 3 Portanto, uma matriz i M j é uma matriz b i-1 x b j
O cálculo de i M j com custo mínimo i m j pode ser decomposto em dois subproblemas. Considere i k<j, logo Onde i M k tem custo mínimo i m k e dimensões b i-1 x b k (k+1) M j tem custo mínimo (k+1) m j e dimensões b k x b j O custo associado ao cálculo de i M k x (k+1) M j, é dado por ( i m k + (k+1) m j ) + ( b i-1 x b k x b j ). O custo mínimo é dado por
Considere o produto das seguintes matrizes Inicialmente temos, i m i =0, para i=1,2 e 3. O produto de 2 matrizes pode ser feito das seguintes maneiras 1 m 2 =2 x 30 x 20 =1200 2 m 3 =30 x 20 x 5=3000
O produto de 3 matrizes pode ser feito das seguintes maneiras Vimos que o custo mínimo é dado por Temos 2 valores possíveis para k, k=1 e k=2. Para k=1 temos 1 m 3 = 1 m 1 + 2 m 3 + 2 x 30 x 5 =300+3000 = 3300 Para k=2 temos 1 m 3 = 1 m 2 + 3 m 3 +2 x 20 x 5 =1200+200 =1400
Este processo assemelha-se ao preenchimento de uma matriz =3300 =1400