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 :

Algo de "rencontre"


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 126
    Points : 105
    Points
    105
    Par défaut Algo de "rencontre"
    Bonsoir,

    J'ai plusieurs valeurs, par exemple : 1/2/3/4/5/6

    Je voudrais par un algo obtenir tout les couples possible, mais avec ces conditions :
    - un couple ne peut pas être fait de 2 même valeurs
    - une valeur ne peut être utilisé qu'une fois

    En gros, je voudrais arriver au resultat suivant :
    1. [1/2] [3/4] [5/6]
    2. [1/3] [2/6] [4/5]
    3. [1/4] [2/5] [3/6]
    4. [1/5] [2/3] [4/6]
    5. [1/6] [2/4] [3/5]

    J'ai tente plusieurs algo, mais à chaque fois un moment ou un autre je tombais sur des couples déjà formés

    Autre formulation pour mieux comprendre :
    J'ai tout les couples d'une serie de caractere, par exemple a/b/c/d
    ce qui nous donne :
    (a/b)(a/c)(a/d)
    (b/c)(b/d)
    (c/d)

    Je voudrais tous les mettre dans un tableau (donc 2x3), sans qu'il y ai 2 fois ou plus le même caractere sur une ligne,
    par exemple, le bon tableau donnerai :
    1 : (a/b) (c/d)
    2 : (a/c) (b/d)
    3 : (a/d) (b/c)

    Merci beaucoup

  2. #2
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Pour la série
    1,2,3,4,5,6 vous cherchez ''la'' solution
    1. [1/2] [3/4] [5/6]
    2. [1/3] [2/6] [4/5]
    3. [1/4] [2/5] [3/6]
    4. [1/5] [2/3] [4/6]
    5. [1/6] [2/4] [3/5]

    Précisez car je ne vois pas du tout comment vous pouvez sélectionner votre soulution plutôt que, par exemple :

    1. [1/2] [3/5] [4/6]
    2. [1/3] [2/6] [4/5]
    3. [1/5] [2/4] [3/6]
    4. [1/4] [2/3] [5/6]
    5. [1/6] [2/5] [3/4]

    Le problème me semble mal posé.

  3. #3
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Citation Envoyé par j.p.mignot

    Précisez car je ne vois pas du tout comment vous pouvez sélectionner votre soulution plutôt que, par exemple :

    1. [1/2] [3/5] [4/6]
    2. [1/3] [2/6] [4/5]
    3. [1/5] [2/4] [3/6]
    4. [1/4] [2/3] [5/6]
    5. [1/6] [2/5] [3/4]

    Le problème me semble mal posé.
    Et bien si, dans sa 2de précision:

    Je voudrais tous les mettre dans un tableau (donc 2x3), sans qu'il y ai 2 fois ou plus le même caractere sur une ligne,
    Tu cherches en fait une table de toutes les rencontres possibles à 2n joueurs dans une compétition en n tours:

    Tu commences par 1- contre 2 (soit [1/2] dans ta notation), 3 contre 4,...,...,(2n-1) contre 2n. Ecrivons les en lignes:

    (dans ta notation: 1. )
    12
    34
    56
    ...
    (2n-1)(2n)

    Ensuite, tu fais une permutation circulaire en laissant un joueur fixe, par exemple 1: ta permutation est alors sur (2,3,...,2n), dans le sens inverse des aiguilles d'une montre par exemple:

    (dans ta notation: 2. )
    14
    26
    38
    ...
    (2n-5)(2n)
    (2n-3)(2n-1)

    Tu termines tes tours de permutations, et c'est bon!!
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  4. #4
    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 Soyez récursif....
    Votre problème n'a aucune solution pour un ensemble à un seul élément
    Il a une et une seule solution pour un ensemble à deux élements
    Pour un ensemble à n éléments:
    Vous pouvez associez ce premier élément à chacun des n-1 restant et combiner cela avec toutes les solutions pour les n-2 restants.
    Cela dit, dans votre exemple vous "manquez" des solutions:
    Je vous cite:
    En gros, je voudrais arriver au resultat suivant :
    1. [1/2] [3/4] [5/6]
    2. [1/3] [2/6] [4/5]
    3. [1/4] [2/5] [3/6]
    4. [1/5] [2/3] [4/6]
    5. [1/6] [2/4] [3/5]
    Pourquoi ne pas prendre aussi [1/2][3/5][4/6] ???
    Il faudra donc faire une réurrence descendante de pas 2 avec deux conditions terminales correspondant à n=1 ou à n=2 selon la parité du paramètre.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  5. #5
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Citation Envoyé par Zavonen
    Il faudra donc faire une réurrence descendante de pas 2 avec deux conditions terminales correspondant à n=1 ou à n=2 selon la parité du paramètre.
    n impair n'est pas l'objet du problème et il n'y a de toute façon pas à faire de récurrence la-dedans (cf post + haut).
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  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
    Citation Envoyé par Nemerle
    n impair n'est pas l'objet du problème et il n'y a de toute façon pas à faire de récurrence la-dedans (cf post + haut).
    Pour peu que j'ai compris votre problème, ce petit programme Python devrait faire l'affaire.
    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
     
    # -*- coding: cp1252 -*-
     
    import copy
     
    def pprint (L): # seulement pour un bel affichage
        for i in range (0,len(L)):
            print L[i]
        return
     
     
     
     
    def supprime( L, i, j):# enlève les éléments d'indice i et j de la liste L
        R=[]
        for k in range(0,len(L)):
            if ((k!=i)and(k!=j)):
                R.append(L[k])
        return R
     
    def Rencontres (L): # renvoie la liste des possibilités de rencontres
        S=[]
        if len(L)==2:
            return [[L]] # terminaison de la récursivité deux joueurs= une seule rencontre
        else:
            for i in range (1,len(L)):
                R=Rencontres(supprime(L,0,i))#appel récursif
                for j in range (0, len(R)):
                    T=R[j]
                    T.append([L[0],L[i]])
                    S.append(T)
        return S
     
     
     
     
     
    pprint (Rencontres ([1,2,3,4, 5 ,6,7,8]))
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

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