diff --git a/programmation_dynamique/bag/main.py b/programmation_dynamique/bag/main.py new file mode 100644 index 0000000..89fb5eb --- /dev/null +++ b/programmation_dynamique/bag/main.py @@ -0,0 +1,89 @@ +Videos = { + "Video 1": {"Durée": 114, "Taille": 4.57}, + "Video 2": {"Durée": 32, "Taille": 0.63}, + "Video 3": {"Durée": 20, "Taille": 1.65}, + "Video 4": {"Durée": 4, "Taille": 0.085}, + "Video 5": {"Durée": 18, "Taille": 2.15}, + "Video 6": {"Durée": 80, "Taille": 2.71}, + "Video 7": {"Durée": 5, "Taille": 0.32}, +} + + +def dico_vers_liste(dico: dict) -> list: + """ + Conversion d'un dictionnaire en liste. + PARAM. : + - dico : DICT, dictionnaire à applatir + RESULT. : + - LIST, chaque élément de la liste est un tuple (cle, valeur) du dictionnaire. + PRECOND. : + - aucune + EFFET DE BORD : + - aucun + + """ + return list( + dico.items() # j'ai remplacer le code de base qui contenait Videos a la place de dico dans le return + ) + + +def entier_vers_binaire(n: int, taille: int) -> list: + """ + Conversion d'un entier en binaire sur une taille donnée. + PARAM. : + - n : INT, le nombre à convertir + - taille : INT, la taille (nb de bits) fixe de la représentation + RESULT. : + - LIST, la liste des bits de la représentation en binaire, + indexée par le poids + PRECONDITION : + - n < 2**taille : un entier >= 2**taille n'est pas représentable + dans la taille donnée + EFFET DE BORD : + - aucun + """ + assert 2**taille > n, "Taille de représentation trop petite" + bits = [0] * taille + for i in range(taille): + bits[i] = (n >> i) & 1 + + return bits + + +def ensemble_des_parties(ensemble: list) -> iterator: + """ + Construit l'itérable enumérant toutes les parties d'un ensemble. + PARAM. : + - ensemble : LIST, la liste des éléments de l'ensemble + RESULT. : + - ITERATOR, le générateur de toutes les parties de l'ensemble + PRECONDITION : + - aucune + EFFET DE BORD : + - aucun + """ + n = len(ensemble) + for mask in range(2**n): + partie = [ensemble[i] for i in range(n) if (mask >> i) & 1] + yield partie + +def total_duree(partie): + return sum(elt[1]['Durée'] for elt in partie) +def total_taille(partie): + return sum(elt[1]['Taille'] for elt in partie) + +def sac_a_dos_force_brute(videos, capacite): + meilleur = ([], 0, 0.0) + for partie in ensemble_des_parties(videos): + taille = total_taille(partie) + duree = total_duree(partie) + if taille <= capacite and duree > meilleur[1]: + meilleur = ([v[0] for v in partie], duree, taille) + return meilleur + +if __name__ == "__main__": + # Conversion du dictionnaire des vidéos en liste + liste_videos = dico_vers_liste(Videos) + # Affichage de contrôle + for video in liste_videos: + print(video)