In che modo la programmazione dinamica è diversa dalla forza bruta


19

Stavo leggendo sulla programmazione dinamica quando mi sono imbattuto nella seguente citazione

Un algoritmo di programmazione dinamica esaminerà tutti i modi possibili per risolvere il problema e sceglierà la soluzione migliore. Pertanto, possiamo approssimativamente pensare alla programmazione dinamica come a un metodo intelligente e a forza bruta che ci consente di esaminare tutte le possibili soluzioni per scegliere quella migliore . Se la portata del problema è tale da consentire a tutte le possibili soluzioni di essere possibili e abbastanza velocemente, la programmazione dinamica garantisce di trovare la soluzione ottimale

È stato fornito il seguente esempio

Ad esempio, supponiamo che devi passare dal punto A al punto B il più velocemente possibile, in una determinata città, nelle ore di punta. Un algoritmo di programmazione dinamica esaminerà l'intero rapporto sul traffico, esaminando tutte le possibili combinazioni di strade che potresti prendere e ti dirà solo in che modo è il più veloce. Ovviamente, potresti dover aspettare un po 'fino a quando l'algoritmo non termina e solo allora puoi iniziare a guidare. Il percorso che seguirai sarà il più veloce (supponendo che nulla sia cambiato nell'ambiente esterno)

Brute Force sta provando tutte le possibili soluzioni prima di decidere la soluzione migliore.

In che modo la programmazione dinamica è diversa dalla forza bruta se passa anche attraverso tutte le possibili soluzioni prima di scegliere quella migliore , l'unica differenza che vedo è che la programmazione dinamica tiene conto dei fattori aggiuntivi (condizioni del traffico in questo caso).

Ho ragione a dire che la programmazione dinamica è un sottoinsieme del metodo della forza bruta ??


1
Le condizioni del traffico sono un'aringa rossa. Potresti considerarli in qualsiasi algoritmo.
Yuval Filmus,


La tua prima citazione non definisce la programmazione dinamica.
reinierpost,

@reinierpost Beh, cerca di arrivarci intelligent, brute force, ma poi dimentica di descrivere la parte "intelligente"
Izkata,

@Izkata Con questo ragionamento, ogni algoritmo è "forza bruta intelligente" (che è comunque un ossimoro).
Raffaello

Risposte:


17

Un algoritmo di programmazione dinamica esaminerà tutti i modi possibili per risolvere il problema e sceglierà la soluzione migliore.

Questa affermazione è semplicemente sbagliata.

Recidive programmazione dinamica non (spesso) considerare tutti i modi possibili per dividere il caso dato problema in istanze piccole secondo uno schema. Tuttavia, non combinerà tutte le soluzioni a tutti i problemi parziali tra loro e sceglierà il meglio - combina solo soluzioni parziali ottimali (e trae il meglio da quelli).

Il fatto che ciò fornisca una soluzione ottimale per il problema originale non è banale e, in effetti, vale solo per alcuni problemi. Vale a dire quelli che soddisfano il principio di ottimalità di Bellman (una delle "definizioni" più complicate e incomprese che vengono regolarmente citate). Vedi qui per ulteriori riflessioni al riguardo.

KnΘ(n2)»(n-1)!


"Questa affermazione è semplicemente sbagliata" - Risolvila .
nmclean,

4
@nmclean La mia esperienza con la modifica di articoli relativi agli algoritmi su Wikipedia è stata tutt'altro che piacevole, quindi no. Preferirei investire il mio tempo qui.
Raffaello

Ho tentato la fortuna e ho modificato l'articolo. Spero che ora sia un po 'meno sbagliato.
C4stor,

9

La programmazione dinamica è intelligente in quanto riutilizza il calcolo, mentre la forza bruta no. Supponiamo di risolvere, f (6), è necessario risolvere 2 sotto-problemi che chiamano entrambi f (3). Il metodo della forza bruta calcolerà due volte f (3) sprecando così uno sforzo mentre la programmazione dinamica lo chiamerà una volta, salvo il risultato nel caso in cui i calcoli futuri debbano usarlo. In molti problemi, la dinamica migliora la complessità esponenziale della forza bruta in complessità polinomiale.


9
Questa è la memoizzazione , che è solo uno dei tanti trucchi che DP utilizza.
Ben Voigt,

4
La forza bruta con la memoria è ancora inefficiente; solo la struttura / potatura aggiuntiva fornita dalle ricorrenze DP fa ripagare la memoria.
Raffaello

3
Non so nulla della programmazione dinamica, ma sono abbastanza sicuro che ci sia altro oltre all'aggiunta di cache a un algoritmo a forza bruta. Penso che la programmazione dinamica eviti di testare ogni possibile combinazione suddividendo lo spazio problematico, trovando una soluzione ottimale per ogni piccola suddivisione e quindi combinandoli per creare una soluzione complessivamente migliore. (Potrebbe farlo in modo ricorsivo, immergendo le sotto-divisioni). Funziona solo se riesci ad esprimere il problema in un modo che consenta di combinare soluzioni come questa e ottenere comunque un ottimale globale.
Jonathan Hartley,

1
Questa risposta è in realtà abbastanza accurata. Consiglio di leggere un libro di testo come Cormen et al: "Introduzione agli algoritmi" per saperne di più sulla programmazione dinamica, questo libro ha un capitolo abbastanza decente su di esso. In breve, un'efficiente programmazione dinamica utilizza due proprietà del problema (ottimizzazione) che si desidera risolvere: soluzioni ottimali possono essere costruite da soluzioni ottimali di sotto-problemi minori e il numero totale di sotto-problemi minori è in realtà piuttosto piccolo. Quindi, è possibile creare tutte le soluzioni dei problemi secondari dal basso verso l'alto, accelerando il calcolo a costo della memoria.
MRA

Oppure, per dirla in termini ancora più semplici: se sai come calcolare un coefficiente binomiale usando il triangolo di Pascal, allora sai tutto ciò che devi sapere sulla programmazione dinamica.
MRA

3

La distinzione che l'articolo di Wikipedia potrebbe tentare di fare è tra tre tipi di algoritmi:

  1. Algoritmi che vanno oltre tutte le possibili soluzioni, scegliendo quella ottimale.

  2. Algoritmi che vanno oltre un sottoinsieme di tutte le possibili soluzioni, scelti in modo tale che la soluzione ottimale appartenga al sottoinsieme.

  3. Algoritmi che vanno oltre un sottoinsieme di tutte le possibili soluzioni, senza la garanzia che la soluzione ottimale appartenga al sottoinsieme.

I primi due tipi di algoritmi producono la soluzione ottimale, mentre il terzo tipo mira a produrre una soluzione "buona" piuttosto che una soluzione ottimale. A mio avviso, la distinzione tra i primi due tipi non è così chiara.

Vorrei iniziare fornendo esempi semplici per tutti e tre i tipi di algoritmi, nel contesto del percorso più breve (l'esempio che dai).

  1. Prova tutti i percorsi possibili. Questo è noto come forza bruta .

  2. Prova tutti i percorsi possibili, tenendo traccia della soluzione minima finora. Ogni volta che il percorso corrente che stai costruendo è più costoso della soluzione minima finora, abbandonalo e scegline un altro (immaginiamo che la distanza sia calcolata segmento per segmento). Questo si chiama potatura .

  3. Guarda la mappa, considera alcuni percorsi e scegli il migliore tra questi. Questo è un algoritmo per un essere umano piuttosto che per un computer.

Questi esempi sono piuttosto rozzi e forse non dipingono un'immagine molto accurata. La potatura è cruciale in molte situazioni, ad esempio negli scacchi al computer. Se sei curioso, cerca l' algoritmo A * , che in realtà viene utilizzato per il percorso più breve.

La programmazione dinamica è una tecnica per accelerare significativamente l'algoritmo della forza bruta. È in qualche modo fuorviante, tuttavia, pensarlo in questo modo. È una tecnica algoritmica per risolvere problemi di ottimizzazione. È possibile implementare la potatura nel contesto della programmazione dinamica.

ttt+1t


E poi c'è rimuovere un candidato dalla considerazione senza elaborarlo completamente. Ad esempio, trovando l'insieme di numeri non negativi con la somma minima, in realtà non è necessario sommare ogni insieme completamente, solo fino a quando la somma supera il migliore attuale. Questa è un'idea simile alla potatura ma ortogonale. La combinazione delle due idee produce "ramificazione", in cui un problema di ridotta complessità viene risolto e utilizzato per giustificare la potatura.
Ben Voigt,

0

La programmazione dinamica è molto più veloce della forza bruta. La forza bruta può richiedere tempo esponenziale, mentre la programmazione dinamica è in genere molto più veloce.

L'analogia con la forza bruta è molto ampia. La programmazione dinamica non è un magico proiettile d'argento che ti consente di prendere qualsiasi algoritmo di forza bruta che desideri e renderlo efficiente.


5
Questa è una conseguenza, non una spiegazione.
Raffaello

-2

Questo è semplice. La programmazione dinamica è una "strategia di ricerca" che utilizza fattori aggiuntivi per restringere una ricerca. Se non esiste una soluzione nello spazio di ricerca, la programmazione dinamica (in genere) eseguirà una ricerca attraverso ogni elemento dello spazio di ricerca. Ma ciò non significa che si tratti di una ricerca di forza bruta.


"Se non esiste alcuna soluzione nello spazio di ricerca, la programmazione dinamica (in genere) eseguirà una ricerca attraverso ogni elemento dello spazio di ricerca." - sbagliato, vedi la mia risposta.
Raffaello

-2

L'affermazione che la programmazione dinamica è una forza bruta intelligente è corretta, ma un po 'difficile da capire con quel fraseggio. Lo scopo della programmazione dinamica è generalmente quello di prendere un problema e romperlo in pezzi più piccoli in modo intelligente. Dopo averlo fatto, userai la forza bruta per risolvere ogni piccolo pezzo e poi userai di nuovo la forza bruta per combinare i pezzi in una soluzione finale. Quindi, sebbene si possa sicuramente affermare che la programmazione dinamica è un tipo di soluzione di forza bruta, il trucco sta nel modo in cui si utilizza quella forza bruta.


1
"userete la forza bruta per risolvere ogni piccolo pezzo" - sbagliato. In genere si utilizzerà lo stesso approccio in modo ricorsivo.
FrankW
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.