classement (excel, maths?)

jeanjacques

XLDnaute Junior
Bonjour,

Je bute sur un classement de colonnes difficile, je joins un fichier avec le départ et le souhait après le code.

Merci de votre aide

A+
 

Pièces jointes

  • cla.xlsx
    9.6 KB · Affichages: 109

ODVJ

XLDnaute Impliqué
Re : classement (excel, maths?)

Re,

tu veux dire que maintenant c'est 30 lignes, 5 colonnes contenant des valeurs de 1 à 70?

met une instance que tu as à gérer en ligne.

cordialement

PS : à quoi ça te sert ? Tu vas en faire quoi?
si tu en disais plus, on pourrait peut-être t'expliquer comment t'en passer.....
 

jeanjacques

XLDnaute Junior
Re : classement (excel, maths?)

Bonjour,

C'est une base de Keno ou je repère les nombres dans 5 colonnes....mais ça ne change rien au problème posé. Voici un exemple du Kéno (30 derniers tirages) avec mon classement "à la menotte"....je ne sais pas si Excel peut faire mieux que mon crayon?


Bon we
 

Pièces jointes

  • Classeur1.xlsx
    11 KB · Affichages: 80
  • Classeur1.xlsx
    11 KB · Affichages: 83

ODVJ

XLDnaute Impliqué
Re : classement (excel, maths?)

Bonsoir,

est-ce que c'est mieux que ton crayon?
xld_tri_colonne_difficile.jpg

cordialement
 

Pièces jointes

  • xld_tri_colonne_difficile.jpg
    xld_tri_colonne_difficile.jpg
    61.3 KB · Affichages: 66
  • xld_résultats_kéno_comparaison.xlsx
    20.1 KB · Affichages: 52
Dernière édition:

JBARBE

XLDnaute Barbatruc
Re : classement (excel, maths?)

Bonjour à tous,

Excusez-moi d'entrer dans ce post, mais le dernier fichier dont le classement c'est effectué à la main et envoyé par jeanjacques, comporte quelques problèmes ( voir décompte colonne A) :

Chiffre 7 >>>> Nombre dans le tableau initial 7 - Nombre dans le Classement 6

Chiffre 15 >>>> Nombre dans le tableau initial 11 - Nombre dans le Classement 10

Chiffre 18 >>>> Nombre dans le tableau initial 10 - Nombre dans le Classement 11

Chiffre 22 >>>> Nombre dans le tableau initial 9 - Nombre dans le Classement 10

Chiffre 28 >>>> Nombre dans le tableau initial 7 - Nombre dans le Classement 8

Chiffre 35 >>>> Nombre dans le tableau initial 2 - Nombre dans le Classement 1

Certes, la performances de ce tri manuel est quand même remarquable, mais demeure quand même très difficile sans l'aide de l'informatique !

Bonne journée à tous !
 

Pièces jointes

  • tri_aleatoire.xlsx
    19.3 KB · Affichages: 76

ODVJ

XLDnaute Impliqué
Re : classement (excel, maths?)

Bonsoir,

Toujours par formule, le même modèle que précédemment, élargi à 70 colonnes par passe au lieu de 10 et une profondeur de 15 au lieu de 6, vu la faible densité des valeurs.
La profondeur correspond au nombre de valeurs différentes d'une colonne.
Il est possible d'aller à 20 ou 30 en profondeur. Ça ne dépend que du temps que l'on consacre à l'ajout des niveaux.

cordialement
 

job75

XLDnaute Barbatruc
Re : classement (excel, maths?)

Bonjour jeanjacques, ODVJI, JBARBE, le forum,

Le classement manuel de jeanjacques donne un minimum de 52 valeurs différentes.

Avec cet algorithme j'ai obtenu un minimum de 44 (formule en M3) :

Code:
Sub Minimum()
Dim NbAlea&, NbTirage&, mini&, h&, P As Range, d As Object, dc&
Dim tirage&, c As Range, j%, n&, i&, k%
NbAlea = [N6] 'nombre d'aleas
NbTirage = [N7] 'nombre de tirages
mini = 1000000
Application.ScreenUpdating = False
With [A1].CurrentRegion.Resize(, 5)
  .Copy [G1]
  h = .Rows.Count
End With
Set P = [G1].Resize(h, 5)
'---liste des valeurs sans doublon classée---
Set d = CreateObject("Scripting.Dictionary")
For Each c In P
  d(c.Value) = d(c.Value) + 1
Next
dc = d.Count
Range("Q2:S" & Rows.Count) = "" 'RAZ
[Q2].Resize(dc) = Application.Transpose(d.keys)
[R2].Resize(dc) = Application.Transpose(d.items)
[Q2].Resize(dc, 2).Sort [R2], xlDescending, Header:=xlNo 'classement
[S2].Resize(NbAlea) = "=RAND()" 'ALEA() sur les premiers
'---détarmination du minimum---
For tirage = 1 To NbTirage
  Application.Calculation = xlCalculationManual
  [Q2].Resize(NbAlea, 3).Sort [S2], Header:=xlNo 'classement aléatoire
  For Each c In [Q2].Resize(dc)
    '---comptage préalable---
    For j = 1 To 5
      n = 0
      For i = 1 To h
        If P(i, j).Interior.ColorIndex = xlNone Then
          For k = 1 To 5
            If P(i, k) = c Then
              n = n + 1
              If n = c(1, 2) Then GoTo 1
              Exit For
            End If
          Next k
        End If
    Next i, j
    '---permutations et repérages avec la couleur jaune---
1   If n = c(1, 2) Then
      For i = 1 To h
        If P(i, j).Interior.ColorIndex = xlNone Then
          For k = 1 To 5
            If P(i, k) = c Then
              P(i, k) = P(i, j)
              P(i, j) = c
              P(i, j).Interior.ColorIndex = 6
              Exit For
            End If
          Next k
        End If
      Next i
    End If
  Next c
  P.Interior.ColorIndex = xlNone 'RAZ du repérage
  Application.Calculation = xlCalculationAutomatic 'recalcul
  If Round([M3]) < mini Then mini = Round([M3]): P.Copy [U1] 'mémorisation
Next tirage
[U1].Resize(h, 5).Copy P 'restitution
[U1].Resize(h, 5) = "" 'RAZ
End Sub
Fichier joint, faites de nombreux essais pour améliorer le minimum.

A+
 

Pièces jointes

  • Minimum(1).xlsm
    27.3 KB · Affichages: 26

JBARBE

XLDnaute Barbatruc
Re : classement (excel, maths?)

Bonjour jeanjacques, ODVJI, job75, le forum,

J'ai procédé à des essais du fichier de job75 et je trouve 48 minimum !

Par contre, lors des essais suivant la macro ne s'arrêtait pas ( 30 mn) et j'ai dû sortir de cette macro ( voir la photo) la cellule M3 était vide !

bonne journée !
 

Pièces jointes

  • Plantage_Macro.jpg
    Plantage_Macro.jpg
    29 KB · Affichages: 19
  • Minimum(1)-2.xlsm
    30.1 KB · Affichages: 18

job75

XLDnaute Barbatruc
Re : classement (excel, maths?)

Re,

Avec les tableaux VBA t test memo l'exécution est nettement plus rapide :

Code:
Sub Minimum()
Dim NbAlea&, NbTirage&, mini&, h&, P As Range, t, test() As Boolean
Dim d As Object, dc&, tirage&, c As Range, j%, n&, i&, k%, memo
NbAlea = [N6] 'nombre d'aleas
NbTirage = [N7] 'nombre de tirages
mini = 1000000
Application.ScreenUpdating = False
With [A1].CurrentRegion.Resize(, 5)
  .Copy [G1]
  h = .Rows.Count
End With
Set P = [G1].Resize(h, 5)
t = P 'tableau VBA
ReDim test(1 To h, 1 To 5) 'tableau VBA
'---liste des valeurs sans doublon classée---
Set d = CreateObject("Scripting.Dictionary")
For Each c In P
  d(c.Value) = d(c.Value) + 1
Next
dc = d.Count
Range("Q2:S" & Rows.Count) = "" 'RAZ
[Q2].Resize(dc) = Application.Transpose(d.keys)
[R2].Resize(dc) = Application.Transpose(d.items)
[Q2].Resize(dc, 2).Sort [R2], xlDescending, Header:=xlNo 'classement
[S2].Resize(NbAlea) = "=RAND()" 'ALEA() sur les premiers
'---détermination du minimum---
For tirage = 1 To NbTirage
  [Q2].Resize(NbAlea, 3).Sort [S2], Header:=xlNo 'classement aléatoire
  For Each c In [Q2].Resize(dc)
    '---comptage préalable---
    For j = 1 To 5
      n = 0
      For i = 1 To h
        If Not test(i, j) Then
          For k = 1 To 5
            If t(i, k) = c Then
              n = n + 1
              If n = c(1, 2) Then GoTo 1
              Exit For
            End If
          Next k
        End If
    Next i, j
    '---permutations dans t, repérages dans test---
1   If n = c(1, 2) Then
      For i = 1 To h
        If Not t(i, j) Then
          For k = 1 To 5
            If t(i, k) = c Then
              t(i, k) = t(i, j)
              t(i, j) = c
              test(i, j) = True
              Exit For
            End If
          Next k
        End If
      Next i
    End If
  Next c
  ReDim test(1 To h, 1 To 5) 'RAZ du repérage
  P = t
  If Round([M3]) < mini Then mini = Round([M3]): memo = P 'mémorisation
Next tirage
P = memo 'restitution
End Sub
On peut maintenant tester facilement avec 1000 tirages (22 secondes chez moi).

J'ai pu obtenir le minimum de 43 en une dizaine d'essais.

Fichier joint.
 

Pièces jointes

  • Minimum tableaux VBA(1).xlsm
    27.3 KB · Affichages: 22
Dernière édition:

ODVJ

XLDnaute Impliqué
Re : classement (excel, maths?)

Bonsoir à tous,

Sur la base du joli travail de job75, on peut appliquer une heuristique de montée qui, en une itération fournit une solution à 41 (mais s'y arrête).

Cette heuristique de montée s'appuie sur une structure de voisinage d'une solution qui est de type transposition de colonnes pour chaque ligne, soit 30 (lignes) x 10 (transpositions) = 300 voisins.
Certains de ces voisins sont améliorants, d'autres pas.

Si les voisins améliorants sont nombreux, on peut tirer au sort celui qui deviendra la nouvelle meilleure solution.

Je ne sais pas si ça va intéresser du monde, mais le fichier joint contient les 300 voisins d'une solution considérée comme la meilleure (zone verte en AR1:AV30).
Si on y copie la solution à 42 (qui se trouve en H1:L30), on peut lire en BU37 le n° de la ligne où on trouve une solution meilleure ou équivalente.
Dans l'exemple choisi, il y a 2 voisins améliorants :
ligne 303 : transposition (3,4) de la solution ligne 9
ligne 963, transposition (2,3) de la solution ligne 29

Naturellement, ça se met dans une macro et on itère tant que ça améliore.
Mais là, c'est plus compréhensible avec le détail du voisinage d'une solution.

Cordialement
 

Pièces jointes

  • xld_tri_colonne_job75_Minimum tableaux VBA(2).zip
    714 KB · Affichages: 17

jeanjacques

XLDnaute Junior
Re : classement (excel, maths?)

Bonsoir à tous,

Un grand merci tout d'abord.

J'ai passé du temps à comparer avec 20 lignes de données, voici le fichier résultat ....je gagne devant Job pour un nombre!!!



ps: je n'ai pas pu tester le dernier fichier d' ODVJ car la colonne insérée en M pose souci.

Bonne soirée et merci.
 

Pièces jointes

  • resultat.xlsx
    10.9 KB · Affichages: 21
  • resultat.xlsx
    10.9 KB · Affichages: 24

Discussions similaires

Réponses
4
Affichages
381

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 836
Messages
2 092 652
Membres
105 479
dernier inscrit
chaussadas.renaud