probleme de combinaisons non regulieres

probleme de combinaisons non regulieres - VB/VBA/VBS - Programmation

Marsh Posté le 04-02-2009 à 13:06:19    

bonjour  
je souhaite créer une table access (comprenant 4 champs ) de toutes les combinaisons de 4 valeurs parmi une liste de 20 à 25 nombres situés dans une table indépendante
je bute sur le passage au nombre suivant ( les nb sont classés en croissant ) les nombres n'étant pas forcement consécutifs et j'ai le problème d'incrementation et aussi s'il n'y a que 18 nombres comment le tester et arrêter le processus a 18
 
au final je dois obtenir une table access contenant :
table  "RÉSULTATS"
clé num  et 4 champs   sol1 sol2 sol3 sol4  
1                              12    44   51   86
2                              12    44   51   90
3                              12    44   86   90
4                              12    44   90  104
 
les 20 nombres 12 44 51 86 90 104 ......sont les variables notées dans une table "SITES"  
 
merci du coup de main

Reply

Marsh Posté le 04-02-2009 à 13:06:19   

Reply

Marsh Posté le 04-02-2009 à 15:12:43    

Bonjour
 
Dans ton exemple tu as 6 nombres et pas 4.
 
Comment doivent se faire tes combinaisons ? Je ne comprends pas trop l'exemple. Comment sont "tirées" les 4 valeurs ?
 
Cordialement


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 04-02-2009 à 15:24:21    

je recherche à constituer toutes les possibilites de constituer les groupes possibles ( combinaisons pas arrangement ) de 4 nombres parmi les 20 ou 25  listés dans une table " sites"
dans l'exemple j'ai utilise 6 nombres au lieu des 20 ( classés croissant )
les groupes de 4 vaeurs sont une partie de toutes les combinaisons possibles contituées tout simplement par l'adjonction du nombre suivant trouve dans la table "site" ( n'étant pas de step 1 ,c'est le probleme , il doit choisir le nb suivant )
est ce clair ?
merci  de ton aide

Reply

Marsh Posté le 04-02-2009 à 20:01:43    

Ca fait quand meme pas loin de 300 mille possibilités hein...
 
Je regarde ca.


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 05-02-2009 à 10:17:45    

oui cela fait pas mal de possibilites  ,c'est pour cela qu'il faut que les resultats apparaissent dans une table access " sites" de 4 champs
est il possible de parametrer le nombre de base ( 20 , ou 22 , ou 18 , ou 29 ) ainsi que le nombre dans les groupes ( groupe de 2 ou 3 ou 4 ou 8)
j'avais pensé un formulaire qui me demande :  
nombre de valeurs ?    
nombre dans les groupes ?  
nom de table a creer ?
puis attribuer une variable v01  v02........v20
puis attribuer  un nom de champ ( si 3    tec1 tec2 tec3 )
et ensuite composer en incrementant les variables  
excuse moi  je debute
merci de te penche sur mon cas
 
 

Reply

Marsh Posté le 05-02-2009 à 11:16:44    

Oui c'est possible, pour le moment, je zieute comment faire toutes les possibilités...
 
Pour le parametrage ca suivra.
 
Parcontre 8 possibilités, à mon avis sous access c'est impossible. Ca fait 40 milliards de possibilité hein...


Message édité par SuppotDeSaTante le 05-02-2009 à 11:22:47

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 05-02-2009 à 12:05:02    

tu as raison    lorsque je parle de possibilité de groupe de  2  3 4....8  il peut aussi s'appliquer à un groupe de 20 ..25 mais aussi de 15 ..10
bien sur il serait aberrant de penser générer 40 milliards..
merci de ton aide

Reply

Marsh Posté le 05-02-2009 à 12:54:59    

Re
 
Suis dsl j'ai pas enormément de temps. On doit pouvoir s'en sortir avec une fonction recursive.
Maintenant, par manque de temps, je pense que tu devrais te faire 8 fonctions, une par nombre de possibilités.
Car ton nombre de possibilité est le nombre de boucles imbriquées.
 
Pour deux possibilité
 
For x = 1 to 25
     For i = 1 to 25
 
Pour 4 possibilités tu aurais 4 boucles For etc. D'ou la recursivité qui doit etre envisageable.
 
Je zieuterais si j'ai 5mn. Au moins pour les 1-2-3-4 possibilités.


Message édité par SuppotDeSaTante le 05-02-2009 à 12:55:18

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 05-02-2009 à 14:16:15    

super  
par contre n'oublies pas que les 20 ou 25 nombres ne sont pas consécutifs ils sont classés par ordre croissant seulement
merci

Reply

Marsh Posté le 05-02-2009 à 16:53:45    

Bon voila pour deux possibilités et pour trois possibilités, c'est a extrapoler jusqu'a 8 si j'ai bien compris. Pas eu le temps d'approfondir sur la recursivité.
 

Code :
  1. Function E_Cent2() 'pour 2 possibilités
  2.    
  3.     'A toi de définir le nom de la table source
  4.     NomTable = "Sites"
  5.     'A toi de définir le nom de la table resultat
  6.     NomTableRtat = "Rtat"
  7.    
  8.     'A toi de définir les noms des champs à mettre a jour
  9.     NomChamp1 = "sol1"
  10.     NomChamp2 = "sol2"
  11.        
  12.     Set RecSetTEnr = CurrentDb.OpenRecordset(NomTable)
  13.     Set RecSetTEnr2 = CurrentDb.OpenRecordset(NomTable)
  14.     Set RecSetTEnrRtat = CurrentDb.OpenRecordset(NomTableRtat)
  15.    
  16.     Cpte = RecSetTEnr.RecordCount
  17.     RecSetTEnr.MoveFirst
  18.     RecSetTEnr2.MoveFirst
  19.    
  20.     For x = 1 To Cpte
  21.        
  22.         V = RecSetTEnr(0) 'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  23.             Rtat = Rtat & V
  24.         For i = 1 To Cpte
  25.             V2 = RecSetTEnr2(0) 'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  26.             If V2 <> V Then
  27.                 RecSetTEnrRtat.AddNew
  28.                 RecSetTEnrRtat(NomChamp1) = V
  29.                 RecSetTEnrRtat(NomChamp2) = V2
  30.                 RecSetTEnrRtat.Update
  31.             End If
  32.             RecSetTEnr2.MoveNext
  33.         Next i
  34.     RecSetTEnr2.MoveFirst
  35.     RecSetTEnr.MoveNext
  36.     Next x
  37. End Function
  38. Function E_Cent3() 'pour 3 possibilités
  39.    
  40.     'A toi de définir le nom de la table source
  41.     NomTable = "Sites"
  42.     'A toi de définir le nom de la table resultat
  43.     NomTableRtat = "Rtat"
  44.    
  45.     'A toi de définir les noms des champs à mettre a jour
  46.     NomChamp1 = "sol1"
  47.     NomChamp2 = "sol2"
  48.     NomChamp3 = "sol3"
  49.        
  50.     Set RecSetTEnr = CurrentDb.OpenRecordset(NomTable)
  51.     Set RecSetTEnr2 = CurrentDb.OpenRecordset(NomTable)
  52.     Set RecSetTEnr3 = CurrentDb.OpenRecordset(NomTable)
  53.    
  54.     Set RecSetTEnrRtat = CurrentDb.OpenRecordset(NomTableRtat)
  55.    
  56.     Cpte = RecSetTEnr.RecordCount
  57.     RecSetTEnr.MoveFirst
  58.     RecSetTEnr2.MoveFirst
  59.     RecSetTEnr3.MoveFirst
  60.    
  61.     For x = 1 To Cpte
  62.        
  63.         V = RecSetTEnr(0) 'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  64.             Rtat = Rtat & V
  65.         For i = 1 To Cpte
  66.             V2 = RecSetTEnr2(0) 'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  67.             If V2 <> V Then
  68.                 For a = 1 To Cpte
  69.                     V3 = RecSetTEnr3(0) 'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  70.                     If V<>V2 And V2 <> V3 And V3 <> V Then
  71.                         RecSetTEnrRtat.AddNew
  72.                         RecSetTEnrRtat(NomChamp1) = V
  73.                         RecSetTEnrRtat(NomChamp2) = V2
  74.                         RecSetTEnrRtat(NomChamp3) = V3
  75.                         RecSetTEnrRtat.Update
  76.                     End If
  77.                     RecSetTEnr3.MoveNext
  78.                 Next a
  79.             End If
  80.             RecSetTEnr2.MoveNext
  81.             RecSetTEnr3.MoveFirst
  82.         Next i
  83.     RecSetTEnr2.MoveFirst
  84.     RecSetTEnr.MoveNext
  85.     Next x
  86. End Function


 
Cordialement

Message cité 1 fois
Message édité par SuppotDeSaTante le 05-02-2009 à 17:02:48

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 05-02-2009 à 16:53:45   

Reply

Marsh Posté le 05-02-2009 à 17:12:55    

Pour quatre :

Code :
  1. Function E_Cent4() 'pour 4 possibilités
  2.    
  3.     'A toi de définir le nom de la table source
  4.     NomTable = "Sites"
  5.     'A toi de définir le nom de la table resultat
  6.     NomTableRtat = "Rtat"
  7.    
  8.     'A toi de définir les noms des champs à mettre a jour
  9.     NomChamp1 = "sol1"
  10.     NomChamp2 = "sol2"
  11.     NomChamp3 = "sol3"
  12.     NomChamp4 = "sol4"
  13.        
  14.     Set RecSetTEnr = CurrentDb.OpenRecordset(NomTable)
  15.     Set RecSetTEnr2 = CurrentDb.OpenRecordset(NomTable)
  16.     Set RecSetTEnr3 = CurrentDb.OpenRecordset(NomTable)
  17.     Set RecSetTEnr4 = CurrentDb.OpenRecordset(NomTable)
  18.     Set RecSetTEnrRtat = CurrentDb.OpenRecordset(NomTableRtat)
  19.    
  20.     Cpte = RecSetTEnr.RecordCount
  21.     RecSetTEnr.MoveFirst
  22.     RecSetTEnr2.MoveFirst
  23.     RecSetTEnr3.MoveFirst
  24.     RecSetTEnr4.MoveFirst
  25.    
  26.     For x = 1 To Cpte
  27.         V = RecSetTEnr(0)'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  28.             Rtat = Rtat & V
  29.         For i = 1 To Cpte
  30.             V2 = RecSetTEnr2(0)'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  31.             If V2 <> V Then
  32.                 For a = 1 To Cpte
  33.                     V3 = RecSetTEnr3(0)'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  34.                     If V2 <> V And V2 <> V3 And V3 <> V Then
  35.                             For b = 1 To Cpte
  36.                                 V4 = RecSetTEnr4(0)'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  37.                                 If V2 <> V And V2 <> V3 And V3 <> V And V4 <> V3 And V4 <> V And V4 <> V2 Then
  38.                                     RecSetTEnrRtat.AddNew
  39.                                     RecSetTEnrRtat(NomChamp1) = V
  40.                                     RecSetTEnrRtat(NomChamp2) = V2
  41.                                     RecSetTEnrRtat(NomChamp3) = V3
  42.                                     RecSetTEnrRtat(NomChamp4) = V4
  43.                                     RecSetTEnrRtat.Update
  44.                                 End If
  45.                                 RecSetTEnr4.MoveNext
  46.                             Next b
  47.                     End If
  48.                     RecSetTEnr3.MoveNext
  49.                     RecSetTEnr4.MoveFirst
  50.                 Next a
  51.             End If
  52.             RecSetTEnr2.MoveNext
  53.             RecSetTEnr3.MoveFirst
  54.         Next i
  55.         RecSetTEnr2.MoveFirst
  56.         RecSetTEnr.MoveNext
  57.     Next x
  58. End Function


 
Avec 20 nombres ca me sort bien 116280 enregistrements. (20x19x18x17)
 
Je te laisse faire jusqu'a 8 ;) Attention à la pile quand meme... Car à 5 avec 25 nombres on est a plus de 6 millions d'enregistrements....
 
Si tu as un souci n'hesite pas.


Message édité par SuppotDeSaTante le 05-02-2009 à 17:17:30

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 06-02-2009 à 07:48:50    

SuppotDeSaTante a écrit :

Bon voila pour deux possibilités et pour trois possibilités, c'est a extrapoler jusqu'a 8 si j'ai bien compris. Pas eu le temps d'approfondir sur la recursivité.
 

Code :
  1. Function E_Cent2() 'pour 2 possibilités
  2.    
  3.     'A toi de définir le nom de la table source
  4.     NomTable = "Sites"
  5.     'A toi de définir le nom de la table resultat
  6.     NomTableRtat = "Rtat"
  7.    
  8.     'A toi de définir les noms des champs à mettre a jour
  9.     NomChamp1 = "sol1"
  10.     NomChamp2 = "sol2"
  11.        
  12.     Set RecSetTEnr = CurrentDb.OpenRecordset(NomTable)
  13.     Set RecSetTEnr2 = CurrentDb.OpenRecordset(NomTable)
  14.     Set RecSetTEnrRtat = CurrentDb.OpenRecordset(NomTableRtat)
  15.    
  16.     Cpte = RecSetTEnr.RecordCount
  17.     RecSetTEnr.MoveFirst
  18.     RecSetTEnr2.MoveFirst
  19.    
  20.     For x = 1 To Cpte
  21.        
  22.         V = RecSetTEnr(0) 'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  23.             Rtat = Rtat & V
  24.         For i = 1 To Cpte
  25.             V2 = RecSetTEnr2(0) 'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  26.             If V2 <> V Then
  27.                 RecSetTEnrRtat.AddNew
  28.                 RecSetTEnrRtat(NomChamp1) = V
  29.                 RecSetTEnrRtat(NomChamp2) = V2
  30.                 RecSetTEnrRtat.Update
  31.             End If
  32.             RecSetTEnr2.MoveNext
  33.         Next i
  34.     RecSetTEnr2.MoveFirst
  35.     RecSetTEnr.MoveNext
  36.     Next x
  37. End Function
  38. Function E_Cent3() 'pour 3 possibilités
  39.    
  40.     'A toi de définir le nom de la table source
  41.     NomTable = "Sites"
  42.     'A toi de définir le nom de la table resultat
  43.     NomTableRtat = "Rtat"
  44.    
  45.     'A toi de définir les noms des champs à mettre a jour
  46.     NomChamp1 = "sol1"
  47.     NomChamp2 = "sol2"
  48.     NomChamp3 = "sol3"
  49.        
  50.     Set RecSetTEnr = CurrentDb.OpenRecordset(NomTable)
  51.     Set RecSetTEnr2 = CurrentDb.OpenRecordset(NomTable)
  52.     Set RecSetTEnr3 = CurrentDb.OpenRecordset(NomTable)
  53.    
  54.     Set RecSetTEnrRtat = CurrentDb.OpenRecordset(NomTableRtat)
  55.    
  56.     Cpte = RecSetTEnr.RecordCount
  57.     RecSetTEnr.MoveFirst
  58.     RecSetTEnr2.MoveFirst
  59.     RecSetTEnr3.MoveFirst
  60.    
  61.     For x = 1 To Cpte
  62.        
  63.         V = RecSetTEnr(0) 'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  64.             Rtat = Rtat & V
  65.         For i = 1 To Cpte
  66.             V2 = RecSetTEnr2(0) 'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  67.             If V2 <> V Then
  68.                 For a = 1 To Cpte
  69.                     V3 = RecSetTEnr3(0) 'Ici 0 veut dire la premiere colonne de la table source, si tes nombres sont dans la 2nde colonne il faut mettre 1 etc.
  70.                     If V<>V2 And V2 <> V3 And V3 <> V Then
  71.                         RecSetTEnrRtat.AddNew
  72.                         RecSetTEnrRtat(NomChamp1) = V
  73.                         RecSetTEnrRtat(NomChamp2) = V2
  74.                         RecSetTEnrRtat(NomChamp3) = V3
  75.                         RecSetTEnrRtat.Update
  76.                     End If
  77.                     RecSetTEnr3.MoveNext
  78.                 Next a
  79.             End If
  80.             RecSetTEnr2.MoveNext
  81.             RecSetTEnr3.MoveFirst
  82.         Next i
  83.     RecSetTEnr2.MoveFirst
  84.     RecSetTEnr.MoveNext
  85.     Next x
  86. End Function


 
Cordialement


 
 
 
 
 
merci beaucoup tu es super
as tu pense que ce doit être des combinaisons et pas des permutations c'est pour ca que tu trouves beaucoup de solutions
il faut    par ex le groupe  5 12  84 seulement      mais pas 12 5 84   ou   84 12 5   ou  84  5  12 les nombres sont classés en croissant dans la table de départ
c'est surement pour ça la quantité de résultat  
comment corriger ?  
a te lire
 

Reply

Marsh Posté le 07-02-2009 à 14:02:25    

bonjour
merci encore car en plus le programme est super rapide ,tu es champion
le seul problème comme je t'ai dit il s'agit de combinaison,on ne va pas sur le site 2 fois identique et les nb sont classes en ordre croissant i l faudrait mettre un test supplémentaire de combiner avec le nb suivant
merci de m'aider

Reply

Marsh Posté le 07-02-2009 à 15:41:52    

Tkt j'ai pas laissé tomber... ;)
 
Je regarde juste la meilleure methode. Soit 'filtrer en amont' seulement les groupes qui nous interressent. Soit a posteriori supprimer toutes les combinaisons deja existentes.
Le plus facile est la seconde. Que je suis en train de tester.
 
Question : Avec 25 nombres, et 4 possibilités, tu as combien de combinaisons possibles ?


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 07-02-2009 à 17:10:26    

avec 25 nb pris par 4 on a la combinaison=  (25*24*23*22)/(1*2*3*4) soit 12650 possibilites
le mieux est lorsqu'on va chercher le nombre suivant il doit chercher apres le nombre en cours et ne pas repartir au debut de la liste tant que la liste n'est pas finie
ton programme marche super mais il cree toutes les possibilites avec les doublons  
courage et encore merci
 
 

Reply

Marsh Posté le 19-02-2009 à 11:05:19    

bonjour
comment pourrait on lever ces doublons ?
ce qui m'inquiète dans ton calcul , c'est le nombre de solutions gigantesques  et la place en mémoire nécessaire !
je suis sur qu'il  a un autre moyen plus court .
il est plus facile d'en parler, je sais
 
 
merci de toute solution

Reply

Marsh Posté le 02-03-2009 à 10:56:10    

SuppotDeSaTante a écrit :

Tkt j'ai pas laissé tomber... ;)
 
Je regarde juste la meilleure methode. Soit 'filtrer en amont' seulement les groupes qui nous interressent. Soit a posteriori supprimer toutes les combinaisons deja existentes.
Le plus facile est la seconde. Que je suis en train de tester.
 
Question : Avec 25 nombres, et 4 possibilités, tu as combien de combinaisons possibles ?


 
 
bonjour
je me doute que tu es surbooke ,  j'ai besoin d'un petit conseil sur le test du programme  
quand on va chercher  V V2 V3 comment l'écrire pour que la variable prise en boucle soit supérieure de 1  ( comme  V2=v+1 , v3=v2+1 ....) au lieu de retourner au début de la liste
merci si tu peux me dépanner ....je plante grave
Eglantine

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed