2.7 Algoritmos de Otimização: Busca com Informação
2.7.1 Algoritmo de Programação Dinâmica: Aspectos Gerais
O estudo sistemático do algoritmo de programação dinâmica teve início em 1955 com Richard Bellman, na Universidade de Princeton (EUA). Cabe esclarecer que a
palavra "programação", assim como no caso dos conteúdos inerentes à programação linear, se refere ao uso de tabelas para a resolução dos problemas propostos. A palavra “programação” também pode se entendida como a técnica usada para resolver um modelo, ou seja, o programa.
O algoritmo de programação dinâmica é utilizado em problemas de otimização nos quais escolhas devem ser feitas com o objetivo de se alcançar uma solução ótima. Programação dinâmica é a técnica utilizada para a resolução de problemas de otimização quando nem todas as variáveis da função-custo estão simultaneamente inter- relacionadas (BALLARD e BROWN, 1982). A resolução de um problema envolvendo programação dinâmica conduz à decomposição do problema original numa seqüência de problemas isolados, mais simples e de mesma natureza ou de natureza similar, unidos por via recursiva.
2.7.1.1 O Algoritmo de Programação Dinâmica
Dado um problema P, quando nem todas as variáveis de P estão simultaneamente interrelacionadas, pode-se decompor P em uma seqüência de problemas menores e isolados P' (mais simples), de natureza igual ou semelhante a de P, unidos por via recursiva, de modo que, resolvendo a seqüência de subproblemas P', obtém-se uma solução para P. Freqüentemente, estes subproblemas não diferem entre si. Porém, algumas vezes, pode ocorrer que na decomposição de P surjam m1 problemas do tipo P'1, m2 problemas do tipo P'2,
e assim por diante. Pode-se pensar que, neste caso, seria mais interessante solucionar P em um único passo, ao invés de solucionar os mi problemas P'i. No entanto, a resolução direta de P
pode esbarrar em um alto grau de complexidade. Assim, a solução do problema corresponde essencialmente em: 1) a cada subproblema P'i solucionado (etapa), a partir das variáveis locais
envolvidas na etapa (variáveis de estado), armazena-se o resultado em tabelas; 2) após a solução dos subproblemas, determina-se uma solução ótima para P efetuando-se uma trajetória reversa pelas tabelas computando-se os valores nelas expressos (CARVALHO et al., 1999). O armazenamento em tabelas permite o acesso a cada solução particular de P'i em
qualquer momento.
Furtado (1973) especifica que, esta técnica destina-se a encontrar uma solução ótima (mínima ou máxima) e que, com pequenas alterações, tal esquema pode ser
estendido para determinar não um, mas todos os caminhos ótimos subsequentes alternativos. Pode-se então afirmar que, o algoritmo de programação dinâmica segue o princípio de otimalidade, ou seja, a melhor seqüência de decisões tem a propriedade de que, qualquer que seja a última decisão tomada, a seqüência de decisões que conduzem à última etapa deve ser também ótima (CARVALHO et al., 1999). Uma conseqüência importante do princípio de otimalidade, é que são necessárias apenas informações locais para os cálculos (CARVALHO et al., 1999).
2.7.1.2 Condições para a Obtenção de Solução por Programação Dinâmica
Esta seção visa responder: "Quando um determinado problema pode ter sua solução determinada pelo algoritmo de programação dinâmica?"
Para responder a esta pergunta, duas características fundamentais devem ser verificadas em um problema de otimização para que o algoritmo de programação dinâmica possa ser utilizado em sua resolução. Tais características são:
•
Subestrutura ÓtimaComo foi dito, um problema passível de ser resolvido por programação dinâmica é aquele no qual nem todas as variáveis envolvidas estão simultaneamente interrelacionadas. Assim, o problema inicial pode ser decomposto em uma série de problemas menores e similares de modo que se chegue à uma solução ótima por meio de uma retrobusca (bottom-up). Assim, dizer que um problema de otimização possui a característica de
subestrutura ótima significa dizer que o problema possui em seu interior soluções ótimas para seus subproblemas integrantes (CORMEN et al., 2002). Uma vez que, a solução ótima obtida a partir de programação dinâmica é composta das soluções dos subproblemas integrantes, deve-se garantir que no intervalo de subproblemas considerados estejam aqueles que determinam a solução ótima. Normalmente nos problemas de otimização deve-se considerar não somente a busca de uma solução como também o custo computacional relacionado à esta busca. Assim, pode-se verificar que o custo computacional depende do número de subproblemas e de quantas escolhas estão presentes em cada subproblema. Dessa forma, no caso de programação dinâmica, todos os subproblemas são resolvidos para que ao final se estabeleça a solução ótima, ou seja, a resolução do problema se dá de baixo para cima
(bottom-up), percorrendo as subestruturas ótimas em caminho inverso até estabelecer uma
solução ótima. Tem-se então que o custo computacional da solução do problema é normalmente igual ao somatório dos custos da resolução de cada subproblema mais o custo da obtenção da solução ótima em si. Assim sendo, o custo total do processo é diretamente proporcional à quantidade de subproblemas (ou subestruturas ótimas), relacionados com o problema original.
•
Subproblemas SuperpostosA segunda característica, que um problema passível de ser resolvido por programação dinâmica deve ter, é a de envolver subproblemas superpostos. Tal característica implica no fato de que o espaço de subproblemas deve ser pequeno, ou seja, os subproblemas devem, se possível, ser de mesma natureza, ou ainda, que o número de tipos de subproblemas seja mínimo. Assim, se um algoritmo recursivo reexaminar um número mínimo de subproblemas inúmeras vezes, pode-se lançar mão dessa característica resolvendo cada subproblema uma única vez, para cada entrada de dados, e armazenar as soluções em uma tabela, de modo que os valores inerentes aos cálculos já efetuados não sejam recalculados, mas apenas acessados (ou rememorados), usando um tempo constante por pesquisa.