Algorithme Glouton

Un algorithme glouton (ou “greedy”) construit une solution étape par étape, en choisissant à chaque étape le meilleur choix possible sur le moment, sans revenir en arrière. Il ne garantit pas toujours la meilleure solution globale, mais il est souvent simple et rapide à mettre en œuvre.

Algorithme glouton récursif : à chaque étape, on choisit le plus grand élément satisfaisant la contrainte

À chaque appel récursif, on sélectionne le plus grand élément possible qui respecte encore la contrainte du problème, puis on réappelle la fonction sur ce qu'il reste à résoudre.

pieces_disponibles = [50, 20, 10, 5, 2, 1]  #pièces disponibles, triées du plus grand au plus petit
 
def rendu_monnaie(montant, pieces_disponibles):
    """
    Objectif :
    Calcule, de façon récursive, la liste des pièces à rendre pour un montant donné,
    en choisissant à chaque étape la plus grande pièce possible.
    Entrée :
    montant             : int : le montant restant à rendre
    pieces_disponibles  : list : la liste des pièces disponibles, triées du plus grand au plus petit
    Sortie :
    rendu : list : la liste des pièces utilisées pour rendre le montant
    """
    if montant == 0:  #condition d'arrêt : il ne reste plus rien à rendre
        return []
 
    for piece in pieces_disponibles:  #on cherche la plus grande pièce satisfaisant la contrainte
        if piece <= montant:
            rendu = [piece] + rendu_monnaie(montant - piece, pieces_disponibles)
            return rendu
 
print(rendu_monnaie(78, pieces_disponibles))  #affiche [50, 20, 5, 2, 1]

Algorithme glouton itératif : à chaque étape, on place l'élément dans le premier emplacement disponible

À chaque étape de la boucle, on parcourt les emplacements disponibles (par exemple des boîtes) et on place l'élément dans le premier emplacement qui peut encore le contenir.

objets = [4, 8, 1, 4, 2]  #taille de chaque objet à ranger
capacite_boite = 10        #capacité maximale de chaque boîte
 
def rangement_boites(objets, capacite_boite):
    """
    Objectif :
    Range une liste d'objets dans des boîtes, en plaçant chaque objet dans le premier
    emplacement disponible (première boîte ayant encore assez de place).
    Entrée :
    objets         : list : la liste des tailles des objets à ranger
    capacite_boite : int : la capacité maximale de chaque boîte
    Sortie :
    boites : list : la liste des boîtes, chaque boîte étant elle-même une liste d'objets
    """
    boites = []
 
    for objet in objets:  #on place chaque objet un par un
        place = False  #indique si l'objet a été placé dans une boîte
        for boite in boites:  #on cherche la première boîte ayant assez de place
            if sum(boite) + objet <= capacite_boite:
                boite.append(objet)
                place = True
                break
        if not place:  #aucune boîte existante ne peut accueillir l'objet
            boites.append([objet])
 
    return boites
 
print(rangement_boites(objets, capacite_boite))  #affiche [[4, 4, 2], [8, 1]]