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

Algorithmes et structures de données Discussion :

Génération des combinaisons K parmi N d'une liste mais avec des éléments ayant plusieurs états (vecteurs)


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Par défaut Génération des combinaisons K parmi N d'une liste mais avec des éléments ayant plusieurs états (vecteurs)
    Bonjour,
    Il faut que je génère la liste de toutes les combinaisons possibles de cardinalité K pour une liste d'élément de N éléments.
    Le problème c'est que chacun des éléments de ma liste peut avoir plusieurs états. Il me faut générer toutes les combinaisons possibles de cardinalité K (2< K < N) en prenant en compte les variantes de chacun des éléments, sans mettre dans la combinaison un même élément sous deux états.

    Je ne sais pas si je suis très clair, je vais donc vous donner un exemple:
    List<Elements> list = (elemA, elemB, elemC)
    elemA a 2 états: elemA1, elemA2
    elemB a 2 états: elemB1, elemB2
    elemC a 2 états: elemC1, elemC2

    je dois générer l'ensemble des combinaisons non ordonnées des elements avec les autres peut importe leur état.
    Si la cardinalité est 2, je pense que cela donnerait:
    (elemA1, elemB1), (elemA1, elemB2), (elemA1, elemC1), (elemA1, elemC2),
    (elemA2, elemB1), (elemA2, elemB2), (elemA2, elemC1), (elemA2, elemC2),
    (elemB1, elemC1), (elemB1, elemC2),
    (elemB2, elemC1), (elemB2, elemC2)

    la cardinalité de la liste N est variable. Idem pour la cardinalité K des combinaisons à générer. (il me faudra toutes les combinaisons pour K allant de 2 à N-1)
    Mon nombre d'état est fixe (2) pour chacun des éléments de la liste mais tant qu'à faire, je me pose la question d'une solution générique ou chacun des éléments aurait son vecteur d'état de dimension variable.

    Quelqu'un a une idée ou déjà fait ce genre de combinatoire?
    Mon appli est en C++ mais le langage importe peu.

    Merci d'avance!

  2. #2
    Membre Expert

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Billets dans le blog
    9
    Par défaut Génération des combinaisons K parmis N d'une liste mais avec des éléments ayant plusieurs états (vecteurs))?
    Bonjour,

    À priori, la sélection de (K) éléments pris dans une liste en comportant (N) devrait permettre de réaliser CNK = N!/(K!*(N - K)!) combinaisons.

    Si de plus chacun de ces éléments présente (Ei) états différents, sans exclusion mutuelle (sont compatibles au sein d'une combinaison donnée tous les états de tous les éléments présents), le nombre de combinaisons possibles devient:

    C' = Somme(P(Ei))

    expression dans laquelle intervient la somme des produits des nombres d'états des éléments présents dans une combinaison donnée, soit (CNK) termes.

    Exemple: pour un ensemble de (N = 5) éléments (V, W, X, Y, Z) présentant respectivement (2, 3, 4, 5, 6) états différents, on devrait avoir:
    C53 = (4*5/2) = 10 combinaisons de 3 termes, et en tenant compte des divers états:
    C' = PVWX + PVWY + PVWZ + PVXY + PVXZ + PVYZ + PWXY + PWXZ + PWYZ + PXYZ avec
    # PVWX = 2 * 3 * 4 = 24
    # PVWY = 2 * 3 * 5 = 30
    # PVWZ = 2 * 3 * 6 = 36
    # PVXY = 2 * 4 * 5 = 40
    # PVXZ = 2 * 4 * 6 = 48
    # PVYZ = 2 * 5 * 6 = 60
    # PWXY = 3 * 4 * 5 = 60
    # PWXZ = 3 * 4 * 6 = 72
    # PWYZ = 3 * 5 * 6 = 90
    # PXYZ = 4 * 5 * 6 = 120 , soit au total: 580 (calculs à vérifier ).

    Dans le cas particulier de nombres d'états tous identiques, on obtient C'(N, K, NE) = (CNK)*(NE)K , soit:
    # C'(N, K, 1) = (CNK)*(1K) = CNK dans le cas d'un état unique, et
    # C'(3, 2, 2) = (C32)*(22) = 3 * 4 = 12 pour l'exemple que tu as choisi (N = 3, K = 2, NE = 2).

    L'expression générale de (C') est possible, mais vraiment très lourde.

  3. #3
    Membre confirmé

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Par défaut
    re bonjour,
    Merci pour ta réponse rapide. En effet je vois maintenant la formule C'(N, K, NE) = C(N,K)*NE^K

    Sachant qu'il va me falloir générer l'ensemble des combinaisons de cardinalité K dans N éléments qui ont 2 états pour K variant de 1 à N, j'obtiens
    SUM(k=1..N, C(n,k)*2^k)
    ce qui donne:
    SUM(C(2, k) with 2 states) = 8
    SUM(C(3, k) with 2 states) = 26
    SUM(C(4, k) with 2 states) = 80
    SUM(C(5, k) with 2 states) = 242
    SUM(C(6, k) with 2 states) = 728
    SUM(C(7, k) with 2 states) = 2186
    SUM(C(8, k) with 2 states) = 6560
    SUM(C(9, k) with 2 states) = 19682
    SUM(C(10, k) with 2 states) = 59048
    SUM(C(11, k) with 2 states) = 177146
    SUM(C(12, k) with 2 states) = 531440
    SUM(C(13, k) with 2 states) = 1594322
    SUM(C(14, k) with 2 states) = 4782968
    SUM(C(15, k) with 2 states) = 14348906

    ça monte vite! Normalement mon N sera inférieur à 10... j'espère...

    Du coup je vois mieux comment générer toutes les combinaisons pour un N, K donné:
    - d'abord je génère la liste avec le premier état
    - puis pour J allant de 1 à N, j'augmente la liste en changeant l'état de l'élément J

    sur mon exemple de 2 parmis 3 cela ferait:
    iter1: (A1, B1) (A1, C1) (B1, C1)
    iter2: (A1, B1) (A1, C1) (B1, C1), (A2, B1) (A2, C1)
    iter3: (A1, B1) (A1, C1) (B1, C1), (A2, B1) (A2, C1) , (A1, B2) (B2, C1), (A2, B2)
    iter4: (A1, B1) (A1, C1) (B1, C1), (A2, B1) (A2, C1) , (A1, B2) (B2, C1), (A2, B2) , (A1, C2) (B1, C2), (A2, C2) , (B2, C2)

    Que pensez vous de cette approche?

    Le problème c'est que j'ai une contrainte en plus:
    Lorsque je calcule mon ensemble de combinaison K parmis N, List(N, K), je fais un calcul pour chacune des combinaisons.
    J'ai donc une MAP avec pour clef une liste, et pour valeur mon résultat.

    Pour la génération de l'ensemble de combinaisons K+1 parmis N, je ne suis pas intéressé par celle contenant un sous ensemble de cardinalité K qui a un résultat spécifique dans ma Map.
    Serait il possible de générer cet ensemble de combinaisons K+1 parmis N en excluant directement celles qui ne m'intéressent plus?
    Cela m'éviterait de les calculer toutes pour ensuite tester pour chacune d'elle tous les sous ensembles de cardinalité K et potentiellement les enlever.

    Voyez vous ce que je veux dire?
    dans mon exemple en dimension 3, j'avais d'abord calculé l'ensemble des combinaison de cardinalité 1: A1, B1, C1, A2, B2, C2
    Supposons que mon calcul me donne le résultat attendu pour A1,
    je ne veux donc plus dans ma liste de cardinalité 2 tous les couples contenant A1.
    i.e: (B1, C1), (A2, B1) (A2, C1) , (B2, C1), (A2, B2) , (B1, C2), (A2, C2) , (B2, C2)

    Une idée de comment générer une telle liste directement? ma méthode simple ne marche plus...

    Pour continuer la logique en cardinalité 3, si (A2, B2) et (B2, C2) me donne le résultat attendu, au lieu de la liste complète
    (A1, B1, C1) (A2, B1, C1) (A1, B2, C1) (A2, B2, C1) (A1, B1, C1) (A2, B1, C1) (A1, B2, C1) (A2, B2, C1)

    je ne suis intéressé que par: (A2, B1, C1) (A2, B1, C1)

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 295
    Par défaut
    Bonjour

    Que pensez vous de cette approche?
    Elle est foireuse.
    Wiwaxia a été très clair : Tu choisis les éléments, puis, tu choisis les états.
    Je ne comprends pas que tu listes des AC avant d'avoir lister tous les états des AB.

    Serait il possible de générer cet ensemble de combinaisons K+1 parmis N en excluant directement celles qui ne m'intéressent plus?
    Oui.

    Voyez vous ce que je veux dire?
    Un peu. Mais quel est la difficulté ?

    Une idée de comment générer une telle liste directement?
    Ben déjà, nous ne savons pas où tu es. Dans des boucles imbriquées ? Dans une liste que tu stockes vraiment en mémoire ?

  5. #5
    Membre confirmé

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Par défaut
    Elle est foireuse.
    Wiwaxia a été très clair : Tu choisis les éléments, puis, tu choisis les états.
    Je ne comprends pas que tu listes des AC avant d'avoir lister tous les états des AB.
    Je serais parti d'un algo existant me fournissant la liste des combinaisons utilisant le premier état de chacun des éléments. (Iter1, j'obtiens une liste de C(n,k) éléments)
    C'est ensuite que j'imaginais compléter la liste avec une boucle sur chacun des élements pour ajouter les variantes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for each element
        for each combination of the list
            if the combination contains the element
                 add to the list the combination where the state of the element is changed
    Ben déjà, nous ne savons pas où tu es. Dans des boucles imbriquées ? Dans une liste que tu stockes vraiment en mémoire ?
    Je ne sais pas encore comment je vais partir. Je prends des avis avant car j'aimerais partir sur une direction optimale...
    Ça ne m'a pas l'air le cas de la méthode que j'ai décrite, notamment car je ne pourrai pas exclure les combinaisons qui ne m'intéressent pas lors de la construction de la liste...

    Je n'ai pas trop d'autres idées, c'est pourquoi je demande...

  6. #6
    Membre Expert

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Billets dans le blog
    9
    Par défaut Génération des combinaisons K parmis N d'une liste mais avec des éléments ayant plusieurs états (vecteurs))?
    Citation Envoyé par ramislebob Voir le message
    Je serais parti d'un algo existant me fournissant la liste des combinaisons utilisant le premier état de chacun des éléments. (Iter1, j'obtiens une liste de C(n,k) éléments)
    C'est ensuite que j'imaginais compléter la liste avec une boucle sur chacun des élements pour ajouter les variantes ...
    Il y a bien une autre piste, encore que je n'en voie pas très bien la finalité ... Celle d'une variable tableau de dimensions approximatives (CNK)×((NE)K), que l'on peut envisager si les données (N) et (NE) restent en-deçà de limites raisonnables, conformément aux indications du message (#3): N <~ 10 et NE = 2 .

    Il s'agit apparemment (si j'ai bien compris) de mémoriser:
    a) les (CNK) combinaisons de (K) termes parmi (N), et
    b) la liste correspondante de toutes les combinaisons d'états possibles, soit (NE)K.

    1°) Les combinaisons (VWX, VWY, VWZ ...) peuvent être représentées d'une manière ordonnée en notation binaire par les nombres ($00111, $01011, $10011 ...), donc par des entiers au plus égaux à (25 - 1 = 31) et tels que la somme de leurs chiffres soit égale à 3 (dans le même système de numération); soit donc en généralisant par des entiers vérifiant: Nmax = 2N - 1 et Schb = K
    2°) Les suites d'états sont représentables d'une manière semblable par les nombres ($001, $010, $011 ... $111) au plus égaux à (23 - 1 = 7); et pour un nombre d'états quelconque, par un entier écrit en base (NE) et limité par Emax = (NE)K - 1).

    Etant donné deux types d'entiers (T_Entier1, T_Entier2) respectivement compatibles avec les limites précédentes (Nmax, Emax), un tableau d'enregistrements comme ci-dessous, dont l'initialisation ne poserait pas de problème, pourrait peut-être convenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TYPE LstE2 = ARRAY[0..Emax] OF T_Entier2;
         Ligne = RECORD  Monome: T_Entier1; ListeE: LstE2  END;
         Tab_L = ARRAY[1..Cnk] OF Ligne;
     
    VAR Tableau: Tab_L;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire une liste déroulante avec des drapeaux
    Par identifiant_bidon dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 25/04/2011, 22h04
  2. [MySQL] Remplir une liste déroulante avec des données de la base de données
    Par moukit233 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 12/08/2009, 11h05
  3. Réponses: 2
    Dernier message: 11/05/2009, 09h36
  4. une liste deroulante avec des logos
    Par petitdebutant dans le forum VBA Word
    Réponses: 1
    Dernier message: 26/01/2009, 16h10
  5. Réponses: 1
    Dernier message: 01/03/2008, 11h25

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