Excel et les arrangements en probabilté

  • Initiateur de la discussion Initiateur de la discussion brossard56
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

brossard56

XLDnaute Nouveau
Bonjour à tous,

Je cherche la possibilité de réaliser avec Excel tous les arrangements possibles de 10 parmi 10. Je sais que le nombre d'arrangements est impressionnant (10 ! soit 3 628 800 si mes cours de proba ne sont pas trop loin).
Est-il donc possible de les lister tous avec Excel ?

Merci par avance

Brossard56
 
Re : Excel et les arrangements en probabilté

Comme brossard56 a satisfait ma curiosité en MP (merci d'ailleurs à toi)

Une petite contribution au fil s'imposait

Après quelque recherches sur le net
J'ai trouvé ce script en lisant des articles sur l'algorithme de Trotter-Johnson.

J'espère que certain d'entre vous sauront l'adapter en pure VBA pour remplir des cellules plutôt que de générer un fichier texte.

En espérant que cette tâche vous intéressera , bonne nuit à tous.

sources sur cet algo:
lecture 1
Ce lien n'existe plus
 
Dernière édition:
Re : Excel et les arrangements en probabilté

Bonjour à tous
Comme d'autres, je me demande quel peut être l'intérêt d'écrire explicitement tous les arrangements de dix éléments distincts. C'est toutefois un exercice amusant.
J'ai repris les procédures de job75. Elles sont rapides. En fait, c'est le report des résultats qui est extrêmement lent. Le code en lui-même (i.e. sans tenir compte du temps d'écriture dans la feuille) est de 37 secondes sur ma machine, avec l'une ou l'autre version du code.
On peut réduire le temps d'exécution à 17 secondes avec le code suivant :
Code:
[COLOR="DarkSlateGray"][B]Private Sub CommandButton1_Click()
Dim tp!, tb$, i&, j&, k&, l&, m&, n&, o&, p&, q&, r&, col&, lig&, T, tablo$(59999, 0)
tp = Timer
T = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
Range("A2:BI65536").ClearContents
For i = 0 To 0
  tb = T(i)
  For j = 0 To 9
    If j <> i Then
      tb = tb & T(j)
      For k = 0 To 9
        If k <> i And k <> j Then
          tb = tb & T(k)
          For l = 0 To 9
            If l <> i And l <> j And l <> k Then
              tb = tb & T(l)
              For m = 0 To 9
                If m <> i And m <> j And m <> k And m <> l Then
                  tb = tb & T(m)
                  For n = 0 To 9
                    If n <> i And n <> j And n <> k And n <> l And n <> m Then
                      tb = tb & T(n)
                      For o = 0 To 9
                        If o <> i And o <> j And o <> k And o <> l And o <> m And o <> n Then
                          tb = tb & T(o)
                          For p = 0 To 9
                            If p <> i And p <> j And p <> k And p <> l And p <> m And p <> n And p <> o Then
                              tb = tb & T(p)
                              For q = 0 To 9
                                If q <> i And q <> j And q <> k And q <> l And q <> m And q <> n And q <> o And q <> p Then
                                  tb = tb & T(q)
                                  For r = 0 To 9
                                    If r <> i And r <> j And r <> k And r <> l And r <> m And r <> n And r <> o And r <> p And r <> q Then
                                      tablo(lig, 0) = tb & T(r)
                                      If lig = 59999 Then
                                        Cells(1, col + 1).Select 'pour suivre la progression
                                        Range("A2:A60001").Offset(0, col).Value = tablo
                                        Erase tablo
                                        lig = 0
                                        col = col + 1
                                      Else
                                        lig = lig + 1
                                      End If
                                    End If
                                  Next r
                                  tb = Left$(tb, 8)
                                End If
                              Next q
                              tb = Left$(tb, 7)
                            End If
                          Next p
                          tb = Left$(tb, 6)
                        End If
                      Next o
                      tb = Left$(tb, 5)
                    End If
                  Next n
                  tb = Left$(tb, 4)
                End If
              Next m
              tb = Left$(tb, 3)
            End If
          Next l
          tb = Left$(tb, 2)
        End If
      Next k
      tb = T(i)
    End If
  Next j
Next i
Range("A2").Offset(0, col).Resize(lig).Value = tablo 'la dernière colonne
MsgBox "Durée du traitement : " & Round(Timer - tp, 2) & " s"
End Sub[/B][/COLOR]
Mais le résultat final n'est guère plus satisfaisant : gagner 20 secondes sur plusieurs milliers n'est pas très utile...
C'est juste pour le plaisir...

La seule voie d'amélioration possible est probablement celle suggérée par Staple1600, savoir l'écriture des résultats dans un fichier-texte.​
ROGER2327
#2942
 
Dernière édition:
Re : Excel et les arrangements en probabilté

Bonsoir ROGER2327


Connaissiez-vous cet algorithme ? (voir mon message précédent car nos posts se sont croisés)


PS: je ne suis pas sur qu'il fasse la même chose que votre code ou celui de job75.
 
Re : Excel et les arrangements en probabilté

Bonjour à tous,

Un peu d'eau au moulin,

Curieux, j'ai testé la solution de Job15 et je peux dire qu’elle tourne super bien, sur ma bécane. L'affichage des 61 colonnes n’a demandé que 42 s, ce qui est très acceptable pour 4 millions ou presque d'arrangements. Variables en chiffres ou en lettres, c’est équivalent. Chaque arrangement est affiché dans une seule cellule.

J'ai fait de même avec l’amélioration de Roger2327 qui devait aller plus vite, mais non, je n’ai pas attendu la fin….

Enfin j’ai testé l’affichage sur fichier texte de John Coleman que Staple1600 a dégoté sur le net et là c’est vraiment très rapide, l’affichage ne demande que 19s. Cependant, elle plante si l’on change les lettres par des chiffres.
 
Re : Excel et les arrangements en probabilté

Re...
Bonjour à tous,

Un peu d'eau au moulin,

Curieux, j'ai testé la solution de Job15 et je peux dire qu’elle tourne super bien, sur ma bécane. L'affichage des 61 colonnes n’a demandé que 42 s, ce qui est très acceptable pour 4 millions ou presque d'arrangements. Variables en chiffres ou en lettres, c’est équivalent. Chaque arrangement est affiché dans une seule cellule.

J'ai fait de même avec l’amélioration de Roger2327 qui devait aller plus vite, mais non, je n’ai pas attendu la fin….

Enfin j’ai testé l’affichage sur fichier texte de John Coleman que Staple1600 a dégoté sur le net et là c’est vraiment très rapide, l’affichage ne demande que 19s. Cependant, elle plante si l’on change les lettres par des chiffres.
Je suis étonné par la comparaison entre la version de job75 et la mienne. J'ai soigneusement testé les deux sans jamais m'approcher de vos résultats. Les deux versions sont très comparables en temps d'exécution, à une poignée de seconde prés.
Quelle est l'explication de cette situation ?

Pour ce qui concerne la procédure adaptée par Staple1600, elle est effectivement beaucoup plus rapide, et c'est certainement une meilleure solution.​
ROGER2327
#2943
 
Re : Excel et les arrangements en probabilté

Bonsoir Roger 2327,

J'ai refait les tests des deux méthodes et voilà les symptômes :

1- L'affichage des 61 colonnes de résultats de la méthode Job15 est régulier dans les temps nécessaires à afficher chaque colonne. Même temps 42 s. Bonne santé générale 🙂

2- Pour ta méthode qui paraît très proche dans la syntaxe, la première colonne s'affiche très vite puis la seconde un peu plus lentement et ainsi de suite jusqu’à avoir un temps d'affichage très long au delà des quatre premières colonnes. S'essoufle rapidement, santé fragile 😱

Je n’ai aucune idée des causes !!!
 
Re : Excel et les arrangements en probabilté

Bonjour le fil, le forum,

Je n'ai pas pu me connecter hier et ce matin, mon FAI était en maintenance...

Quelques commentaires sur les derniers posts :

- Comme le signale Roger, ce n'est pas la macro qui prend du temps mais l'affichage des résultats dans la feuille de calcul ; lig As Integer ne fait strictement rien gagner.

- L'ordi de Bernard est une F1 comparé au mien : l'affichage est de 42 s au lieu de 3h30. Là j'aimerais bien qu'on m'explique pourquoi, je ne connais pas grand'chose à ce qui fait la performance d'un ordi.

- Pour Staple, je ne comprends pas le bug d'Excel 2000 sur :

Range("A2:A60001").Offset(, col) = Application.Transpose(tablo)

En effet cette méthode et cette syntaxe sont vraiment basiques. Essaie peut-être :

Range("A2:A60001").Offset(0, col).Value = Application.Transpose(tablo)

C'est souvent instructif de comprendre pourquoi un code ne fonctionne pas sur une autre version d'Excel.

A+
 
Re : Excel et les arrangements en probabilté

Re...
Bonjour le fil, le forum,

Je n'ai pas pu me connecter hier et ce matin, mon FAI était en maintenance...

Quelques commentaires sur les derniers posts :

- Comme le signale Roger, ce n'est pas la macro qui prend du temps mais l'affichage des résultats dans la feuille de calcul ; lig As Integer ne fait strictement rien gagner.

- L'ordi de Bernard est une F1 comparé au mien : l'affichage est de 42 s au lieu de 3h30. Là j'aimerais bien qu'on m'explique pourquoi, je ne connais pas grand'chose à ce qui fait la performance d'un ordi.

- Pour Staple, je ne comprends pas le bug d'Excel 2000 sur :

Range("A2:A60001").Offset(, col) = Application.Transpose(tablo)

En effet cette méthode et cette syntaxe sont vraiment basiques. Essaie peut-être :

Range("A2:A60001").Offset(0, col).Value = Application.Transpose(tablo)

C'est souvent instructif de comprendre pourquoi un code ne fonctionne pas sur une autre version d'Excel.

A+
Pas grand chose à ajouter. Pour se convaincre de la rapidité des procédures hors écriture dans la feuille, il suffit de mettre en commentaires les deux lignes de transfert du tableau dans la feuille.
Le gros mystère est l'exceptionnelle différence de vitesse constatée sur l'ordinateur de notre ami. Si quelqu'un d'autre peut faire l'expérience, j'en serai ravi. (Chez moi, il faut attendre environ 5h pour admirer le résultat, avec l'une ou l'autre de nos procédures.)

À propos du problème soulevé par Staple1600 :
Je me souviens qu'avec Excel97 la fonction Transpose() n'opérait que sur des tableaux de taille limitée. Je ne me souviens plus de la limite exacte, mais elle était très inférieure à 60000. Peut-être cette limitation existe-t-elle aussi avec Excel2000 ?​
ROGER2327
#2952
 
Dernière édition:
Re : Excel et les arrangements en probabilté

bonjour a tous

Pour inaugurer mon tout neuf Excel 2007 j'ai testé les codes de Job75 🙂 et Roger 🙂 et les resultats, chez moi , sont respectivement de

64 secondes
36,72 secondes

Le processeur est un Intel 8400 3Ghz 1Go de memoire vive
 
Re : Excel et les arrangements en probabilté

Bonsoir Roger, pierrejean,

Une autre solution : ne rien afficher dans la feuille mais stocker le tableau (30000 x 121) en le nommant (menu Insertion-Nom-Définir sur Excel 2003).

Le temps de calcul chez moi est alors de 62 s.

Pour obtenir un élément du tableau, utiliser bien sûr la fonction INDEX.

Fichier (3) joint.

Edit : le fichier obtenu (avec le nom) fait 51 Mo.

A+
 

Pièces jointes

Dernière édition:
Re : Excel et les arrangements en probabilté

Bonsoir le fil,

Le chose m'intéresse mais vos solutions font tousser mon pc...(ventilo à mort au bout de 30 secondes) manque de mémoire, sans doute ou mémoire déficiente, ce que je pense plutôt,

Je note, néanmoins, les codes pour des jours meilleurs.

Bonne soirée.

Jean-Pierre
 
Re : Excel et les arrangements en probabilté

Re...
Bravo job5 !
Je confirme : 54 secondes chez moi.
Avec ma version modifiée : 40 secondes.
Il y a vraiment un problème avec le transfert d'un tableau dans une feuille.
Un dernier souci : le comportement de ces procédures chez CBernardT. Pas moyen de reproduire le phénomène...​
ROGER2327
#2955
 
Re : Excel et les arrangements en probabilté

Re,

À propos du problème soulevé par Staple1600 :
Je me souviens qu'avec Excel97 la fonction Transpose() n'opérait que sur des tableaux de taille limitée. Je ne me souviens plus de la limite exacte, mais elle était très inférieure à 60000. Peut-être cette limitation existe-t-elle aussi avec Excel2000 ?

Effectivement, sur ce FAQ :

https://www.excel-downloads.com/threads/vba-les-tableaux-le-ki-ki-de-zon.93353/

au § 3) j'ai trouvé :

=> Jusqu'à Excel 2002, Application.Transpose est limité à 5700 et quelques éléments. (On y reviendra un peu plus bas)

A+
 
Re : Excel et les arrangements en probabilté

Re, et ce sera fini pour ce soir,

Il y a vraiment un problème avec le transfert d'un tableau dans une feuille.
Un dernier souci : le comportement de ces procédures chez CBernardT. Pas moyen de reproduire le phénomène...

Bernard et pierrejean utilisent tous deux Excel 2007.

Vu le nombre considérable de cellules sur cette version (16384 x 1048576), je suppose que Microsoft a mis en place d'autres méthodes d'affichage pour tirer vraiment profit de l'augmentation.

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
12
Affichages
507
Retour