Trouver la meilleur note possible ?

Re,

BsAlv, que penses tu du résultat ci-après ?

12book1.xlsm (41.44 Ko)

Edit : je viens de comparer avec ton dernier fichier. Puisque je supprime les doublons je n'ai pas de

Michael Porter Jr.27
Walker Kessler27

dans mon résultat, mais le temps d'exécution est très réduit, pour 0,04 de différence finale ahaha.

La macro a lancer est ChoixCombi, temps d'execution environ 2 sec.

Wow, c'est impressionnant aussi, mais je suppose que c'est pas la solution finale. Quelque part une toute petite faute ?
12book1-1.xlsm (41.08 Ko)

ps. nos messages se sont croisés

Je ne le sais pas, mais si vous supprimez aussi les lignes à partir du 5eme "Daily" du même "L10", cela accèlera aussi votre macro ?

Les deux macros sont dans le même ordre de grandeur du temps

il y a une petite coquille dans la boucle, ce devrait etre

Sub PostTraitement(stopK1, stopK2)

  For k1 = sKeys.Count - 1 To 0 Step -1
    For k2 = k1 - 1 To 0 Step -1
      For k3 = k2 - 1 To 0 Step -1
        For k4 = k3 - 1 To 0 Step -1

          If Not EvalScore(k1, k2, k3, k4) Then
            Exit For
          End If

        Next k4
      Next k3
    Next k2
  Next k1

End Sub

tout simplement (fin des ki à 0), sinon je skippais le dernier résultat.

Il n'y a pas de faute, simplement je ne parcours pas les doublons sur L10, donc Walker Kessler saute pour laisser sa place à Michael Porter Jr. qui a un meilleur score daily.

Ensuite on parcourt les permutations (sur L10) de valeur + élevée vers moins élevée, et donc on peut s'arrêter dès que les permutations rendent des somme inférieures à 120 (puisqu'on va en décroissant).

Je perds certes des joueurs mais bon cela valorise les meilleurs par catégorie et surtout qu'importe l'échantillon (500, 1000, 100 000 joueurs), on devrait garder un temps d'exécution très bas.

EDIT : oui ta remarque est pertinente, c'était l'objectif des valeurs StopK1 et StopK2 qu'au final je n'utilise pas, mais bon les calculer est assez difficile donc je préfère boucler jusqu'à zero. Le gain me parait négligeable.

@Saboh12617,

je ne sais pas si vous reconnaissez encore votre propre enfant

15book1-1.xlsm (42.85 Ko)

Bonjour BsAlv,

Impressionnant, super !

Tu as réussi à implémenter les optimisations de traitement des combinaisons tout en gardant l’intégralité des données du tableau. Le tri sur les deux colonnes semble très bien fonctionner. Pour le coup je pense que c’est la solution la plus aboutie, en plus le temps de traitement est très correct.

J’ai juste un peu de mal à comprendre les deux variables ptr1 et ptr2. Si je comprends bien prt1 compte le nombre de combinaisons évaluées (Somme des scores L10), et ptr2 le nombre de scores “TotalDiff” evalués (évalués seulement si on a trouvé une meilleure combinaison) ?

Peux-tu m’expliquer comment tu as pu supprimer, dans la boucle (Sub PostTraitement) les case 3 et 4 qui fixent k3 et k4 ? Ils sont superflus ?

En tout cas bravo, super job.

re,

je mens quand je dis que je n'ai rien volé de @Curulis57, les 2 solutions sont très similaires.

avec 500 noms et aleatoire 4 noms = 2.600.000.000 combinaisons, réducer jusqu'à 136 = 13.600.000 combinaisons (0.5%).

La fonction "EvalScore" est appelée 2.176.000 fois (donc on a incrémenté ptr1) en 1.5 seconde !!!. Cela n'est que 16% des 13.600.000

la ligne suivante "If myTbl(k1, 3) * 4 <= BestDaily Then EvalScore = 1: Exit Function 'aucune amélioration à partir d'ici est possible", vous pouvez la désactiver, mais elle donne une réduction minimale (je pense 100K, donc moins que 0.1 sec)

La ligne "If scoreDaily <= BestDaily Then EvalScore = 4: Exit Function" >>> comme les données sont triées descendant pour "daily" (et ascendant pour L10"), dès qu'on a une somme <= la meilleur résultat du moment, c'est inutile de continuer dans cette branche, donc on prend le "k3" suivant >>> réduction considèrable !!!!).

la ligne suivante "If scoreL10 > SMAX Then EvalScore = 0: Exit Function" >>> la somme de "L10" est trop élevée, mais cela ne veut pas dire qu'il n'y a plus une meilleur solution dans cette branche, donc il faut continuer.

Et puis on arrive à la ligne "ptr2 = ptr2 + 1", on ne passe là que 13 fois, donc il y avaient 13 améliorations de "BestDaily" pendant ce 1.5 sec.

Je n'ai pas vérifié ces chiffres chez Curulis57, mais ils aurent le même ordre de grandeur, je suppose.

J'avais essayé à ajouter des trucs malins pour trouver plus vite une solution dans une branche, mais vue la vitesse de vérifier des solutions, la "force brute" gagne de la "force intelligente" !!! (différence de plusieurs secondes)

D’accord merci, c’est ce que j’avais compris du code dans les grandes lignes.

Effectivement difficile de trouver des optimisations qui font vraiment gagner du temps par rapport à l’itération simple et rapide. Je pense que les tests de manière générale sont à proscrire si effectués pour chaque valeur/itération. Il faut plutôt définir algébriquement quelles sont les conditions sur ces valeurs qui permettent de ne pas calculer la combinaison, et les implémenter comme valeurs de début/fin de boucles.

J’avais calculé par exemple que sur un jeu de 4 valeurs consécutives (a,b,c,d), si on veut que la somme de ces valeurs soit supérieure à M il faut que la plus petite valeur (a) soit supérieure ou égale à (M-6)/4.

Il y en a beaucoup d’autres qui permettraient de simplifier pas mal de choses, mais cela demande de se poser et faire attention à tous les chevauchements de conditions etc… C’est assez casse-tête et j’ai abandonné ahah.

Car je suis persuadé qu’au final il n’y a qu’une infime partie des combinaisons à évaluer “intéressantes”. Le plus dur c’est de savoir comment les trouver.

re,

j'ai relu la macro de Curulis57 et il y a une chose de très intelligent, la 2eme ligne (à ajouter dans la macro) >>> ptr1 = 735.000 et ptr2 = 5

Il avait fait cela pou les autres boucles aussi, mais vue les valeurs, ces autres lignes ne servaient à rien

For k3 = k2 + 1 To UBound(myTbl) - 1
If myTbl(k1, 2) + myTbl(k2, 2) + myTbl(k3, 2) >= SMAX Then Exit For '<<<<<<<<<<==========================
For k4 = k3 + 1 To UBound(myTbl)

Salut OLGone,
Salut les cracks,

je n'ai toujours pas compris (pas grave, hein) la logique derrière l'écrêmage de l'échantillon des 500 lignes à 180.
Faudrait m'expliquer plus lentement...

En reprenant cet échantillon restreint de 180 lignes, voici le résultat de ma macro.

NomL10Total
personne 15546,052,85
personne 15546,052,85
Michael Porter Jr.27,033,86
Walker Kessler27,033,71
personne 37820,026,61
TOTAL120147,03
1958775 combinaisons en 0' 1''
Meilleur score atteint à la combinaison n° 42253

A+ pour d'autres aventures.

bonjour Curulis57, on fait de combinaisons de 4 personnes, donc si on prend les 4 meilleurs valeurs "Daily" pour chaque valeur "L10", cela reduit le choix enormément. Le 5eme valeur du même L10 n'entera jamais dans la solution, donc ignorez-le directement au début.

Bonjour à tous,

Je déterre un peu le sujet, mais c'est parce que je suis assez content : j'ai résolu le problème sans VBA.

Il faut absolument avoir Office365 pour lire le fichier car j'ai fait un usage intensif des formules dynamiques. Je pourrai, s'il y a des curieux, expliquer le processus, mais c'est simplement une transcription des différents algos qui ont été proposés (enfin je crois, je ne les ai pas regardés, je suis reparti de 0).

Toutes les combinaisons sont analysées. Temps de calcul = recalcul de la feuille, quasi instantané (env. 1 seconde chez moi).

Le meilleur groupe se trouve dans la feuille résultats, colonnes S,T,U.

La seule hypothèse de calcul est que l'on dispose d'au moins 3 joueurs ayant le même score L10. Ce qui est largement le cas pour un échantillon de 500 joueurs.

Les formules sont probablement optimisables, mais cela fonctionne.

Plutôt fier de moi 😊

Bonne journée.

impressionant, je ne connais pas encore toutes ces fonctions365, donc cela sera pour le weekend (le dimanche avec une café ...)

A première vue, vous n'avez que les combinaisons avec somme L10 = 120, mais celles < 120 sont aussi permis.

Pour le moment, c'est encore du chinois ...

Bonsoir BsAlv,

Moi aussi je débute sur ces nouveaux outils, aux possibilités impressionnantes. Disons que c'était un bon exercice de familiarisation, stv je te passerai en PV le fichier qui m'a permis d'arriver à ce résultat... je n'ai pas pondu la formule de but en blanc ahahah

Pour répondre au sujet de la somme de L10 le fonctionnement est le suivant :

Toutes les combinaisons sur L10 sont générées et évaluées. Ensuite elles sont filtrées sur le score (somme des "k1,k2,k3,k4") maximal obtenu ne dépassant pas la limite indiquée (cellule nommée SumL10Max). En l'occurrence le score maximal est de 120 donc on ne retient pas les autres combinaisons. En relisant l'op, c'est vrai que j'ai fait l'hypothèse que ce score était à maximiser avant le "scoreDaily". Mais à vrai dire on pourrait adapter sans grandes difficultés.

Ensuite, on va retrouver dans le tableau les "ScoreDaily" correspondants à ces combinaisons de "L10". On ne garde que les 4 meilleurs/L10 bien entendu, les autres sont inutiles.

Et puis voilà, on prend le score max.

re,

c'est pour dimanche,

il y a une chose, je vois 3 fois "<=SumL10Max" dans cette formule, donc elle devrait retenir toutes les combinaisons "<=120" je suppose ...

Bonjour,

Oui c'est ça, elles sont toutes évaluées.

Dans la fonction LET en F3, "allComb" désigne la table de toutes les permutations de L10. Et le résultat affiché est "winCombs", dont la valeur est FILTER(combiSc;CHOOSECOLS(combiSc;5)=maxSc), avec combiSc qui est simplement winCombs + 1 colonne Somme pour calculer les scores L10. Et maxSc le max de cette colonne de scores.

Rechercher des sujets similaires à "trouver meilleur note possible"