Caractéristiques des algorithmes gloutons
Principe général
Relativité de l’optimisation
Rendu de monnaie
Énoncé du problème
- L’outil de rendu de monnaie pourra être intégré à un automate distributeur ou à une caisse enregistreuse afin de proposer un rendu de monnaie, permettant de préserver le fonds de caisse.
- Il faut conserver une monnaie suffisante dans notre fonds de caisse, et ainsi pouvoir continuer à rendre la monnaie le plus longtemps possible.
Stratégie gloutonne
Implémentation
- Définir la monnaie triées par ordre croissant.
- Notre fonction comporte deux paramètres :
le montant à rendre ;
les valeurs faciales.
- Notre algorithme calcule pour chaque valeur faciale :
la quantité maximale de chaque valeur faciale qu’il est possible de rendre avec une division entière et l’ajoute au nombre de pièces et de billets à rendre ;
le nouveau reste. Il retourne le nombre de pièces et de billets à rendre.
- Notre fonction se contente de nous indiquer le nombre de billets ou de pièces à rendre, mais elle peut aussi retourner une liste de tuples contenant chacun la quantité et la valeur faciale des billets ou pièces à rendre.
Problème du sac à dos
Énoncé du problème
Stratégie gloutonne
Implémentation
- Notre implémentation retournera la valeur énergétique totale disponible dans le sac et les quantités prises pour chaque aliment.
- Nous devons lui communiquer en entrée :
la capacité du sac à dos ;
la quantité de chaque aliment sous forme de liste ;
leur densité énergétique correspondante sous forme de liste également (non forcément ordonnée).
L’aliment le plus énergétique possible est recherché à chaque fois. On évalue ensuite, s’il est possible de le prendre ou non en totalité. La quantité restante disponible est mise à jour en fonction de la quantité mise dans le sac. La capacité restante du sac est pareillement mise à jour à chaque tour de boucle.
- Notre algorithme glouton produit bien le résultat attendu, mais avec ses boucles imbriquées, sa complexité temporelle est $\text{O}(\text{n}^2)$.
Optimisation
- Nous allons générer un index spécifique qui fournira l’ordre dans lequel lire les densités et les quantités correspondantes, en nous basant sur des densités décroissantes.
- Pour construire notre index, nous mettrons à profit les possibilités de tri avec un critère personnalisé proposés optionnellement par la méthode sort().
En intégrant ce tri personnalisé préalable, nous pouvons simplifier notre algorithme glouton.
- Nous avons supprimé l’imbrication de boucle, réduisant le coût cette partie de l’algorithme de $\text{O}(\text{n}^2)$ à $\text{O}(\text{n})$.
La complexité de ce tri étant pseudo-linéaire, le coût temporel global de notre nouvel algorithme est donc $\text{O}(\text{n}\,\text{log}\,\text{n})$.