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 :

Problème (Permutation?) pour générer des combinaisons


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Problème (Permutation?) pour générer des combinaisons
    Bonjour,
    J'ai un problème de génération de combinaison.

    A partir d'un liste de valeur d'un tableau à 2 colonnes.

    Type;Valeur
    A;1
    A;2
    A;3
    B;1
    B;2
    D;1
    D;2

    Donc des types différents (je ne sais pas combien) et pour chacun des types des valeurs distincts.


    Je cherche à créer toutes les combinaison possible entre ces valeurs.
    Sachant qu'une collection ne peut contenir qu'une seule fois un type données et doit les contenir tous.

    Donc par exmple:
    A1 B1 C1 D1
    A2 B1 C1 D1
    A1 B2 C1 D1
    A1 B1 C1 D2
    A2 B2 C1 D1
    ...

    Ce sont des collections non ordonnées, donc:
    A2 B1 C1 D1 = B1 A2 C1 D1

    Et si certains peuvent juste me donner le bon vocabulaire pour définir mon problème ce serait une aide précieuse.

    Merci à vous

    Matthieu

  2. #2
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Points : 21
    Points
    21
    Par défaut
    bonjour,
    tu peux modeliser ton probleme comme un systeme de boites reperees par des lettres A,B... chaque boite contenant un certain nombre de boules reperees par des chiffres 1,2,3...
    Tu alignes donc tes boites par ordre alphabetique croissant puis tu sors de chaque boite la boule avec le plus petit numero. C'est ta premiere permutation.
    Ensuite tu sors de la boite la plus a droite la boule ayant le numero suivant qui te donnes une deuxieme permutation.
    Quand tu as epuise toutes les boules de cette derniere boite tu reviens a la premiere boule et tu sors de la boite qui se trouve a sa gauche la boule avec le numero suivant.
    En procedant de proche en proche tu devrais obtenir toutes les combinaisons qui sont en nombre egal au produit du nombre de boules dans chaque boite.

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    fais donc une petite recherche avec les mots "génération de combinaison" le sujet a déjà été traité de maintes fois. Je crois même qu'il y a du code dans le rubrique contribuez.
    En général ce que tu veux faire se résume par une recherche exhaustive de toutes les possibilités et qui se traite par un appel récursif.
    Pour éviter les doublons comme tu montres dans ton exemple, il faut faire un décalage dans le démarrage des boucles en fonction de la profondeur de ton appel récursif.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par diendjao Voir le message
    Et si certains peuvent juste me donner le bon vocabulaire pour définir mon problème ce serait une aide précieuse.
    "Produit cartésien de plusieurs ensembles"
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Citation Envoyé par diendjao
    Type;Valeur
    A;1
    A;2
    A;3
    B;1
    B;2
    D;1
    D;2
    Et celà signifie-t-il ceci:
    A={1;2;3}
    B={1;2}
    D={1;2}

    Dans ce cas ce n'est ni une combinaison, ni une permutation.
    Tu chercherais effectivement à énumérer le produit cartésien A × B × D c'est-à-dire l'ensemble des triplets (a,b,d) ∊ A × B × D.
    C'est exactement à celà que sert une boucle for, à énumérer un ensemble.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  6. #6
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Soit E l'ensemble des types: A,B,C (nombre m)
    Soit F l'ensemble des valeurs: 1,2,3,4 (nombre n)
    Ce qui est donné en exemple c'est l'ensemble des parties à 4 éléments du produit cartésien ExF. Si c'est bien ça le nombre est donc C4,mxn
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bonjour à tous,
    Merci pour vos réponses.

    Cela signie que à partir de ça TABA

    A 1
    A 2
    A 3
    B 1
    C 1
    C 2
    C 3
    D 4

    ca donne ça: TABB
    A.1,B.1,C.1,D.4
    A.2,B.1,C.1,D.4
    A.3,B.1,C.1,D.4
    A.1,B.1,C.2,D.4
    A.2,B.1,C.2,D.4
    A.3,B.1,C.2,D.4
    A.1,B.1,C.3,D.4
    A.2,B.1,C.3,D.4
    A.3,B.1,C.3,D.4


    Je suis parvenu à le coder en récursif en supprimant les valeurs de départ après insertion.

    Merci.

    Matthieu

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par diendjao Voir le message
    Je suis parvenu à le coder en récursif en supprimant les valeurs de départ après insertion.
    ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    faut vraiment arrêter les questions de la forme:
    j'ai ce tableau de valeurs en entrée:
    A B B A; C C O O L; L O L

    je veux ce tableau en sortie:
    L O L; A B B A C; C O O L

    comment je fais ?
    Je suis parvenu à le coder en récursif en supprimant les valeurs de départ après insertion.
    tu parles comme Dr Spock
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Il est vrai que ma réponse est assez énigmatique.
    En code ça donne ça, c'est de l'ABAP.
    Si ça pose problème à certain, je peux vous le faire en pseudo code.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    FUNCTION zcreate_filter_comb.
    *"----------------------------------------------------------------------
    *"*"Local Interface:
    *"  TABLES
    *"      IT_FILTER TYPE  ZIPT_FILTER
    *"      T_COMB TYPE  BAPI6111MDX_T
    *"----------------------------------------------------------------------
     
      DATA :
            ls_filter     TYPE zips_filter,
            ls_comb       TYPE bapi6111mdx,
            ls_comb_add   TYPE bapi6111mdx,
            lt_comb       TYPE bapi6111mdx_t,
            lv_iobj       TYPE rsiobjnm,
            lv_first      TYPE c,
            iln1          TYPE i,
            iln2          TYPE i
            .
     
      "At first call of the function t_comb is empty
      "Make sure that table is sorted and has unique values
      IF t_comb[] IS INITIAL.
        SORT it_filter ASCENDING BY iobjnm value.
        DELETE ADJACENT DUPLICATES FROM it_filter.
        lv_first = 'X'.
      ENDIF.
     
      " Loop at filters value
      LOOP AT it_filter INTO ls_filter.
     
        " If first call of function and first loop
        " Insert first value
        IF lv_first = 'X' AND ( lv_iobj = ls_filter-iobjnm OR lv_iobj IS INITIAL ).
          CONCATENATE '(' ls_filter-iobjnm '.' ls_filter-value INTO ls_comb-line.
          APPEND ls_comb TO lt_comb.
     
        ELSE.
          "Else if object type is the same as the previous one insert new line
          IF lv_iobj = ls_filter-iobjnm OR lv_iobj IS INITIAL.
            LOOP AT t_comb INTO ls_comb.
              CONCATENATE ',' ls_filter-iobjnm '.' ls_filter-value INTO ls_comb_add-line.
     
              "just to make sure that string size is long enough
              iln1 = STRLEN( ls_comb-line ).
              iln2 = STRLEN( ls_comb_add-line ).
              iln1 = iln1 + iln2.
              IF iln1 < 70 .
                CONCATENATE ls_comb-line ls_comb_add-line INTO ls_comb-line.
                APPEND ls_comb TO lt_comb.
              "Else insert 2 lines
              ELSE.
                APPEND ls_comb TO lt_comb.
                APPEND ls_comb_add TO lt_comb.
              ENDIF.
            ENDLOOP.
     
          ELSE.
            "Else here come a different object
            CALL FUNCTION 'ZCREATE_FILTER_COMB'
              TABLES
                it_filter = it_filter
                t_comb    = lt_comb.
     
          ENDIF.
     
        ENDIF.
        "keep current object type for next loop
        lv_iobj = ls_filter-iobjnm.
        " Remove inserted values from filters
        DELETE it_filter INDEX 1.
     
      ENDLOOP.
     
      "return generated combinaison
      t_comb[] = lt_comb[].
     
    ENDFUNCTION.

    Merci

    Matthieu

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 13/03/2011, 20h14
  2. [Toutes versions] Problème pour générer des combinaisons
    Par Mootchoop dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 17/11/2009, 19h40
  3. Réponses: 1
    Dernier message: 18/05/2006, 21h22
  4. [JFOR][RTF]Utilisation de jfor pour générer des RTF
    Par pistache42 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 28/04/2006, 09h23

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