Eu estava lendo sobre programação dinâmica quando me deparei com a seguinte citação
Um algoritmo de programação dinâmica examinará todas as formas possíveis de resolver o problema e escolherá a melhor solução. Portanto, podemos pensar na programação dinâmica como um método inteligente de força bruta que nos permite analisar todas as soluções possíveis para escolher a melhor . Se o escopo do problema for tal que for possível e com rapidez suficiente, passar por todas as soluções possíveis, a programação dinâmica garante encontrar a solução ideal
O exemplo a seguir foi dado
Por exemplo, digamos que você precise ir do ponto A ao ponto B o mais rápido possível, em uma determinada cidade, na hora do rush. Um algoritmo de programação dinâmica analisará todo o relatório de tráfego, analisando todas as combinações possíveis de estradas que você pode seguir e só então lhe dirá qual o caminho mais rápido. Claro, você pode ter que esperar um pouco até o algoritmo terminar e só então poderá começar a dirigir. O caminho que você seguirá será o mais rápido (assumindo que nada mudou no ambiente externo)
A Brute Force está tentando todas as soluções possíveis antes de decidir a melhor solução.
Como a Programação Dinâmica difere da Brute Force se ela também passa por todas as soluções possíveis antes de escolher a melhor , a única diferença que vejo é que a Programação Dinâmica leva em consideração os fatores adicionais (condições de tráfego, neste caso).
Estou correto em dizer que a programação dinâmica é um subconjunto do método Brute Force?
fonte
intelligent, brute force
, mas depois esquece-se de descrever a parte "inteligente"Respostas:
Esta afirmação está completamente errada.
Recorrências de programação dinâmica que (muitas vezes) conta todas as formas possíveis de dividir a determinada instância problema em instâncias menores de acordo com algum esquema. No entanto, ele não combinará todas as soluções para todos os problemas parciais entre si e escolherá o melhor - ele combina apenas as soluções parciais ideais (e escolhe o melhor delas ).
O fato de isso produzir uma solução ideal para o problema original não é trivial e, de fato, é válido apenas para alguns problemas. Nomeadamente aqueles que cumprem o princípio de otimização de Bellman (uma das "definições" mais duvidosas e incompreendidas que são citadas regularmente). Veja aqui mais algumas reflexões sobre isso.
Como um exemplo concreto, considere o algoritmo de Bellman-Ford em um gráfico completo com pesos unitários: ele só considera caminhos de comprimento um e dois (ou seja, Θ ( n 2 ) muitos) porque aqueles que usam uma aresta são ótimos . Mas existem infinitas soluções se você não vincular o número máximo de arestas permitido e ainda assim ≫ ( n - 1 ) ! muitos se você permitir que cada nó seja usado apenas uma vez. Claramente, Bellman-Ford - um algoritmo de programação dinâmica - não realiza uma busca por força bruta.Kn Θ ( n2) » ( N - 1 ) !
fonte
A programação dinâmica é inteligente, pois reutiliza a computação, enquanto a força bruta não. Suponha que para resolver, f (6), você precise resolver 2 subproblemas que ambos chamam de f (3). O método da força bruta calculará f (3) duas vezes, desperdiçando esforço, enquanto a programação dinâmica o chamará uma vez, salvando o resultado caso futuros cálculos precisem usá-lo. Em muitos problemas, a dinâmica melhora a complexidade exponencial da força bruta para a complexidade polinomial.
fonte
A distinção que o artigo da Wikipedia pode estar tentando fazer é entre três tipos de algoritmos:
Algoritmos que abrangem todas as soluções possíveis, escolhendo a melhor.
Algoritmos que abrangem um subconjunto de todas as soluções possíveis, escolhidos para que a solução ideal pertença ao subconjunto.
Algoritmos que abrangem um subconjunto de todas as soluções possíveis, sem a garantia de que a solução ideal pertence ao subconjunto.
Os dois primeiros tipos de algoritmos produzem a solução ideal, enquanto o terceiro tipo visa produzir uma solução "boa" em vez de uma solução ideal. Na minha opinião, a distinção entre os dois primeiros tipos não é tão clara.
Deixe-me começar dando exemplos simples para todos os três tipos de algoritmos, no contexto do caminho mais curto (o exemplo que você fornece).
Tente todos os caminhos possíveis. Isso é conhecido como força bruta .
Tente todos os caminhos possíveis, mantendo o controle da solução mínima até o momento. Sempre que o caminho atual que você está construindo for mais caro que a solução mínima até agora, abandone-o e escolha outro (imaginamos que a distância seja calculada segmento por segmento). Isso é chamado poda .
Olhe o mapa, considere alguns caminhos e escolha o melhor entre eles. Este é um algoritmo para um ser humano e não para um computador.
Esses exemplos são bastante rudes e talvez não mostrem uma imagem muito precisa. A poda é crucial em muitas situações, por exemplo no xadrez do computador. Se você estiver curioso, procure o algoritmo A * , que é realmente usado para o caminho mais curto.
A programação dinâmica é uma técnica para acelerar significativamente o algoritmo de força bruta. No entanto, é um pouco enganador pensar dessa maneira. É uma técnica algorítmica para resolver problemas de otimização. Você pode implementar a remoção no contexto da programação dinâmica.
fonte
A programação dinâmica é muito mais rápida que a força bruta. A força bruta pode levar um tempo exponencial, enquanto a programação dinâmica é tipicamente muito mais rápida.
A analogia com a força bruta é muito frouxa. A programação dinâmica não é uma bala mágica de prata que permite que você pegue o algoritmo de força bruta desejado e o torne eficiente.
fonte
Isso é direto. A programação dinâmica é uma "estratégia de pesquisa" que usa fatores adicionais para restringir uma pesquisa. Se não há solução no espaço de busca, programação dinâmica irá (normalmente) fazer uma pesquisa através de cada elemento do espaço de busca. Mas isso não significa que seja uma busca por força bruta.
fonte
A afirmação de que a programação dinâmica é força bruta inteligente está correta, mas um pouco difícil de entender com esse fraseado. O objetivo da programação dinâmica é geralmente pegar um problema e dividi-lo em pedaços menores de uma maneira inteligente. Depois de fazer isso, você usará a força bruta para resolver cada peça pequena e, em seguida, usará a força bruta novamente para combinar as peças em uma solução final. Portanto, embora você possa definitivamente dizer que a programação dinâmica é um tipo de solução de força bruta, o truque está em como você usa essa força bruta.
fonte