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 :

Trouver toutes les combinaisons avec contraintes


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Trouver toutes les combinaisons avec contraintes
    Bonjour à tous,

    Mon problème traite de la détermination de toutes les combinaisons p parmi n éléments, avec des contraintes. Je suis conscient qu'il y a déjà eu de nombreuses réponses à ce genre de problèmes, mais je n'ai pas trouvé de discussion qui m'éclaire réellement. Par ailleurs, on trouve généralement des bouts de code dans des langages précis, je serai plutôt intéressé par une explication en français d'un algorithme (d'où la place de la discussion).

    Voici le problème :
    On dispose d'un vecteur de n éléments -qui sont des couples d'indices- de la forme suivante :
    V = [{i1,j1},{i2,j2},...,{ik,jk}]

    Ce que je veux faire, c'est extraire toutes les combinaisons de ces éléments (de dimension 1 à la dimension maximale autorisée par les contraintes) telles que les indices i soient différents.

    Je m'explique sur un exemple de taille réduite :
    Soit V = [{1,1},{1,3},{3,4}]

    Les combinaisons de dimension 1 sont les éléments seuls :
    {1,1}
    {1,3}
    {3,4}

    Les combinaisons de dimension 2 telles que les indices "i" soient différents sont :
    [{1,1},{3,4}]
    [{1,3},{3,4}]

    2 est la dimension maximale autorisée car en dimension 3, on aurait deux éléments avec l'indice "i" identique.

    J'espère que l'énoncé est compréhensible et le problème bien posé. Une solution barbare serait de calculer toutes les combinaisons de p parmi n (avec un algorithme récursif par exemple) en faisant varier p de 1 à n, puis d'enlever les éléments ne répondant pas au problème. Sur l'exemple cela donne :

    {1,1} => ok
    {1,3} => ok
    {3,4} => ok
    {1,1}{1,3} => A retirer
    {1,1}{3,4} => ok
    {1,3}{3,4} => ok
    {1,1}{1,3}{3,4} => A retirer

    Je me demandais si quelqu'un aurait une meilleure idée...

    Merci par avance.

  2. #2
    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
    Ma notation:
    • les vecteurs: [i;..;j]
    • les ensembles: {i,...,j}
    • les paires: (i,j)


    Il faut partitionner ton vecteur suivant l'élément i des couples, c'est-à-dire qu'à partir de ceci:

    V0 = [(1,1);(1,3);(2,3);(3,4);(3,5)]

    Il faut obtenir cela:

    V1 = [[(1,1);(1,3)];[(2,3)];[(3,4);(3,5)]]

    Ensuite il faut adapter l'algo de combinaisons d'un vecteur pour qu'il utilise tous les éléments des sous-vecteurs.

    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    let rec flatten_map_append f l1 l2 =
      match l1 with
      | [] -> l2
      | h::t -> flatten_map_append f t (f h @ l2)
          
    let rec combinate n l =
      if n = 0 then [[]] else
      match l with
      | [] -> []
      | vect::t ->
          let head = combinate (n-1) t in
          let tail = combinate n t in
          flatten_map_append
          (fun h -> List.map (fun x -> h::x) head @ tail)
          vect []

    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # let v1 = [[(1,1);(1,3)];[(2,3)];[(3,4);(3,5)]];;
    # combinate 2 v1;; (* combinaisons de 2 éléments parmi v1 *)
    - : (int * int) list list =
    [[(1, 3); (2, 3)]; [(1, 3); (3, 5)]; [(1, 3); (3, 4)]; [(2, 3); (3, 5)];
     [(2, 3); (3, 4)]; [(1, 1); (2, 3)]; [(1, 1); (3, 5)]; [(1, 1); (3, 4)];
     [(2, 3); (3, 5)]; [(2, 3); (3, 4)]]

    Remarque: il y a des répétitions, par exemple [(2, 3); (3, 5)] et [(2, 3); (3, 4)] sont présents deux fois, mais c'est tout de même un bon début.
    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.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par weezer Voir le message
    je serai plutôt intéressé par une explication en français d'un algorithme (d'où la place de la discussion).
    OCaml est un langage d'origine française, mais tout de même
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. Trouver toutes les combinaisons possibles
    Par Onimaru dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 27/11/2013, 15h35
  2. [XL-2010] Trouver toutes les combinaisons possibles de plusieurs mots
    Par Faneos dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/12/2012, 19h17
  3. Comment trouver toutes les combinaisons possibles ?
    Par [ZiP] dans le forum Débuter
    Réponses: 9
    Dernier message: 26/04/2011, 13h54
  4. Trouver toutes les combinaisons possibles de plusieurs tableaux
    Par divayht dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 23/08/2010, 20h56
  5. trouver toutes les combinaisons
    Par Jordan33 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/01/2010, 17h20

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