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 :

Distributions de k éléments dans n avec contraintes


Sujet :

Algorithmes et structures de données

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut Distributions de k éléments dans n avec contraintes
    Bonjour,

    Pour résumer:

    je cherche à distribuer k éléments parmi p possibles, chaque élément distribué est noté (Z1, Z2 ... jusqu'à Z(k) ).
    Je sais déterminer toutes mes combinaisons pour distribuer mes éléments dans ma matrice, mais le problème c'est que j'ai une contrainte supplémentaire : les éléments distribués doivent être "à l'équilibre", cad autant de Z1,Z2... par colonne pour chaque colonne.
    (Pour illustrer simplement ce dont je parle voir le fichier Excel en pièce jointe.)

    J'avais prévu de distribuer mes Zi de la manière suivante (exemple 3 éléments)
    Z1 Z2 Z3
    Z2 Z3 Z1
    Z3 Z1 Z2
    Z1 Z2 Z3
    etc.. en avançant dans le vecteur. Bien évidemment ce n'est pas équilibré

    Avez-vous une idée?
    Merci d'avance
    Cladoo

    PS : ça ne change pas grand chose, mais je travaille sous Windev 14 et je pilote Excel via OLE.
    Fichiers attachés Fichiers attachés

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 23
    Points : 29
    Points
    29
    Par défaut
    Si tu peu donnée plus de précision sur la notion d’équilibre « une définition plus rigoureuse », la taille de la matrice ? Y a-t-il une relation avec les Zi, tu parles de contraintes mais elles ne sont pas définies.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Bonjour,

    l'utilisateur choisit :
    k (nombre de Zk à placer dans la matrice)
    p (nombre de produits ou de colonnes)
    k < p (toujours vrai)

    Le but est de faire apparaître toutes les combinaisons de colonnes (ou de produits si on préfère) possibles avec les choix de l'utilisateur, il y en a C(k,p). Exemple C(3,5)=10 ou encore C(2,6)=15 http://fr.wikipedia.org/wiki/Combina...%A9matiques%29

    Une fois chaque combinaison possible déterminée (ce point est déjà géré) je dois y distribuer mes Zk (si k = 3 alors on doit distribuer Z1, Z2, Z3) de sorte que j'ai autant de Z1 que de Z2, Z3 dans chaque colonne mais également autant de Z1 dans la colonne A que B que C, idem avec Z2 et Z3 etc...
    C'est que j'appelle "être à l'équilibre". Aucune distribution de Zk ne doit favoriser telle ou telle colonne en terme de distribution.

    Une solution serait de distribuer toutes les permutations possibles dans chaque bloc de combinaisons possibles, exemple :
    k=3 et p=5 j'ai donc C(3,5)=10 lignes pour réaliser toutes mes combinaisons possibles. Pour être certain d'être à l'équilibre, je peux distribuer dans ces 10 lignes successivement toutes les permutations possibles de 3 éléments (k=3 et 3!=6) soit 6 permutations, on arrive donc à 10*6=60 lignes (ce qui est égal à A(3,6) http://fr.wikipedia.org/wiki/Arrangement )

    Or et c'est là où je suis très très embêté : là où le second algorithme me demande 60 lignes pour "équilibrer ma matrice" je peux en utiliser seulement 10 dans mon cas, en faisant varier la séquence distribuée de Zk de sorte à équilibrer mes colonnes


    Donc il est possible dans certains cas de réduire considérablement le nombre de ligne (et c'est un point primordial dans mon cas) et obtenir le même équilibre. En effet je n'ai aucune contrainte quant à la séquence de Zk utilisée, je ne suis absolument pas obligé à faire apparaître toutes les permutations.

    Qu'en penses-tu?

  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
    Cela ressemble à un problème de Sudoku, donc solvable avec des techniques de backtracking ou alors de coloration de graphe. Par contre, ca risque de prendre du temps pour des grandes de valeurs k,p
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Cela ressemble à un problème de Sudoku, donc solvable avec des techniques de backtracking ou alors de coloration de graphe. Par contre, ca risque de prendre du temps pour des grandes de valeurs k,p
    EN fait j'ai borné mes k et p :
    k : [2,9]
    p : [3,10]
    k < p

    Je ne connais pas le backtracking , c'est quoi le principe?

  6. #6
    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 cladoo Voir le message
    EN fait j'ai borné mes k et p :
    k : [2,9]
    p : [3,10]
    k < p

    Je ne connais pas le backtracking , c'est quoi le principe?
    C'est un mot compliqué pour dire qu'on revient en arrière si on se trompe.

    Dans ton cas C(3,5), il faut placer 30 jetons (10xZ1, 10xZ2, 10xZ3) sur les cases bleus en respectant les contraintes (1 Zi par ligne et 2 Zj par colonne).

    On commence par mettre un jeton au hasard sur la 1ere case, on choisit un jeton possible (respectant les contraintes) pour la 2eme case, etc. jusqu'a ce que le remplissage soit complet (gagné !) ou alors qu'on ne puisse plus placer de jeton (perdu !). Dans ce dernier cas, on retire le dernier jeton placé et on le remplace par un autre possible.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    C'est un mot compliqué pour dire qu'on revient en arrière si on se trompe.

    Dans ton cas C(3,5), il faut placer 30 jetons (10xZ1, 10xZ2, 10xZ3) sur les cases bleus en respectant les contraintes (1 Zi par ligne et 2 Zj par colonne).

    On commence par mettre un jeton au hasard sur la 1ere case, on choisit un jeton possible (respectant les contraintes) pour la 2eme case, etc. jusqu'a ce que le remplissage soit complet (gagné !) ou alors qu'on ne puisse plus placer de jeton (perdu !). Dans ce dernier cas, on retire le dernier jeton placé et on le remplace par un autre possible.

    Ah d'accord, ben j'ai utilisé ce principe dans une autre partie de mon programme sans le savoir, mais je n'avais pas envisagé une faille dans mon raisonnement et certains cas n'étaient pas solvables, d'où des boucles infinies au moment de ce fameux 'backtracking'

    En fait mon problème est encore plus complexe que prévu, en effet dans certains cas (exemple C(3,6)=20) on ne peut pas diviser le nombre de possibles par k (20/3) donc il n'existe pas de solution, et dans ces cas là les arrangements A(k,p) et leur explosion du nombre de lignes sont la seule solution.

    Le truc de faire varier la séquence des Zk pour obtenir l'équilibre ne fonctionne que si C(k,p) est multiple de p (autant dire peu de cas, donc C(3,5)=10 fait partie de ces exceptions).
    Je vais donc les lister, déterminer la séquence des Zi optimale et la stocker afin de l'appeler si l'utilisateur demande ces cas particuliers, dans les autres cas j'utiliserai les arrangement. Quelle galère...

  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 cladoo Voir le message
    En fait mon problème est encore plus complexe que prévu, en effet dans certains cas (exemple C(3,6)=20) on ne peut pas diviser le nombre de possibles par k (20/3) donc il n'existe pas de solution, et dans ces cas là les arrangements A(k,p) et leur explosion du nombre de lignes sont la seule solution.

    Le truc de faire varier la séquence des Zk pour obtenir l'équilibre ne fonctionne que si C(k,p) est multiple de p (autant dire peu de cas, donc C(3,5)=10 fait partie de ces exceptions).
    C'est pas grave. La contrainte sur les colonnes peut être approximative ou meme dynamique du genre min<Zi<max ou alors variance(Z1,Z2,Z3,...)<seuil.

    L'important c'est d'avoir une contrainte qui permette de savoir si on peut continuer a avancer dans la résolution, ou alors s'il faut revenir en arrière.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Donc tu penses que c'est jouable?

  10. #10
    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 cladoo Voir le message
    Donc tu penses que c'est jouable?
    et bien ton cas le plus grand doit être C(10,5)=252 lignes, ce qui n'est pas si énorme. En plus, si tu ne cherches pas une solution exacte, ca doit limiter les essais possibles.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Bon ben y'a plus qu'à
    Si j'arrive à mes fins, je posterai histoire de suivre le problème.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 23
    Points : 29
    Points
    29
    Par défaut
    Très bonne explication merci, juste une idée comme ça :
    Est il possible de fractionner le problème en deux, en premier lieu trouver la position d’insertion des Zi, dans l’exemple il s’agira au départ de former une matrice de tel sorte que sur les lignes on aura :
    Somme des Zi = C avec i = 1 à k
    et sur les colonnes :
    Somme des Zj = C ! avec j = 1 à C(c,k)
    Où Z [0,1]

    Excuse moi pour le formalisme qui crève les yeux je ne sais pas encor comment on écrit des équations sur le forum.
    Cela nous donne un programme linéaire, et il est intéressant de voir le résultat car l’existence de plusieurs solutions « dans la plus part des cas » est évidente.
    En deuxième lieu, il s’agira de résoudre un problème d’affectation, les algorithmes traitant ce sujet sont nombreux.

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Alors voici la solution que j'ai retenue (et à mettre en place d'un point de vue algorithmique):

    Suivant les bornes données, j'ai 36 cas

    - pour les combinaisons où l'équilibre est réalisable pour un nombre l multiple de C(k,p) et de p, je distribue les Zi de manière circulaire et je stocke la structure dans une BDD pour la rappeler le cas échéant (24 cas)

    - pour les autres cas où l'équilibre n'est pas possible sur l= C(k,p) j'utilise les arrangements, donc je distribue mes permutations de k éléments parmi mes combinaisons de C(k,p) (12 cas)

    Du coup j'ai plusieurs cas où je gagne un nombre conséquent de lignes (point 1) et les autres cas où mes lignes explosent. Je vais tout de même intégrer une option permettant de demander l'équilibre ou non.

Discussions similaires

  1. Select avec "date d'un premier élément" dans clause Where
    Par adrien357 dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/11/2008, 15h27
  2. Réponses: 4
    Dernier message: 17/03/2008, 16h41
  3. pb Insertion d'éléments dans une table avec mySql++
    Par donkeyquote dans le forum C++
    Réponses: 1
    Dernier message: 24/02/2008, 00h39
  4. Réponses: 12
    Dernier message: 12/03/2007, 16h58
  5. [Debutant]Suppression dans des tables avec contraintes
    Par Roming22 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/10/2004, 17h23

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