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

Calcul scientifique Python Discussion :

problème de combinatoire


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Mars 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Mars 2022
    Messages : 5
    Par défaut problème de combinatoire
    Bonjour,

    Je précise en préambule que je ne suis pas un professionnel ni un étudiant, juste un amateur qui essaye d'apprendre par lui-même python pour sa culture générale.
    J'essaie de rédiger un script qui détermine toutes les combinaisons possibles de n éléments pris dans n
    par exemple, pour [0,1,2], je voudrais obtenir [0,0,0], [0,0,1], [0,0,2], [0,1,0], [0,1,1], [0,1,2], [0,2,0), [0,2,1], [0,2,2], [1,0,0], [1,0,1], etc... soit 27 éléments (3³)
    Si n est fixé, par exemple 3, il suffirait de faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    liste=[]
    	for i in range(3):
    		p=[]
    		for i1 in range(3):
    			for i2 in range(3):
    				for i3 in range(3):
    					p.append([i1,i2,i3])
     
     
    	liste.append(p)
    print(liste)
    mais pour n quelconque, ce n'est pas possible de procéder comme ça.

    En faisant des recherches, j'ai vu qu'il y avait un module itertools qui pourrait résoudre mon problème, mais je voudrais essayer de trouver moi-même, si c'est possible avec mes connaissances.
    J'ai vu qu'il y avait la notion de récursivité qui pourrait peut-être convenir mais je n'arrive pas du tout à saisir la logique de cette notion, hors le cas d'une suite définie par récurrence un+1=f(un).
    Si vous pouvez me mettre sur la voie, merci d'avance. Si possible avec les notions les plus élémentaires possibles (je sais à peu près manipuler les listes, les dictionnaires, les boucles for et while)

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonsoir,

    Voici une version récursive,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def product(my_list, n):        
        if n == 1:
            return [(i,) for i in my_list]
        return [(j,) + k for k in product(my_list, n - 1) for j in my_list]
     
     
     
    print(product([1, 2, 3], 3))

  3. #3
    Futur Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Mars 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Mars 2022
    Messages : 5
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonsoir,

    Voici une version récursive,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def product(my_list, n):        
        if n == 1:
            return [(i,) for i in my_list]
        return [(j,) + k for k in product(my_list, n - 1) for j in my_list]
     
     
     
    print(product([1, 2, 3], 3))
    Merci pour cette réponse. Pour essayer de comprendre ce que fait python, j'ai décomposé de la manière suivante:
    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
    def product(my_list, n):        
    	if n == 1:
     
    		return [(i,) for i in my_list]
     
     
    	liste=[]
    	for j in my_list:
    		print('n',n)
    		print('product',product(my_list, n - 1))
    		for k in product(my_list, n - 1):
    			print('k',k)
    			u=(j,)+k
    			print('u',u)
    			liste.append(u)
    			print('liste',liste)
    	return liste
    Ce que je comprends :
    n démarre à 3, puis passe à 2.
    la fonction produit alors la liste dans le cas n=1, c'est à dire [(1,),(2,),(3,)]
    la boucle ajoute à ce que j'appelle "liste" les éléments (1,1),(1,2) et (1,3)
    ensuite, je vois que n prends la valeur 2, et là je suis largué. Je n'arrive pas à comprendre le cheminement de ce n.
    J'essaye quand même de continuer, et je vois que ma "liste" s'agrandit de tous les tuples de 2 éléments. Là où je ne comprends plus du tout, c'est qu'il semble qu'à ce stade, la liste est vidée de son contenu sauf le tuple (1,1).
    Bon, je vais essayer de me pencher la dessus davantage, mais c'est vraiment pas évident de comprendre la récursivité.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par david75017 Voir le message
    Merci pour cette réponse. Pour essayer de comprendre ce que fait python, j'ai décomposé de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def  product(my_list, n):
        if n == 1:
            return [(i,) for i in my_list]
        liste=[]
        for j in my_list:
            print('n',n)
            print('product',product(my_list, n - 1))
            for k in product(my_list, n - 1):
                print('k',k)
                u=(j,)+k
                print('u',u)
                liste.append(u)
                print('liste',liste)
        return liste
    Ce que je comprends :
    n démarre à 3, puis passe à 2.
    la fonction produit alors la liste dans le cas n=1, c'est à dire [(1,),(2,),(3,)]
    la boucle ajoute à ce que j'appelle "liste" les éléments (1,1),(1,2) et (1,3)
    ensuite, je vois que n prends la valeur 2, et là je suis largué. Je n'arrive pas à comprendre le cheminement de ce n.
    J'essaye quand même de continuer, et je vois que ma "liste" s'agrandit de tous les tuples de 2 éléments. Là où je ne comprends plus du tout, c'est qu'il semble qu'à ce stade, la liste est vidée de son contenu sauf le tuple (1,1).
    Bon, je vais essayer de me pencher la dessus davantage, mais c'est vraiment pas évident de comprendre la récursivité.
    À chaque fois qu'on appelle product on décrémente n, il ne faut pas attendre longtemps pour voir n qui vaut 2

    n=3
    j=1
    n=2
    j=1

    dans ton code tu lis pas de la bonne manière la liste, elle est mal indentée cette ligne et devrait être indentée de moins 4 espaces.

    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
    defproduct(my_list, n):       
        if n == 1:
            return [(i,) for i in my_list]
        
        liste=[]
        for j in my_list:
            print(f"n={n}")
            print(f"j={j}")
            for k in product(my_list, n -1):
                print(f"k={k}")
                u=(j,)+k
                print(f"u={u}")
                liste.append(u)
            print(f"liste = {repr(liste)}")
        return liste
    
    print(product([1, 2, 3], 3))
    
    

  5. #5
    Membre averti
    Homme Profil pro
    militaire
    Inscrit en
    Décembre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : militaire

    Informations forums :
    Inscription : Décembre 2015
    Messages : 16
    Par défaut nombre premier python
    Bonjour a tous,

    j' ai un petit problème, voici l' énoncé.

    Écrire une fonction booléenne premier(n) qui reçoit un nombre entier positif n et qui renvoie True si n est un nombre premier, et False sinon.
    Ensuite, écrire un programme qui lit une valeur entière x et affiche, grâce à des appels à la fonction premier, tous les nombres premiers strictement inférieurs à x, chacun sur sa propre ligne.

    Exemple 1
    Avec la donnée lue suivante :

    7
    le résultat à imprimer vaudra donc

    2
    3
    5
    Exemple 2
    Avec la donnée lue suivante :

    9
    le résultat à imprimer vaudra donc

    2
    3
    5
    7

    Voila mon code,

    Nom : Capture d’écran 2022-05-06 152120.png
Affichages : 136
Taille : 19,1 Ko

    la première partie avec la fonction est ok.
    mais pour la suite je dois afficher les nombres comme indiqué ci-dessus.
    Mais le problème c' est que j' affiche tous les nombres 2 3 4 5 6 7 8 9 10... en fonction du nombre
    demandé. J' ai beau rajouter certains bout de code, j' ai essayé d' enlevé le deuxième print i mais cela ne fonctionne pas.

    Pourriez vous m' aider.

    Merci par avance de vos réponses.



    Diakshunters

  6. #6
    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
    1) 1 demande d'aide = 1 sujet sur le forum

    2) code posté sur le forum ==> utiliser les balises CODE (l'icone avec # lorsque vous rédiger le message), pour que l'on puisse copier/coller votre code. Avec une capture d'écran, personne ne s'amusera à recopier votre code !

    3) Dans votre boucle for, vous testez premier(x) et pas premier(i), donc c'est un peu normal qu'à chaque tour de boucle ca fasse la même chose

    Si mon point 3 ne vous a pas débloqué, vous êtes priez d'ouvrir un nouveau topic, en respectant bien les points 1 et 2 de ce message

  7. #7
    Futur Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Mars 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Mars 2022
    Messages : 5
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    À chaque fois qu'on appelle product on décrémente n, il ne faut pas attendre longtemps pour voir n qui vaut 2

    n=3
    j=1
    n=2
    j=1

    dans ton code tu lis pas de la bonne manière la liste, elle est mal indentée cette ligne et devrait être indentée de moins 4 espaces.
    Merci pour cette clarification, mais ça reste difficile pour moi de suivre le cheminement du code. Il y a ce site https://pythontutor.com/visualize.html#mode=edit qui permet de suivre chaque étape, et même avec ça j'ai encore du mal. C'est vraiment pas trivial.
    Je vais persévérer!

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Citation Envoyé par david75017 Voir le message
    mais ça reste difficile pour moi de suivre le cheminement du code
    certains éditeurs python ont un debuggeur visuel intégré
    - possiblité de mettre des points d'arrets
    - visualisation des variables locales lors d'un arret
    - possibilité depuis le point d'arret d'exécuter le code "ligne à ligne" (avec mise en évidence de cette ligne) ou bloc à bloc et, d'avoir toujours ce visuel en temps réel sur les variables

    une image prise au hazard sur le web

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par david75017 Voir le message
    mais pour n quelconque, ce n'est pas possible de procéder comme ça.
    C'est d'abord une question d'algorithme (comment procéder) et de travail pour imaginer comment résoudre le problème.
    On peut par exemple remarquer que la suite [0,0,0], [0,0,1], [0,0,2], [0,1,0], [0,1,1], [0,1,2],... c'est N positions de 0 a N-1 et que le suivant se calcule en ajoutant 1 modulo N en propageant une retenue.

    Parti sur cette idée là, on peut essayer de coder quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    N = 3
    L = [0,] * N
     
    while True:
        print(L)
        for i in range(N):
            L[i] += 1
            if L[i] < N:
                break
            L[i] = 0
        else:
            break
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Futur Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Mars 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Mars 2022
    Messages : 5
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    C'est d'abord une question d'algorithme (comment procéder) et de travail pour imaginer comment résoudre le problème.
    On peut par exemple remarquer que la suite [0,0,0], [0,0,1], [0,0,2], [0,1,0], [0,1,1], [0,1,2],... c'est N positions de 0 a N-1 et que le suivant se calcule en ajoutant 1 modulo N en propageant une retenue.

    Parti sur cette idée là, on peut essayer de coder quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    N = 3
    L = [0,] * N
     
    while True:
        print(L)
        for i in range(N):
            L[i] += 1
            if L[i] < N:
                break
            L[i] = 0
        else:
            break
    - W
    Merci pour cette réponse. J'ai bien compris le fonctionnement du code, et bravo pour cette approche tres astucieuse, je n'y aurais jamais pensé.
    Un petit détail qui m'échappe. Je ne connaissais pas l'écriture [0,]. Quelle différence avec [0]?

  11. #11
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour

    pas de différence avec une liste mais cela à une différence avec un tuple (donc autant toujours le faire ?)
    Et cette notation est plus explicite pour le codeur avec la virgule : "une suite de..."

    la véritable "astuce" ici, c'est le multiplicateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    l = [0] 
    print(l, type(l))
    l = [0,] * 3
    print(l)
    l = [0] * 3
    print(l)
    l = (0,) * 3
    print(l)
    l = (0) * 3  
    print(l, , type(l))    # oops pas un tuple
    ps: et peut-être aussi, une différence historique avec d'anciennens versions de python ? (suis trop jeune pythonneux pour le savoir)

  12. #12
    Futur Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Mars 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Mars 2022
    Messages : 5
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    pas de différence avec une liste mais cela à une différence avec un tuple (donc autant toujours le faire ?)
    Et cette notation est plus explicite pour le codeur avec la virgule : "une suite de..."

    la véritable "astuce" ici, c'est le multiplicateur
    merci pour cette précision

Discussions similaires

  1. problème de combinatoire
    Par gpcbitnik38 dans le forum Probabilités
    Réponses: 1
    Dernier message: 29/04/2014, 17h25
  2. Problème Algorithme combinatoire
    Par Neiflheim dans le forum Mathématiques
    Réponses: 4
    Dernier message: 09/02/2012, 15h26
  3. Réponses: 1
    Dernier message: 24/10/2011, 10h49
  4. Un problème de combinatoire
    Par Sehnsucht dans le forum VB.NET
    Réponses: 4
    Dernier message: 20/10/2008, 18h16
  5. Problème d'optimisation combinatoire. Enfin je crois
    Par Arpivu dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 30/07/2007, 11h01

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