Como a programação dinâmica é diferente da força bruta

19

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?

Computernerd
fonte
1
As condições de tráfego são um arenque vermelho. Você pode considerá-los em qualquer algoritmo.
Yuval Filmus
Sua primeira cotação não define programação dinâmica.
reinierpost
@reinierpost Bem, ele tenta chegar com intelligent, brute force, mas depois esquece-se de descrever a parte "inteligente"
Izkata
@ Izkata Por esse raciocínio, todo algoritmo é "força bruta inteligente" (que é um oxímoro, de qualquer maneira).
Raphael

Respostas:

17

Um algoritmo de programação dinâmica examinará todas as formas possíveis de resolver o problema e escolherá a melhor solução.

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)!

Rafael
fonte
"Esta afirmação está completamente errada" - Corrija-a .
nmclean
4
@ nmclean Minha experiência em editar artigos relacionados a algoritmos na Wikipedia tem sido menos do que agradável, então não. Prefiro investir meu tempo aqui.
Raphael
Eu tentei a sorte e editei o artigo. Espero que esteja um pouco menos errado agora.
C4stor 10/04
9

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.

Tushar
fonte
9
Isso é memorização , que é apenas um dos muitos truques que o DP emprega.
Ben Voigt
4
A força bruta com a memória ainda é ineficiente; somente estrutura / poda adicional fornecida pelas recorrências de DP faz com que a memoisation seja recompensada.
Raphael
3
Não sei nada sobre programação dinâmica, mas tenho quase certeza de que há mais do que apenas adicionar caches a um algoritmo de força bruta. Acho que a programação dinâmica evita testar todas as combinações possíveis, subdividindo o espaço do problema, encontrando uma solução ideal para cada pequena subdivisão e combinando-as para criar a melhor solução geral. (Isso pode ser feito de forma recursiva, submergindo as subdivisões.) Isso funciona apenas se você puder expressar o problema de uma maneira que permita a combinação de soluções como essa e ainda assim obtenha uma otimização geral.
Jonathan Hartley
1
Esta resposta é realmente bastante precisa. Aconselho a leitura de um livro como Cormen et al: "Introdução aos algoritmos" para aprender mais sobre programação dinâmica, este livro tem um capítulo bastante decente. Em resumo, a programação dinâmica eficiente utiliza duas propriedades do problema (otimização) que você deseja resolver: soluções ótimas podem ser construídas a partir das soluções ideais de subproblemas menores, e o número total de subproblemas menores é realmente bastante pequeno. Em seguida, você pode criar todas as soluções de subproblemas de baixo para cima, acelerando o cálculo com o custo de memória.
MRA
Ou, em termos ainda mais simples: se você sabe calcular um coeficiente binomial usando o triângulo de Pascal, sabe tudo o que precisa saber sobre programação dinâmica.
MRA
3

A distinção que o artigo da Wikipedia pode estar tentando fazer é entre três tipos de algoritmos:

  1. Algoritmos que abrangem todas as soluções possíveis, escolhendo a melhor.

  2. Algoritmos que abrangem um subconjunto de todas as soluções possíveis, escolhidos para que a solução ideal pertença ao subconjunto.

  3. 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).

  1. Tente todos os caminhos possíveis. Isso é conhecido como força bruta .

  2. 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 .

  3. 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.

ttt+1t

Yuval Filmus
fonte
E depois há a remoção de um candidato da consideração sem processá-lo completamente. Por exemplo, ao encontrar o conjunto de números não negativos com a soma mínima, você não precisa somar completamente cada conjunto, apenas vá até que a soma exceda o melhor atual. Essa é uma idéia semelhante à poda, mas ortogonal. A combinação das duas idéias produz "ramificação e limite", onde um problema de complexidade reduzida é resolvido e usado para justificar a poda.
21413 Ben Voigt
0

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.

DW
fonte
5
Isso é uma consequência, não uma explicação.
Raphael
-2

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.

nomenclatura
fonte
"Se não houver solução no espaço de pesquisa, a programação dinâmica (normalmente) fará uma pesquisa em todos os elementos do espaço de pesquisa." - errado, veja minha resposta.
Raphael
-2

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.

Tal
fonte
1
"você usará força bruta para resolver cada pedacinho" - errado. Você normalmente usará a mesma abordagem recursivamente.
FrankW