web-dev-qa-db-fra.com

En quoi la programmation dynamique est-elle différente des algorithmes gourmands?

Dans le livre que j'utilise Introduction à la conception et à l'analyse des algorithmes , programmation dynamique est censé se concentrer sur le principe de Optimalité , "Une solution optimale à toute instance d'un problème d'optimisation est composée de solutions optimales à ses substances".

Alors que la technique gourmande se concentre sur l'expansion de solutions partiellement construites jusqu'à ce que vous arriviez à une solution pour un problème complet. On dit alors que ce doit être "le meilleur choix local parmi tous les choix possibles disponibles à cette étape".

Puisque les deux impliquent l'optimalité locale, l'un n'est-il pas un sous-ensemble de l'autre?

36
Irwin

La programmation dynamique est applicable aux problèmes présentant les propriétés de:

  • des sous-problèmes qui se chevauchent, et
  • sous-structure optimale.

Une sous-structure optimale signifie que vous pouvez résoudre avec avidité des sous-problèmes et combiner les solutions pour résoudre le problème plus important. La différence entre la programmation dynamique et les algorithmes gourmands est qu'avec la programmation dynamique, il y a des sous-problèmes qui se chevauchent et ces sous-problèmes sont résolus en utilisant la mémorisation . La "mémorisation" est la technique par laquelle des solutions aux sous-problèmes sont utilisées pour résoudre d'autres sous-problèmes plus rapidement.

Cette réponse a retenu l'attention, je vais donc donner quelques exemples.

Considérez le problème "Faire des changements avec des dollars, des nickels et des sous". C'est un problème gourmand. Il présente une sous-structure optimale car vous pouvez résoudre pour le nombre de dollars. Ensuite, résolvez le nombre de nickels. Ensuite, le nombre de centimes. Vous pouvez ensuite combiner efficacement les solutions à ces sous-problèmes. Il ne présente pas vraiment de sous-problèmes qui se chevauchent, car la résolution de chaque sous-problème n'aide pas beaucoup les autres (peut-être un peu).

Considérez le problème "Numéros de Fibonnaci". Il présente une sous-structure optimale car vous pouvez résoudre F(10) à partir de F(9) et F(8) efficacement) (par addition). Ces sous-problèmes se chevauchent car ils partagent tous les deux F (7). Si vous mémorisez le résultat de F(7) lorsque vous résolvez F (8), vous pouvez résoudre = F(9) plus rapidement.

En réponse au commentaire sur la programmation dynamique concernant les "décisions de reconsidération": Ceci n'est évidemment pas vrai pour tout algorithme de programmation dynamique linéaire comme le problème de sous-réseau maximum ou le problème de Fibonacci ci-dessus.

Essentiellement, imaginez un problème ayant une sous-structure optimale sous la forme d'un graphe acyclique dirigé dont les nœuds représentent des sous-problèmes (où tout le problème est représenté par un nœud dont le degré d'indégral est zéro), et dont les bords dirigés représentent des dépendances entre les sous-problèmes. Ensuite, un problème gourmand est un arbre (tous les nœuds à l'exception de la racine ont une unité indegree). Un problème de programmation dynamique a certains nœuds avec un degré supérieur à un. Cela illustre les sous-problèmes qui se chevauchent.

46
Neil G

La différence est que la programmation dynamique vous oblige à vous souvenir de la réponse pour les petits états, alors qu'un algorithme gourmand est local dans le sens où toutes les informations nécessaires sont dans l'état actuel. Bien sûr, il y a une intersection.

11
bcurcio

La principale distinction est que les algorithmes gourmands composent des solutions "statiquement" dans le sens où chaque choix local dans la solution peut être finalisé sans avoir besoin de savoir quoi que ce soit sur les autres choix locaux effectués. Cependant, les algorithmes dynamiques créent des ensembles de solutions possibles aux sous-problèmes et ne génèrent une seule solution au problème global que lorsque tous les sous-problèmes ont été pris en compte. La page Wikipedia sur les algorithmes gourmands le dit bien:

Le choix fait par un algorithme gourmand peut dépendre des choix effectués jusqu'à présent mais pas des choix futurs ou de toutes les solutions au sous-problème. Il fait itérativement un choix gourmand après l'autre, réduisant chaque problème donné en un plus petit. En d'autres termes, un algorithme gourmand ne reconsidère jamais ses choix. C'est la principale différence avec la programmation dynamique, qui est exhaustive et est garantie de trouver la solution. Après chaque étape, la programmation dynamique prend des décisions basées sur toutes les décisions prises à l'étape précédente et peut reconsidérer le chemin algorithmique de l'étape précédente vers la solution.

9
Kyle Strand

Les algorithmes DP utilisent le fait que (pour certains problèmes) - une solution optimale à un problème de taille n est composée d'une solution optimale à un problème de taille n'<n, et l'utilise pour créer la solution de bas en haut, du plus petit problème à la taille requise.

Cela correspond très bien au même principe de récursivité (réduire le problème à un sous-problème plus petit et invoquer récursivement), et en effet - les solutions DP sont souvent représentées comme une formule récursive.

Les algorithmes cupides regardent un point local et font un choix avec les données à ce point. Pour certains problèmes (chemin le plus court sans poids négatifs par exemple) - ce choix local conduira à une solution optimale.

Un bon exemple des différences entre les deux approches est pour le problème de chemin le plus court :

  • Algorithme de Dijsktra est une approche gourmande (à chaque étape, choisissez le nœud dont le chemin d'accès est actuellement minimisé - le choix se fait avec gourmandise en fonction de l'état local de l'algorithme).
  • algorithme Bellman-Ford est une solution DP ("relâchez" TOUS les bords réduisant efficacement le problème)
6
amit

Méthode gourmande:

  1. La méthode gourmande se concentre sur l'expansion des solutions partiellement construites.
  2. Il fournit de nombreux résultats tels qu'une solution réalisable.
  3. Plus efficace

Programmation dynamique:

  1. Se concentre sur le principe d'optimalité.
  2. Il fournit des réponses spécifiques.
  3. Moins efficace
1
Prashant Kumbharkar

La différence entre DP et gourmand est que DP cherchera l'optimal global à chaque sous-problème, mais gourmand ne cherchera que l'optimal local. Donc, à propos de ce scénario:

Supposons que vous escaladiez une montagne et que vous souhaitiez grimper le plus haut possible. La route sur la montagne a plusieurs branches, et à chaque intersection, vous devez décider quelle branche prendre, ce qui est le sous-problème de ce problème d'escalade (le but est le même, seul le point de départ est différent)

Pour l'algorithme gourmand, vous choisirez toujours celui qui semble le plus élevé. C'est un local décision optimale et ne garantit pas le meilleur résultat

Pour le DP, à chaque intersection, vous devez déjà connaître l'altitude la plus élevée dans laquelle chaque branche vous mènera (supposez que votre ordre d'évaluation est inversé, a.k.a des points finaux au point de départ), et choisissez celui qui a la plus grande altitude. Cette décision repose sur l'optimum global des futurs sous-problèmes et il y aura pour globalement optimal pour ce sous-problème

0
NoSegfault