IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

algo optimal rendu de monnaie


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Par défaut algo optimal rendu de monnaie
    Hey tout le monde ^^,

    Pour un projet je dois écrire une fonction qui prend en paramètres une liste de pièces unique (ex : [4,3,3,1,1]) et un montant (ex:6) et renvoie la liste des pièces utilisés.

    Du coup pour l'instant j'ai réussis à faire l'aglo glouton mais pour l'optimal je galère un peu plus (ex: pour l'instant pour la liste d'avant je trouvais la liste [4,1,1] alors qu'il faudrait trouver [3,3])

    Voila pour mon problème si vous avez des questions

    Merci d'avance pour vos réponses

  2. #2
    Membre éprouvé
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Par défaut
    Bonjour,

    Pouvez-vous joindre le code que vous avez déjà fait pour que l'on puisse vous aiguiller au mieux ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    def rendreMonnaieGlouton(n, s):
        ret = []
     
        if n == 0:
            return ret
        if len(s) == 0:
            return None
     
        sbis = list(s)
        while len(sbis) != 0:
            #on prend la valeur la plus grande du tableau
            maxVal = max(sbis)
            iMaxVal = s.index(maxVal)
     
            sbis.remove(maxVal)
            p = s.pop(iMaxVal)
     
            if p == n:
                ret.append(p)
                s.append(p)
                return ret
            else:
                if p > n:
                    s.append(p)
                    continue
                else:
                    ret.append(p)
                    res = rendreMonnaieGlouton(n-p, s)
                    s.append(p)
                    if res != None:
                        for x in res:
                            ret.append(x)
                        return ret
                    else :
                        return None
        return None
    Voila pour l'algo glouton après il y a surement bien plus simple ^^'

  4. #4
    Membre éprouvé
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Par défaut
    1) Etant donné que la fonction doit retourner une liste, j'aurais retourné des [] à la place des None (c'est pinaillage) ; j'aurais également ajouté (par exemple) à la places None (quand le total demandé est 0, ou inférieur à la plus petite des pièces existante) :
    2) La boucle indexée sur la longueur de sbis me semble étrange... je pense qu'il faut tout refaire, ne serait-ce parce qu'il y a une erreur de raisonnement dans le fait de forcément prendre la plus haute valeur en pièces dans le rendu final ; votre exemple en est la preuve.
    Je crois qu'il faut essayer avec toutes les valeurs de pièces, la meilleure combinaison composée de pièces de valeur inférieur ; parmi toutes ces combinaisons, retourner celle qui a le plus petit nombre d'éléments

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    On peut faire un algo qui est celui que la boulangère applique lorsqu'elle nous rend la monnaie. Ca va nous donner une solution au problème "je donne quoi comme pièces pour faire X euros".

    Maintenant ce que vous introduisez dans votre question, c'est le mot "optimal". Ca veut dire quoi optimal ? Il faut préciser, car ca peut être optimal selon plein de critère différent !

    Bon là de ce que je devine, optimal voudrait dire avec le moins de pièces possibles. Mais du coup ca reste une optimisation. Donc soit vous adoptez :
    - un algorithme qui va parcourir exhaustivement toutes les solutions pour identifier à cout sûr la meilleure
    - un qui va ne faire qu'un nombre limité d'évaluation, mais qui va vous sortir une solution qui sera seulement localement optimale. Ca veut dire que si vous modifier un peu la solution, alors vous aurez forcément une solution moins bonne. Mais ca ne veut pas dire qu'il n'existe pas de meilleures solutions que celle trouvée, solution qui pourrait etre radicalement différente.

    Là au vu de la taille de votre problème, ce n'est pas très couteux d'examiner toutes les possibilités.
    Vous les examiner toutes, ne retenez que celles qui sont solutions (à mettre dans une liste par exemple), et après sur cette liste, vous identifier la possibilité la plus courte (i.e. avec le moins de pièces).

    Et après, à vous de voir :
    1) qu'est ce qu'on retourne s'il y a plusieurs solutions avec le meme nombre pieces ?
    2) qu'est ce qu'on fait s'il n'y a pas de solutions ? Comment détecter ca ?
    3) est ce qu'on traite les 2 questions précédentes, ou est ce qu'on suppose que ce qui est donné à la fonction admet une solution, et que celle-ci est unique ? (chose que mathématiques on fait souvent, mais informatiquement ce n'est en général pas une bonne idée)

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par Linkau Voir le message
    Du coup pour l'instant j'ai réussis à faire l'aglo glouton
    Désolé, ton algo ne fonctionne pas si on entre 6 avec [4, 3, 3, 1]. En prenant la pièce la plus grosse (ici 4) tu entres dans un cul de sac.
    Il te faut partir sur l'idée de lg_53, à savoir calculer toutes les solutions et ensuite extraire 1) celle qui donne un résultat et éventuellement 2) celle qui correspond à l'idée que tu te fais d'une optimisation.

    Citation Envoyé par Linkau Voir le message
    Voila pour l'algo glouton après il y a surement bien plus simple ^^'
    Ca peut se faire...

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import itertools
     
    def rendreMonnaie(n, s):
    	yield from sorted(
    		set(
    			y for y in (
    				x\
    				for i in range(1, len(s) + 1)\
    				for x in itertools.combinations(s, i)
    			) if sum(y) == n
    		),
    		key=lambda x: len(x),
    	)
    # rendreMonnaie()
     
    for m in rendreMonnaie(6, [4, 3, 3, 3, 1, 1, 6]):
    	print(m)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Houmpff ! Même après qqs années de pratique, je n'y comprends rien : pas à la portée du premier débutant venu

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Houmpff ! Même après qqs années de pratique, je n'y comprends rien : pas à la portée du premier débutant venu
    Réécris la comprehension list sous forme de boucle standard
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range(1, len(s) + 1):
    	for x in itertools.combinations(s, i):
    		print(x)
    C'est de là que je suis parti. Donc de là tu verras le principe utilisé et pourras en déduire le reste
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Oui, enfin avec des set, yield et autres sorted(key lambda) c'est quand même du haut niveau.
    J'ai des choses à comprendre bien avant cela.

  10. #10
    Membre éprouvé
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Par défaut
    Oui, enfin avec des set, yield et autres sorted(key lambda) c'est quand même du haut niveau.
    Et non justement ! Ce sont des fondamentaux. Le bon niveau c'est au minimum de comprendre à quoi servent ses fonctions, le haut niveau c'est savoir quand les utiliser intelligemment

    J'ai des choses à comprendre bien avant cela.
    Je dirai au contraire que ça vaut le coup de prendre quelques minutes, ou quelques heures selon votre niveau, de comprendre ces notions ; un exemple tout bête : moi-même.
    Je suis un pur autodidacte et j'ai commencé au travers de ma formation à la fac avec Matlab. Quand j'ai commencé à coder en python, je ne jurai que par le module NumPy et ses arrays... sans même connaître les listes ! Lorsque j'ai commencé à creuser, je me suis rendu compte de tout le boulot que j'avais pour rien avec mes arrays

Discussions similaires

  1. Algo de rendu de monnaie (oui, encore un)
    Par DarkSeiryu dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 21/02/2017, 22h56
  2. Algo rendu de monnaie
    Par Matt_NewDev dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 28/03/2012, 17h24
  3. Rendu de monnaie + CombinaisonS
    Par esco123 dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 19/05/2008, 16h41
  4. Rendu de monnaie
    Par bgre25 dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 13/05/2008, 19h55
  5. cet algo ma rendu folle, aidez moi svp
    Par sarah_angel dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 06/11/2007, 22h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo