Explication sur Siz
Bonjour à tous,
Un membre expert de ce forum m'a donné ce code ci-dessous afin de déchiffrer la combinaison ayant le plus souvent sortie parmi un ensemble de combinaison passée. Je l'ai quelque peu modifié pour l'adapter à mon fichier même si je ne reproduis ici que la version originale. Cependant, je bloque dans ma compréhension sur la fonction "siz" (size ou taille?) et "sol". J'aimerais en connaître l'utilité et obtenir des explications à ce sujet.
Merci
With Worksheets("test")
dl = .Cells(Rows.Count, 1).End(xlUp).Row
tb = .Cells(11, 4).Resize(dl - 10, 20).Value
Dim ctr(70, 2)
For i = 1 To 70
ctr(i, 1) = i
ctr(i, 2) = Application.WorksheetFunction.CountIf(.Cells(11, 4).Resize(dl - 10, 20), i)
Next i
For i = 1 To 69
For j = i To 70
If ctr(i, 2) < ctr(j, 2) Then a = ctr(i, 1): ctr(i, 1) = ctr(j, 1): ctr(j, 1) = a: a = ctr(i, 2): ctr(i, 2) = ctr(j, 2): ctr(j, 2) = a
Next j
Next i
siz = 36
ReDim v(1 To siz)
For i = 1 To siz
v(i) = ctr(i, 1)
Next i
sol = 0
combine v, dl, tb
End With
Bonjour,
Le code avec les commentaires et les variables typées :
Dim ctr(70, 2) As Integer
Dim V() As Integer
Dim Tb
Dim Dl As Long
Dim I As Integer
Dim J As Integer
Dim A As Integer
Dim Siz As Integer
Dim Sol As Long
With Worksheets("test")
'recherche la dernière cellule non vide en partant du bas de la colonne A
Dl = .Cells(Rows.Count, 1).End(xlUp).Row
'affecte le Range à un tableau en le redimensionnant à partir de D11 à W-->Dl
Tb = .Cells(11, 4).Resize(Dl - 10, 20).Value
'affecte à un tableau à deux dimensions, la valeur de I dans la première et dans la seconde, le nombre de fois
'que I a été trouvé, CountIf() = NB.SI(), seules les valeurs de 1 à 70 sont cherchées
For I = 1 To 70
ctr(I, 1) = I
ctr(I, 2) = Application.WorksheetFunction.CountIf(.Cells(11, 4).Resize(Dl - 10, 20), I)
Next I
'tri le tableau du plus grand au plus petit
For I = 1 To 69: For J = I To 70
If ctr(I, 2) < ctr(J, 2) Then A = ctr(I, 1): ctr(I, 1) = ctr(J, 1): ctr(J, 1) = A: A = ctr(I, 2): ctr(I, 2) = ctr(J, 2): ctr(J, 2) = A
Next J, I
'défini la taille maximale d'un tableau à une dimension pour n'avoir que les 36 premiers résultats
Siz = 36
'et dimensionne le tableau
ReDim V(1 To Siz)
For I = 1 To Siz: V(I) = ctr(I, 1): Next I
Sol = 0
combine V, Dl, Tb
End With
Bonjour,
ce code calcule le nombre d'occurences des nombres (1 à 70) dans un tableau et trie ensuite le tableau en ordre décroissant sur le nombre d'occurences.
siz
détermine parmi ces 70 nombres, ceux qu'il faut garder pour la suite du traitement (génération de toutes les combinaisons possibles sur base du tableau réduit à siz éléments). -> siz! combinaisons au lieu de 70! combinaisons à générer.
Grâce au comptage et au tri, les nombres qui ont la meilleure probabilité de contribuer à un bon résultat se trouvent parmi les premiers du tableau. Ceci permet une convergence rapide vers une solution qui ne doit pas être très éloignée de l'optimum aboslu, l'optimum absolu étant celui résultant de l'examen des 70! combinaisons (10^73 ans si on compte 100 microsecondes par combinaison).
sol
est un compteur utilisé dans la procédure combine, qui permet l'affichage du meilleur résultat dès que celui-ci égale ou dépasse le meilleur résultat précédent.