Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Permutations des nombres sur EXCEL VBA

aurelio.ewane

XLDnaute Occasionnel
Bonjour a tous Voici mon Problème
Jai huit éléments de Base
01 02 03 04 05 06 07 08
avec ces 08 éléments de Base j'arrive a créer 56 sous Groupes de 03 éléments de Base chacun comme suit selon la formule factorielle 8 divisé par (8-3) factorielle
01 02 03
01 02 04
01 02 05
01 02 06
01 02 07
01 02 08
01 03 04
01 03 05
01 03 06
01 03 07
01 03 08
01 04 05
01 04 06
01 04 07
01 04 08
01 05 06
01 05 07
01 05 08
01 06 07
01 06 08
01 07 08
02 03 04
02 03 05
02 03 06
02 03 07
02 03 08
02 04 05
02 04 06
02 04 07
02 04 08
02 05 06
02 05 07
02 05 08
02 06 07
02 06 08
02 07 08
03 04 05
03 04 06
03 04 07
03 04 08
03 05 06
03 05 07
03 05 08
03 06 07
03 06 08
03 07 08
04 05 06
04 05 07
04 05 08
04 06 07
04 06 08
04 07 08
05 06 07
05 06 08
05 07 08
06 07 08
je remarque qu'il ya des doublons
je précise que je lai fait a la main et je remarque que 56 diviser par 4=14
et j'arrive a les réduire en 14 sous groupes comportant 04 éléments de Base chacun
01 02 03 04
01 02 05 06
01 02 07 08
01 03 05 07
01 03 06 08
01 04 05 08
01 04 06 07
02 03 05 08
02 03 06 07
02 04 05 07
02 04 06 08
03 04 05 06
03 04 07 08
05 06 07 08

Donc mon problème est donc le suivant en suivant cette logique
jai 15 éléments de Base
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
j'aimerais former des sous Groupes de 06 éléments de Base (c'est a dire l'arrangement comme plus haut) par calcul j'obtiens 50 063 860 Sous Groupes de 06 éléments de Base chacun

Comment donc réduire ces 50 063 860 Sous Groupes d'éléments qui comporte chacun 06 éléments de Base en 10 0003 Sous Groupes comportant 15 éléments de Base

je voudrais le faire sur Excel mais je manque de méthode je demande de l'aide ici

Je joins mon fichier désolé pour la longueur du texte
 

Pièces jointes

  • Arrangements Esaurelien.xlsx
    12.7 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
re
Bonjour
je crois que tu n'a pas bien compris la différence entre combi et permut dans la précédente discussion

exemple une combi
01 02 03 04
les permut de cette combi
01 03 02 04
03 01 04 02
02 04 01 03
02 03 04 01
etc..etc...

et la a partir du moment ou c'est des permut c'est forcement des doublons

alors avec toute la volonté du monde quand tu nous dis
j'ai 15 elements je veux des groupes sans doublons de 6(ce qui n'est pas très compliqué au final )
mais que tu nous dis je veux
Comment donc réduire ces 50 063 860 Sous Groupes d'éléments qui comporte chacun 06 éléments de Base en 10 0003 Sous Groupes comportant 15 éléments de Base
là on te suis plus pour la simple et bonne raison que tu tente additionner finalement 2.x chaine d'elements
et là ma fois forcement tu aura des doublons
d'une part par ce que c'est des permut
d'autre part par ce que tu pourrait bien ajouter en chaine 2 et plus plusieurs fois la même chaine dans un groupe de 15



tu veux des groupes de 6 fait une roulette de 6 , tu veux des groupes de 15 fait une roulette de 15
et c'est tout

je ne peux pas te dire mieux
on ne peut pas faire deux combi une de 8 et une de 6 par exemple les joindres
et recommencer une 2d et un 3eme etc... en espérant ne pas avoir de doublons
là t'a tout faux

j’espère t'avoir expliqué cela plus clairement aujourd'hui

après si tu pige pas ça , je crois que l'on peut plus rien pour toi
 

aurelio.ewane

XLDnaute Occasionnel
Hello
je vais te joindre un fichier pour comprendre
 

bsalv

XLDnaute Occasionnel
bonjour le fil
Code:
Public aA
Const i1 = 15
Const i2 = 6

Sub combinaties()
     Dim aOut

     ReDim aOut(1 To WorksheetFunction.Combin(i1, i2), 1 To 1)
     aA = Evaluate("transpose(row(A1:A" & i2 & "))")     'start combination
     Do
          ptr = ptr + 1
          aOut(ptr, 1) = Join(aA)
          Volgende
     Loop While ptr < UBound(aOut)
     Range("A1").Resize(UBound(aOut)).Value = aOut
End Sub

Sub Volgende()
     aA(i2) = aA(i2) + 1
     b = False
     For i = i2 To 2 Step -1
          If aA(i) <= i1 - i2 + i Then Exit For
          aA(i - 1) = aA(i - 1) + 1
          b = True
     Next
     If b = True Then
          For i0 = i + 1 To i2
               aA(i0) = aA(i0 - 1) + 1
          Next
     End If
End Sub
 

Pièces jointes

  • Combinaties15_6.xlsb
    60.9 KB · Affichages: 6

bsalv

XLDnaute Occasionnel
il faut pas exagérer
3.600.000 permutations de 15/6.
Les 1.048K premiers en une minute, alors 3.600K en 4 minutes ... (20K permutations par seconde)
 

Pièces jointes

  • Combinaties15_6.xlsb
    65.4 KB · Affichages: 11

patricktoulon

XLDnaute Barbatruc
re
ma fois chez moi ta nouvelle fonction a mis 17 minutes pour me faire 1048576 (sur 2013 en tout cas)
sachant que c'est le max de lignes possibles et on est loin de la totalité des permutes possibles
sachant que au mieux dans les meilleurs conditions( en fonction des données et de la mémoire dispos sur le Pc) une variable tableau peux contenir le même nombre de ligne

il est donc pour moi absurde de vouloir faire ça avec excel
 

bsalv

XLDnaute Occasionnel
cela est vrai, c'est stupide de créer tous les permutations, surtout avec un 2013.
Peut-être si on commence avec de blocs de 10.000 lignes au lieu de +1.048.000, on gagne un peut de temps ( minutes/secondes ???)
 

patricktoulon

XLDnaute Barbatruc
re
bonjour
que ce soit avec 2013 ou un autre c'est pareil
pour info par exemple sur 2016 c'est plus long que 2013 pour 10 000 permuts
et oui plus il y a de données et de calculs plus les versions récentes rames comme pas possible
ce sont des exercices qui ont déjà été fait ici dans le forum et le constat est flagrant et unanime
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Information: une combinaison peut être retrouvée d'après un numéro d'ordre dans l'ensemble des combinaisons possibles. Ça pourrait dispenser d'avoir à toutes les porter quelque part.
 

Dranreb

XLDnaute Barbatruc
Le code de ma fonction perso :
Code:
Option Explicit
Function Combinaison(ByVal IdCmb As Double, _
   ByVal NbParmi As Integer, ByVal NbPris As Integer) As Integer()
   CalcCombin Combinaison, IdCmb, NbParmi, NbPris
   End Function
Sub CalcCombin(TRésu() As Integer, ByVal IdCmb As Double, _
   ByVal NbParmi As Integer, ByVal NbPris As Integer)
   Dim P As Integer, Terme As Integer
   ReDim TRésu(1 To NbPris)
   For P = 1 To NbPris
      Terme = Terme + PremierTerme(IdCmb, NbParmi - Terme, NbPris - P)
      TRésu(P) = Terme
      Next P
   End Sub
Private Function PremierTerme(ByRef IdCmb As Double, _
   ByVal NbParmi As Integer, ByVal NbPris As Integer) As Integer
   Dim NbCmb As Double, NbCmbTotEssai As Double, NbCmbTotal As Double
   NbCmb = WorksheetFunction.Combin(NbParmi - 1, NbPris)
   NbCmbTotEssai = NbCmb
   For PremierTerme = 1 To NbParmi - NbPris
      If NbCmbTotEssai >= IdCmb Then Exit For
      NbCmbTotal = NbCmbTotEssai
      NbCmb = NbCmb - NbCmb * NbPris / (NbParmi - PremierTerme)
      NbCmbTotEssai = NbCmbTotEssai + NbCmb
      Next
   IdCmb = IdCmb - NbCmbTotal
   End Function
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…