Programmation dynamique : qu'est-ce que c'est et tout savoir ?

Programmation dynamique
Source de l'image : AfterAcademy
Table des matières Cacher
  1. Qu'est-ce que la programmation dynamique ?
  2. Comment fonctionne la programmation dynamique ?
    1. #1. Approche descendante
    2. #2. Une approche en profondeur
  3. Caractéristiques de la programmation dynamique
    1. #1. Chevauchement des sous-problèmes
    2. #2. La sous-structure a une propriété optimale
  4. Utilisations de la programmation dynamique dans le monde réel
    1. #1. Problème de sac à dos
    2. #2. Chemin le plus court de toutes les paires
    3. #3. Sculpture de couture
    4. #4. Apprentissage automatique et génomique
    5. #5. Cryptographie
  5. Qu'est-ce qu'un exemple réel de programmation dynamique ?
  6. Comment résoudre les problèmes de programmation dynamique ?
    1. #1. Reconnaître le problème de programmation dynamique
    2. #2. Déterminer les causes du problème
    3. #3. Choisir entre une méthode itérative et une méthode récursive
    4. #4. Incorporer un système de mémorisation
    5. #5. Mettre la relation de récurrence en mots
  7. Programmation dynamique d'algorithmes
    1. Différents types d'algorithmes de programmation dynamique
    2. #2. Algorithme Floyd-Warshall
  8. Comment un algorithme de programmation dynamique résout-il les problèmes Lcs plus rapidement qu'une technique récursive ?
  9. Quels sont les problèmes de programmation dynamique en Python
    1. #1. Sac à dos (0-1) délimité
    2. #2. 0/1 Mémoïsation liée au sac à dos
    3. #3. Problème de sous-ensemble égal
  10. Avantages de la programmation dynamique
    1. #1. Remède efficace
    2. #2. Facilite la recherche facile de problèmes
    3. #3. Efficace
    4. #4. Efficace lorsqu'un problème a plusieurs solutions
  11. Quels sont les inconvénients de la programmation dynamique ?
    1. #1. Sous-problèmes récurrents
    2. #2. Complicité dans le temps et l'espace
    3. #3. Cadre de la question
    4. #4. Difficile à mettre en pratique
  12. Conclusion
  13. FAQ sur la programmation dynamique
  14. Quelle est la différence entre la programmation linéaire et la programmation dynamique ?
  15. Est-il difficile d'apprendre la programmation dynamique ?
  16. La programmation dynamique est-elle très difficile ?
  17. Articles similaires
  18. Référence

La programmation dynamique est un terme qui a probablement déjà été utilisé si vous êtes sur le terrain depuis un certain temps. Le sujet revient fréquemment dans les réunions de revue de conception et dans les interactions quotidiennes des ingénieurs, et c'est aussi un point central dans les entretiens techniques. La stratégie de diviser pour régner est une méthode infaillible pour atteindre n'importe quel objectif. En programmation informatique, cette même idée est vraie. De nombreuses difficultés ont des sous-types qui peuvent être isolés et traités séparément, permettant la résolution ultime du problème principal. Dans cet article, nous aborderons l'algorithme de programmation dynamique et Python.

Qu'est-ce que la programmation dynamique ?

La programmation dynamique est une méthode pour résoudre des problèmes complexes en les réduisant d'abord à des problèmes plus simples, puis en utilisant les solutions à ces problèmes plus simples comme blocs de construction pour résoudre le problème initial. 

Nous segmentons le problème en question en morceaux gérables. Dans la plupart des cas, la seule véritable distinction entre le problème du parent et les problèmes de son enfant est leur taille relative. Ainsi, ces mini-problèmes peuvent être décomposés en encore plus de mini-problèmes, et ainsi de suite, indéfiniment. Imaginez qu'un problème et ses différents sous-problèmes forment un arbre. Les problèmes "feuilles" sont abordés en premier, suivis de leurs problèmes "parents", et ainsi de suite dans l'arbre des problèmes. Au fur et à mesure que nous abordons des difficultés plus petites, nous enregistrons nos progrès pour une utilisation ultérieure. Cela nous permet de sauter cette partie du problème à l'avenir. 

Cette méthode est similaire à la technique diviser pour mieux régner en ce sens qu'elle décompose un problème en problèmes plus petits qui peuvent être résolus indépendamment puis combinés pour obtenir la solution finale.

Comment fonctionne la programmation dynamique ?

La programmation dynamique est efficace car elle simplifie les problèmes difficiles en les décomposant en éléments constitutifs. La prochaine étape consiste à identifier les meilleures réponses à ces défis qui en découlent. Les résultats de ces procédures peuvent être mémorisés afin que les solutions correspondantes puissent être extraites du stockage et utilisées sans autre calcul. De plus, la solution peut être sauvegardée pour éviter de recalculer des sous-problèmes précédemment résolus. 

Deux méthodes existent pour réaliser la programmation dynamique :

#1. Approche descendante

En informatique, les problèmes sont généralement résolus en construisant des solutions de manière récursive ou en utilisant les résultats des étapes précédentes pour résoudre le problème en question. Il est possible de mémoriser ou de conserver un tableau des solutions aux sous-problèmes s'ils sont similaires. La méthode descendante est basée sur l'apprentissage par mémoire. La mémorisation revient à effectuer deux fois la récursivité et la mise en cache. La récursivité implique de faire un appel indirect à la fonction, tandis que la mise en cache implique de garder une trace des résultats intermédiaires.

Parmi les nombreux avantages de l'approche descendante, citons :

  • La méthode descendante est simple à comprendre et à appliquer. Pour mieux comprendre ce qui doit être fait, cette méthode déconstruit les problèmes en leurs éléments constitutifs. Chaque nouveau développement apporte avec lui le soulagement d'un obstacle jusque-là insurmontable. Certaines des pièces peuvent même être applicables à d'autres problèmes.
  • Il permet la résolution de sous-problèmes à la demande. La méthode descendante permettra la décomposition des problèmes en blocs gérables, les solutions à ces blocs étant stockées pour une utilisation ultérieure. Ensuite, les clients peuvent demander de l'aide pour réparer chaque composant. 
  • Le débogage est également simplifié. En divisant un problème en plus petits morceaux, il est plus facile de suivre la réponse et de voir les erreurs potentielles. 

Voici quelques-uns des inconvénients de l'utilisation d'une approche descendante :

  • La stratégie descendante utilise la méthode de récursivité, qui occupe plus de mémoire dans la pile des appels que les autres approches. Cela se traduit finalement par une baisse des performances. De plus, un débordement de pile peut se produire si la récursivité remonte trop loin dans le passé.

#2. Une approche en profondeur

Une fois que la solution d'un problème a été exprimée en termes de sous-problèmes d'une manière qui se reboucle sur elle-même, les utilisateurs peuvent réécrire le problème en utilisant l'approche ascendante, dans laquelle ils résolvent d'abord les sous-problèmes les plus petits, puis appliquent leurs solutions aux plus gros. . 

Contrairement à la méthode descendante, la récursivité est éliminée lors de l'utilisation de la méthode ascendante. Par conséquent, les fonctions récursives n'ajoutent pas de surcharge inutile ou ne provoquent pas de débordement de la pile. De plus, il permet la compression des données. La complexité temporelle de la récursivité est réduite en éliminant la nécessité de recalculer les mêmes valeurs. 

Certains avantages de travailler à partir de la base sont les suivants :

  • Il détermine d'abord comment un énorme problème sera construit à partir de sous-problèmes plus petits et réutilisables.
  • En supprimant la récursivité, cela permet de mieux utiliser la mémoire disponible. La complexité temporelle est réduite comme effet secondaire. 

Caractéristiques de la programmation dynamique

Il existe deux caractéristiques distinctives de la programmation dynamique :

#1. Chevauchement des sous-problèmes

Les modifications d'un problème principal qui sont plus gérables sont appelées « sous-problèmes ». La suite de Fibonacci, dans laquelle chaque nombre est égal à la somme des deux précédents (0, 1, 1, 2, 3, 5, 8,…). Vous pouvez diviser la tâche de trouver la nième valeur dans la séquence de Fibonacci en morceaux plus gérables. Au fur et à mesure que vous trouvez des solutions en vous attaquant au même sous-problème, ces ensembles de difficultés qui se chevauchent deviennent de plus en plus difficiles à résoudre.

La programmation dynamique peut être utilisée pour partitionner de gros travaux de programmation en morceaux gérables en raison de l'occurrence universelle de sous-problèmes qui se chevauchent.

#2. La sous-structure a une propriété optimale

La propriété de sous-structure optimale se manifeste lorsqu'il est possible de créer une solution optimale à partir des solutions à tous les sous-problèmes. Pour que la récursivité fonctionne, vous devez appliquer la réponse que vous obtenez de chaque chevauchement à l'ensemble du problème. La propriété de sous-structure optimale est affichée par l'ensemble du problème lorsque, comme dans le cas de la séquence de Fibonacci, chaque sous-problème a une solution qui peut être appliquée au sous-problème suivant dans la séquence pour déterminer sa valeur.

Utilisations de la programmation dynamique dans le monde réel

Voici les utilisations de la programmation dynamique.

#1. Problème de sac à dos

La programmation dynamique a été largement utilisée pour résoudre le problème du sac à dos. Voici les problèmes auxquels nous sommes confrontés :

La valeur idéale pour chaque sous-problème, déterminée par le nombre d'articles en question et la quantité d'espace restant dans le sac à dos, peut être stockée dans un tableau à deux dimensions, ce qui permet de résoudre rapidement ce problème. Nous pouvons maximiser la valeur en incluant ou en excluant l'élément actuel à chaque étape. La réponse se trouve dans le coin inférieur droit du tableau.

Le problème du sac à dos peut être utilisé dans une grande variété de contextes, de l'emballage des bagages à la prise de décisions d'investissement en passant par l'allocation des ressources.

#2. Chemin le plus court de toutes les paires

Le problème du chemin le plus court dans un graphe pondéré est une autre utilisation typique de la programmation dynamique. En utilisant des techniques comme Floyd-Warshall ou Bellman-Ford, nous pouvons trouver le chemin le plus court entre deux paires de nœuds données.

Afin de suivre le chemin le plus court entre deux nœuds donnés, ces algorithmes utilisent un tableau tridimensionnel. De plus, afin de savoir à quelle distance ils se trouvent du point de départ, ils comparent le résultat à la distance entre le point de départ et le nœud intermédiaire à chaque étape. Après tout, les itérations sont terminées, la solution finale sera la matrice de distance.

Il existe plusieurs utilisations pour résoudre le problème du chemin le plus court toutes paires, comme dans l'analyse du réseau, le routage, la navigation, l'analyse des réseaux sociaux, etc.

#3. Sculpture de couture

Dans le domaine du traitement d'images, la sculpture sur couture est une application intrigante de la programmation dynamique. La tâche à accomplir est de réduire la taille d'une image sans altérer aucune de ses caractéristiques essentielles. Les routes à faible énergie dans une image, appelées coutures, peuvent être utilisées pour soustraire ou ajouter des pixels pour obtenir cet effet.

En utilisant la programmation dynamique, nous pouvons calculer l'énergie cumulée de chaque pixel de l'image en fonction de son gradient et de ses voisins, puis utiliser ces informations pour déterminer quelles coutures doivent être supprimées ou ajoutées. Ensuite, en remontant du bas de l'image, nous pouvons localiser la couture avec le moins d'énergie potentielle. Cette méthode peut être réutilisée jusqu'à ce que la taille requise soit atteinte.

De plus, les images peuvent être redimensionnées, recadrées, reciblées et plus encore à l'aide de la sculpture sur couture.

#4. Apprentissage automatique et génomique

Les défis de l'apprentissage automatique et de la génomique tels que l'alignement de séquences, les modèles de Markov cachés et les arbres phylogénétiques sont tous accessibles aux capacités de résolution de problèmes de la programmation dynamique.

L'alignement de plusieurs séquences de symboles (souvent de l'ADN ou des protéines) pour découvrir des points communs est appelé alignement de séquences. Cela peut éclairer leurs liens évolutifs, leurs fonctions dans la société ou leurs caractéristiques structurelles. Des alignements optimaux peuvent être trouvés via une programmation dynamique en attribuant des scores aux correspondances et aux discordances entre les séquences.

Les modèles probabilistes connus sous le nom de modèles de Markov cachés sont utilisés pour décrire des données de séries chronologiques conditionnelles à des états inconnus. Ils sont utiles pour modéliser des phénomènes difficiles comme la reconnaissance vocale, la PNL, la bioinformatique, etc. Lorsqu'on leur donne un ensemble d'observations, les techniques de programmation dynamique comme Viterbi et Forward-Backward peuvent déterminer la séquence la plus probable d'états cachés.

Les arbres phylogénétiques montrent les liens entre les espèces ou les gènes au fil du temps. Il est possible de déduire des ancêtres communs, des dates de divergence et des événements évolutifs à partir de ces points communs. En outre, un algorithme de programmation dynamique comme Fitch et Sankoff peut être utilisé pour générer des arbres phylogénétiques optimaux à l'aide de données de séquençage.

#5. Cryptographie

La cryptographie, l'étude de la communication secrète, bénéficie également des capacités de résolution de problèmes de la programmation dynamique. Le chiffrement, le déchiffrement, les signatures numériques, l'authentification et d'autres processus similaires font tous partie de la cryptographie.

Le cryptage convertit les informations lisibles par l'homme en informations lisibles par clé secrète. Le déchiffrement est le processus de reconversion des données chiffrées en texte brut à l'aide de la clé d'origine ou d'une nouvelle. Les signatures numériques permettent de vérifier l'authenticité et l'intégrité d'un message ou d'un document. La vérification des informations d'identification de l'expéditeur ou du destinataire peut vérifier l'identité de l'expéditeur ou du destinataire.

Différents types de cryptographie, y compris la cryptographie à clé dynamique, la cryptographie basée sur le code et la cryptographie basée sur la programmation dynamique, peuvent tous être mis en œuvre avec la programmation dynamique.

La cryptographie à clé dynamique est un mécanisme de chiffrement et de déchiffrement des messages avec des clés en constante évolution. Les clés « dynamiques » sont celles qui évoluent dans le temps ou en réponse à d'autres facteurs. Cela les rend plus sûres que les clés statiques, qui sont vulnérables aux attaques. Il est possible d'utiliser la programmation dynamique pour générer et maintenir à jour les clés lors de la mise en œuvre de la cryptographie à clé dynamique.

En utilisant une technique connue sous le nom de cryptographie basée sur un code, il est possible de chiffrer et de déchiffrer des messages en utilisant des codes de correction d'erreurs dans le processus. Il est possible de corriger les défauts de transmission avec des codes correcteurs d'erreurs. L'utilisation de la cryptographie basée sur le code est largement considérée comme résistante au quantum car elle est sécurisée contre les assauts des ordinateurs quantiques. La programmation dynamique peut être utilisée pour chiffrer et déchiffrer les communications à l'aide d'un cryptosystème basé sur un code.

En tant que méthode de chiffrement et de déchiffrement des données, la cryptographie basée sur la programmation dynamique repose sur un algorithme de programmation dynamique. Afin de relever les défis d'optimisation, les techniques de programmation dynamique divisent généralement le problème en un ensemble de sous-problèmes plus simples. La cryptographie de programmation dynamique utilise le sac à dos, le chemin le plus court et la sculpture de couture.

Qu'est-ce qu'un exemple réel de programmation dynamique ?

De nombreuses instances d'applications logicielles réelles utilisent la programmation dynamique pour maintenir l'agilité et l'efficacité tout en réduisant leur empreinte de ressources sur le système hôte. Certains cas sont les suivants :

  • Google Maps. Google Maps utilise la programmation dynamique pour trouver l'itinéraire le plus rapide d'une origine donnée vers plusieurs destinations différentes.
  • La mise en réseau. Transfert séquentiel de données d'un seul expéditeur vers plusieurs destinataires.
  • Correcteurs orthographiques. L'algorithme de distance d'édition détermine le nombre d'étapes nécessaires pour transformer un mot en un autre et fournit une mesure quantitative du degré de dissemblance entre les deux mots. 
  • Logiciel de plagiat. Les méthodes de distance de document aident à déterminer la similarité du document texte.
  • Moteurs de recherche. Pour déterminer à quel point deux éléments de contenu Internet sont réellement similaires.

Comment résoudre les problèmes de programmation dynamique ?

Apprendre la formule pour résoudre les problèmes de programmation dynamique est la prochaine étape après avoir compris le concept de programmation dynamique. Voici quelques suggestions sur la façon d'appliquer la programmation dynamique au problème en question et d'arriver à une solution viable :

#1. Reconnaître le problème de programmation dynamique

La partie la plus importante est de réaliser qu'un algorithme de programmation dynamique peut résoudre l'énoncé du problème spécifié. Pour résoudre ce problème, il faut d'abord déterminer si chacun des énoncés du problème peut être divisé en parties plus petites en tant que fonction.

#2. Déterminer les causes du problème

Si vous avez déjà conclu que la programmation dynamique est le bon outil pour le travail, l'étape suivante consiste à identifier la structure récursive du problème parmi ses sous-problèmes constitutifs. Dans ce cas, vous devez tenir compte de la nature fluide des conditions du problème. Cette variable peut être une position de tableau ou une vitesse de résolution de problème.

De plus, le dénombrement des éléments constitutifs du problème est crucial.

#3. Choisir entre une méthode itérative et une méthode récursive

Pour résoudre les problèmes de programmation dynamique, vous pouvez utiliser des approches itératives ou récursives. D'après ce qui a été dit jusqu'à présent, il est prudent de dire que la méthode récursive est préférable. Toutes les considérations susmentionnées, cependant, se suffisent à elles-mêmes, quelle que soit la méthode choisie pour résoudre le problème.

Les approches récursives et itératives nécessitent que vous spécifiiez la relation de récurrence et le cas de base du problème.

#4. Incorporer un système de mémorisation

Lorsque l'on s'attaque à un problème avec une structure similaire, il peut être utile de rappeler l'expérience passée de la gestion de sous-problèmes comparables. La complexité temporelle du problème diminuera en conséquence. La complexité temporelle d'une tâche peut croître de manière exponentielle si nous continuons à résoudre les mêmes sous-problèmes encore et encore sans utiliser la mémorisation.

#5. Mettre la relation de récurrence en mots

Lors de la résolution d'un problème, de nombreux programmeurs ignorent la définition de la relation de récurrence et passent directement au codage. Vous aurez une meilleure compréhension du problème et pourrez le coder plus rapidement si vous pouvez exprimer explicitement la relation de récurrence avant de commencer.

Programmation dynamique d'algorithmes

La plupart des applications de programmation dynamique incluent l'algorithme récursif. L'utilisation de la programmation dynamique pour l'optimisation implique que la récursivité est intrinsèque à la majorité des problèmes d'optimisation.

Cependant, il n'est pas possible de résoudre des problèmes entièrement récursifs avec la programmation dynamique. Une récursivité ne peut trouver la solution que par une stratégie de division pour régner à moins qu'il n'y ait une présence de sous-problèmes qui se chevauchent, comme dans le problème de séquence de Fibonacci.

En effet, les sous-problèmes sous-jacents dans un algorithme récursif tel que Merge Sort ne se chevauchent pas, ce qui exclut l'utilisation de la programmation dynamique.

Différents types d'algorithmes de programmation dynamique

Voici les différents types d'algorithmes de programmation dynamique.

#1. Sous-séquence commune la plus longue

Il est possible que les éléments de la sous-séquence commune la plus longue (LCS) apparaissent dans n'importe quel ordre dans les séquences d'origine; le LCS est défini comme la plus longue sous-séquence commune à toutes les séquences spécifiées.

Si deux séquences S1 et S2 sont fournies, alors une séquence Z qui est une sous-séquence à la fois de S1 et S2 est appelée leur sous-séquence commune. Comme exigence supplémentaire, Z doit consister en une séquence strictement ascendante des indices des ensembles S1 et S2.

Les indices des éléments sélectionnés dans Z doivent croître strictement pour former une séquence montante.

#2. Algorithme Floyd-Warshall

Trouver le chemin le plus court entre chaque paire de sommets dans un graphe pondéré est l'objectif de l'algorithme de Floyd-Warshall. Cette méthode traite les graphiques avec des pondérations dans les deux sens. En revanche, il échoue pour les cycles dans lesquels la somme de leurs arêtes est négative.

L'algorithme de Floyd, l'algorithme Roy-Floyd, l'algorithme Roy-Warhshall et l'algorithme WFI sont tous des noms pour l'algorithme Floyd-Warhshall.

Cet algorithme utilise une technique de programmation dynamique pour localiser les raccourcis optimaux.

Comment un algorithme de programmation dynamique résout-il les problèmes Lcs plus rapidement qu'une technique récursive ?

La programmation dynamique réduit la surcharge liée à l'appel d'une fonction. Il se souvient du résultat de chaque appel de fonction afin que les appels suivants puissent utiliser les données stockées sans répéter le même travail.

Chaque fois qu'un élément de X est comparé à un élément de Y, les résultats sont écrits dans une table afin qu'ils puissent être utilisés dans des calculs ultérieurs dans le processus dynamique susmentionné.

Ainsi, le temps d'exécution d'une méthode dynamique est égal au temps nécessaire pour remplir la table (O(mn)). En revanche, la complexité de l'algorithme récursif est de 2max(m, n). Aussi, lisez Comment choisir le bon type d'algorithme de chiffrement pour les besoins de votre entreprise

Quels sont les problèmes de programmation dynamique en Python

En utilisant la programmation dynamique, on peut déterminer la solution la plus appropriée à un certain nombre d'énoncés de problèmes différents. Dans ce qui suit, nous passerons en revue certaines des déclarations de problème célèbres les plus fréquemment demandées et fournirons une brève explication ainsi que le code Python approprié.

#1. Sac à dos (0-1) délimité

Dans cette situation, on vous donne les prix et les poids de N marchandises et on vous charge de les ranger dans un sac à dos de capacité W ; l'objectif est de minimiser le nombre d'articles choisis tout en tenant tout dans le sac à dos.

La plupart des entretiens techniques pour les organisations de biens exigeront des candidats qu'ils résolvent le problème du sac à dos, qui est un exemple classique de technique de programmation dynamique.

Énoncé du problème Supposons que vous ayez un sac de capacité W et une liste de choses, chacune ayant un poids et un profit correspondant. Le but est de maximiser les gains par un mauvais remplissage efficace.

La réponse est de créer un tableau avec des colonnes pour chaque poids imaginable entre 1 et W et des lignes pour les poids que vous sélectionnez réellement. Cette table sera connue sous le nom de dp[][]. Si 'j' est la capacité du sac à dos et que les premiers éléments 'i' du tableau poids/article sont inclus, alors l'état /cellule dp[i][j] dans le tableau indique le profit le plus élevé possible.

En conséquence, la valeur dans la cellule finale signifiera la solution. Il est important de n'emballer que ce qui ne dépassera pas la limite de poids du sac à dos. Il existe deux alternatives au critère « poids>poids[i-1] » où toutes les colonnes peuvent être remplies. 

#2. 0/1 Mémoïsation liée au sac à dos

Remplissez un sac avec des articles de poids et de profit connus, taille K. Votre objectif est de maximiser vos gains. Ici, nous utiliserons la mémorisation au lieu de la tabulation pour voir si nous pouvons résoudre le problème.

Le problème du sac à dos 0/1 ci-dessus utilisait une stratégie ascendante pour découvrir une solution, alors que ce problème utilise une approche descendante basée sur la mémorisation pour obtenir une solution.

La programmation dynamique utilise la mémorisation pour réduire le besoin de résoudre plusieurs fois les mêmes parties du problème. Cela élimine le besoin de résoudre constamment le sous-problème et rationalise le processus de génération de sortie.

Énoncé du problème Supposons que vous ayez un sac de capacité W et une liste de choses, chacune ayant un poids et un profit correspondant. Si le sac est plein avec autant d'efficacité que possible, on peut obtenir le niveau de profit potentiel le plus élevé.

La solution consiste à construire d'abord un tableau à deux dimensions pour contenir les réponses finales aux sous-problèmes individuels. Les colonnes du tableau répertorieront tous les poids potentiels entre 1 et W, en le partitionnant en autant de sections, et les lignes afficheront les poids que vous sélectionnez à chaque instant donné. 

Nous utilisons un tableau dp pour garder une trace de chaque sous-problème résolu. Plutôt que de résoudre un sous-problème précédemment résolu, nous renvoyons simplement sa réponse.

#3. Problème de sous-ensemble égal

Trouvez une partition de l'ensemble donné de sorte que le total des éléments dans les deux sous-ensembles soit le même en utilisant la programmation dynamique pour résoudre le problème des sous-ensembles égaux. En plus de ses autres noms, le problème de sous-ensemble égal (ou problème de partition) est une excellente illustration de la puissance de la programmation dynamique.

La tâche à accomplir nous oblige à diviser le tableau arr en deux afin que chacun des sous-ensembles suivants ait la même taille globale.

Comme solution, nous devons construire un tableau à deux dimensions avec des dimensions de (somme/2+1)*(cible+1). Ici, les résultats de la division du tableau d'origine peuvent être stockés pour chaque sous-ensemble et chaque somme, puis récupérés ultérieurement. La première dimension du tableau représentera les différents sous-ensembles qui peuvent être créés, tandis que la deuxième dimension du tableau représentera les différentes sommes qui peuvent être calculées en combinant des sous-ensembles.

Avantages de la programmation dynamique

Voici quelques-uns des avantages de la programmation dynamique.

#1. Remède efficace

La programmation dynamique est un outil puissant pour trouver des solutions optimales aux problèmes avec une sous-structure optimale et des sous-problèmes qui se chevauchent. En les décomposant en morceaux gérables, ces défis sont plus faciles à relever avec la méthode. La programmation dynamique est capable de créer une solution optimale en évitant les calculs répétitifs et en réutilisant les réponses aux sous-problèmes.

#2. Facilite la recherche facile de problèmes

Résoudre un problème difficile peut être plus facile en le décomposant d'abord en parties plus simples. Il rend les problèmes complexes plus faciles à résoudre en les partitionnant en morceaux plus gérables. Cette méthode simplifie la solution et rend le problème plus accessible.

#3. Efficace

En éliminant les calculs inutiles et en recyclant les sous-problèmes précédemment résolus, la programmation dynamique peut réduire considérablement le temps nécessaire pour résoudre un problème. Lorsque les sous-problèmes se chevauchent, la méthode peut aider en réduisant le nombre total de mesures nécessaires pour résoudre le problème.

#4. Efficace lorsqu'un problème a plusieurs solutions

La programmation dynamique peut aider à déterminer laquelle de plusieurs explications possibles est la plus susceptible d'être le cas. Lorsqu'il existe plusieurs options viables pour résoudre un problème, cette méthode peut nous aider à nous concentrer sur la meilleure.

Quels sont les inconvénients de la programmation dynamique ?

Voici quelques-uns des inconvénients de la programmation dynamique.

#1. Sous-problèmes récurrents

La programmation dynamique fonctionne mieux lorsque le problème comporte des sous-problèmes qui se chevauchent, ce qui n'est pas toujours le cas. Cela ne fonctionnera pas, et cela ne vous fournira probablement pas la meilleure solution, si les problèmes individuels ne se recoupent pas.

#2. Complicité dans le temps et l'espace

Si le problème est important, la programmation dynamique peut nécessiter beaucoup de mémoire et d'espace de stockage, ce qui augmente la complexité temporelle et spatiale de la solution. Utilisant la mémoire, l'approche stocke les résultats intermédiaires dans une table ou une table de mémorisation.

#3. Cadre de la question

Bien qu'efficace pour certaines structures de problèmes, la programmation dynamique n'est pas toujours le meilleur choix. Cette méthode fonctionne mieux lorsque le problème comporte des sous-problèmes qui se chevauchent, elle peut donc ne pas s'appliquer à d'autres situations.

#4. Difficile à mettre en pratique

 La programmation dynamique nécessite une connaissance approfondie des algorithmes et des structures de données, ce qui la rend difficile à mettre en œuvre pour les débutants. La méthode nécessite une réflexion préalable et une connaissance approfondie du problème à résoudre.

Conclusion

En conclusion, la programmation dynamique est une méthode efficace pour trouver des réponses, même si d'autres approches sont préférables. Il est crucial de connaître les avantages et les inconvénients et de choisir la bonne méthode en fonction du problème à résoudre. Pour les problèmes avec une sous-structure optimale et des sous-problèmes qui se chevauchent, la programmation dynamique peut donner une solution optimale ; cependant, cette méthode peut ne pas toujours être applicable. 

Bien qu'il soit difficile à développer et utilise beaucoup de mémoire, sa capacité à rationaliser le processus de résolution de problèmes et à raccourcir les temps de calcul en fait une ressource importante pour les informaticiens et les mathématiciens.

FAQ sur la programmation dynamique

Quelle est la différence entre la programmation linéaire et la programmation dynamique ?

Pour les problèmes d'optimisation linéaire, nous avons l'algorithme de programmation linéaire (LP), et pour les problèmes génériques d'optimisation non linéaire avec des contraintes non convexes, nous avons la programmation dynamique (DP), qui garantit l'optimalité globale d'une solution.

Est-il difficile d'apprendre la programmation dynamique ?

Il est de notoriété publique que la programmation dynamique est un sujet complexe, en particulier pour les nouveaux venus dans le domaine de l'informatique. Cependant, on peut apprendre facilement la programmation dynamique avec une solide compréhension des principes fondamentaux et une pratique abondante.

La programmation dynamique est-elle très difficile ?

Ils sont durs ! Pour commencer, l'idée de méthodes de programmation dynamique peut être difficile à saisir. Tout programmeur expert attesterait que la maîtrise de DP nécessite un engagement de temps important. L'habileté de décomposer un problème en ses éléments constitutifs et de le réassembler en un tout exploitable est également nécessaire.

Articles similaires

  1. GESTION DU TEMPS DU PROJET : processus, outils et logiciels pour une gestion efficace
  2. AMAZON SEO : Comment optimiser vos produits pour un meilleur classement
  3. LANGAGES DE PROGRAMMATION LES PLUS POPULAIRES : Guide 2023
  4. QU'EST-CE QUE LA PROGRAMMATION INFORMATIQUE : exemples, types, cours et logiciels
  5. Testaments en ligne : meilleurs créateurs de testaments en ligne.

Référence

Soyez sympa! Laissez un commentaire

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *

Vous aimeriez aussi