Programação Dinâmica
Programação dinâmica (PD; em inglês: dynamic programming, DP) é um método para resolver problemas complexos de otimização, baseado na decomposição do problema original em uma sequência de subproblemas mais simples[1][2]. O método é aplicado a processos de tomada de decisão multiestágio, onde a solução ótima para o problema inteiro pode ser construída a partir das soluções ótimas de seus subproblemas.
O termo foi introduzido pelo matemático americano Richard Bellman na década de 1950[3]. Nesse contexto, a palavra "programação" é usada no sentido de "planejamento" ou "elaboração de um plano de ação ótimo", e não na escrita de código de computador[4].
Propriedades e Teoremas Fundamentais
A aplicabilidade da programação dinâmica a um problema é determinada pela presença de duas propriedades fundamentais.
Princípio da Otimalidade de Bellman
O conceito central do método é o princípio da otimalidade de Bellman (em inglês: Bellman's principle of optimality). Ele afirma que: quaisquer que sejam o estado inicial e a decisão inicial, as decisões subsequentes devem constituir uma estratégia ótima em relação ao estado resultante da primeira decisão[3].
Em outras palavras, qualquer parte de uma trajetória ótima é, por si só, ótima. Essa propriedade permite decompor o problema geral em uma sequência de subproblemas mais simples e resolvê-los recursivamente.
Subproblemas sobrepostos
Um problema possui a propriedade de subproblemas sobrepostos (em inglês: overlapping subproblems) se, ao resolvê-lo recursivamente, os mesmos subproblemas surgem repetidamente. A PD evita cálculos repetidos, armazenando as soluções de subproblemas já encontrados (essa técnica é chamada de memoização ou tabulação), o que aumenta significativamente a eficiência em comparação com uma busca recursiva ingênua.
Equação de Bellman
Do princípio da otimalidade deriva a principal relação de recorrência do método — a equação de Bellman[1]. Ela relaciona o "valor" (ganho ou custo ótimo) do estado atual com os valores dos estados subsequentes. Em sua forma geral, para um processo determinístico multiestágio com uma função objetivo aditiva, ela tem a seguinte aparência:
onde:
- — número da etapa (de a 1);
- — estado do sistema na etapa ;
- — decisão de controle tomada na etapa ;
- — ganho (ou custo) na k-ésima etapa;
- — função que define o novo estado do sistema;
- — valor ótimo da função objetivo para o subproblema que começa na etapa no estado .
A equação é resolvida sequencialmente, geralmente "de trás para frente", movendo-se da última etapa para a primeira.
Exemplos de Aplicação
- Problema do caminho mais curto em um grafo: Este problema possui a propriedade de subestrutura ótima, pois qualquer segmento de um caminho mais curto é, por si só, um caminho mais curto. Os algoritmos de Bellman-Ford e Floyd-Warshall são exemplos clássicos da aplicação da PD para resolver este problema[5].
- Problema da mochila: O problema de encher otimamente uma mochila de capacidade limitada com itens de diferentes valores e pesos. A PD permite resolver este problema considerando os itens sequencialmente e calculando, a cada etapa, o valor máximo para todos os valores possíveis de capacidade restante.
- Problema de alocação de recursos: A alocação de um recurso limitado (por exemplo, investimentos) entre vários projetos para maximizar o efeito geral.
Limitações
A principal limitação do método é a maldição da dimensionalidade (em inglês: curse of dimensionality) — um termo introduzido por Bellman para descrever o crescimento exponencial do número de estados e, consequentemente, da complexidade computacional, com o aumento do número de variáveis que descrevem o estado do sistema[6][7]. Isso limita a aplicação prática da PD exata para problemas de dimensão muito grande.
Conceitos Relacionados
- Pesquisa Operacional
- Teoria do controle ótimo
- Processo de decisão de Markov (generalização estocástica)
- Equação de Hamilton-Jacobi-Bellman (análogo para tempo contínuo)
Notas
- ↑ 1.0 1.1 "Programação Dinâmica". Grande Enciclopédia Russa. [1]
- ↑ "Programação dinâmica". Wikipédia. [2]
- ↑ 3.0 3.1 Reshetnikov A. N., Kochenkov A. V., Pirov D. M., Ryabokon D. A. (2011). Programação Dinâmica. Exemplos de Aplicação. Manual de Estudo, Universidade de Lobachevsky (FCMC). [3]
- ↑ "Dynamic programming". Wikipedia. [4]
- ↑ Bradley S. P., Hax A. C., Magnanti T. L. (1977). Applied Mathematical Programming. Addison-Wesley. [5]
- ↑ "Maldição da dimensionalidade". Wikipédia. [6]
- ↑ Jensen P. A. (2004). Dynamic Programming – Models. Operations Research Models and Methods, Univ. of Texas. [7]