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

Recherche de communs et/ou non communs

erics83

XLDnaute Impliqué
Bonjour,

Beaucoup inspiré par le code de JB :
Fonction communs à 3 listes,


Je cherche à faire des combinaisons avec 8 noms :

3 positions :
1 = commun
0 = je ne prends pas les valeurs
-1 = la lettre n'est pas dans la liste.

(pour être plus clair, j'ai mis un fichier test en PJ)

Pour calculer toutes les combinaisons possibles j'ai donc fait :
Code:
For I1 = -1 To 1
For I2 = -1 To 1
For I3 = -1 To 1
For I4 = -1 To 1
For I5 = -1 To 1
For I6 = -1 To 1
For I7 = -1 To 1
For I8 = -1 To 1

'Calculs


Next I8
Next I7
Next I6
Next I5
Next I4
Next I3
Next I2
Next I1
Je prends un exemple de combinaison :
I1=1
I2=0
I3=-1
I4=1
I5=0
I6=0
I7=-1
I8=1

veut dire : je calcule les lettres communes entre I1, I4, I7, I8, mais ces lettres ne doivent pas être dans I3 et I7 et je ne tiens pas compte de I2, I5,I6
I1=l'ensemble des lettres de Nom1
I2=l'ensemble des lettres de Nom2, etc.....

J'aimerai pour chaque date (j'en ai mis juste 2 pour l'exemple) faire cette opération....

Une petite aide ?
Merci,
 

Pièces jointes

  • Fichiertest1.xlsm
    12.2 KB · Affichages: 40

Paf

XLDnaute Barbatruc
Bonjour,

Je n'ai compris que : à partir d'une combinaison de -1,0,1 on veut obtenir quelque chose.

Comment se présente le résultat souhaité?
Comment est choisi la combinaison ?
Que signifie je calcule les lettres communes entre I1, I4, I7, I8 ? sachant que I1,I2 sont les indices de boucle pour déterminer les combinaisons

....

quelques explications plus concrètes semblent nécessaires...

A+
 

erics83

XLDnaute Impliqué
Bonjour Paf,

Effectivement, des compléments d'infos sont nécessaires....
Il s'agit en fait de pronostiques (foot, quand tu nous tiens...)
8 noms de pronostiqueurs qui émettent chacuns 8 pronostiques.
Je souhaite faire toutes les combinaisons :
je prends les 8 pronostiqueurs (I....) dont les pronostiques sont pris en compte ou non :
0 : non pris en compte
1 : pris en compte
-1 : compare avec les autres pris en communs (=1) et ne retient que les pronostiques "non communs" avec les autres (=1)

Donc avec les "For i...." je calcule toutes les combinaisons de comparaisons des pronostiqueurs, et ensuite je compare avec le résultat final (ça, c'est "facile"), et donc je compilerai pour identifier quelles sont les "meilleures combinaisons"...

En vous remerciant pour votre aide,
 

ODVJ

XLDnaute Impliqué
Bonsoir à tous,

Quand tu dis "je calcule les lettres communes entre I1, I4, I7, I8", tu devrais plutôt dire "je calcule les lettres communes entre I1, I4, I8", non? I7 est préfixé par un -1.

Quand tu dis "Je cherche à faire des combinaisons avec 8 noms :" tu veux plutôt dire "je veux établir le calcul des lettres communes pour chaque combinaison"?

Tu as 6561 combinaisons. Tu veux 6561 résultats?
Tu cherches la combinaison qui s'approche le plus d'un résultat?
Si oui, quel est ce résultat? et comment apprécies-tu la proximité du résultat d'un calcul avec le "résultat"?

Maintenant, le calcul proprement dit :
Regarde ces tableaux qui correspondent à ce que j'ai compris. Qu'attends-tu comme résultat? "d" pour la première date et rien pour la 2ème date?

Cordialement
 

erics83

XLDnaute Impliqué
Merci ODV,

tu devrais plutôt dire "je calcule les lettres communes entre I1, I4, I8", non? I7 est préfixé par un -1.
oui, c'est ça, j'ai fait une erreur dans l'écriture du post...

Tu veux 6561 résultats?
Oui, c'est le résultat de toutes les combinaisons possibles avec les 8 pronostiqueurs (0, je prends pas le pronostique, 1 je prends, -1 je prends les lettres retenues dans les communs (=1) et si elles ne sont pas dans le pronostiqueur qui est topé -1, je les garde exemple :
I1=1, I2=1, I3 =-1 et I4, I5, I6, I7, I8 à 0, le résultat retenu sera "j"


Si oui, quel est ce résultat? et comment apprécies-tu la proximité du résultat d'un calcul avec le "résultat"?
dans l'exemple cité si "j" est le résutat final,
donc pour le 1/1/2014, la combinaison (I1=1,I2=1,I3=-1,I4=0, I5=0, I6=0, I7=0, I8=0)=(I1=1,I2=1,I3=-1,I4=0, I5=0, I6=0, I7=0, I8=0) +1
et, fait du "hasard" , le 2/1/2014, cette même combinaison (I1=1,I2=1,I3=-1,I4=0, I5=0, I6=0, I7=0, I8=0) si "g" et /ou "e" est le résultat final, alors cette combinaison s'incrémente aussi d'un point.
Pour le code, j'étais parti sur un listage des combinaisons en feuil2, et ensuite le code rechercherait en fonction des cas (0,1,-1) les lettre "retenues"
Code:
Sub essai()
Dim I1 As Integer
Dim I2 As Integer
Dim I3 As Integer
Dim I4 As Integer
Dim I5 As Integer
Dim I6 As Integer
Dim I7 As Integer
Dim I8 As Integer
Dim a As Integer

For I1 = -1 To 1
For I2 = -1 To 1
For I3 = -1 To 1
For I4 = -1 To 1
For I5 = -1 To 1
For I6 = -1 To 1
For I7 = -1 To 1
For I8 = -1 To 1
a = a + 1
'Calculs
Sheets("Feuil2").Cells(a, 1) = I1
Sheets("Feuil2").Cells(a, 2) = I2
Sheets("Feuil2").Cells(a, 3) = I3
Sheets("Feuil2").Cells(a, 4) = I4
Sheets("Feuil2").Cells(a, 5) = I5
Sheets("Feuil2").Cells(a, 6) = I6
Sheets("Feuil2").Cells(a, 7) = I7
Sheets("Feuil2").Cells(a, 8) = I8


Next I8
Next I7
Next I6
Next I5
Next I4
Next I3
Next I2
Next I1




End Sub
En espérant avoir été le plus précis possible,

En vous remerciant pour votre aide,
 
Dernière édition:

ODVJ

XLDnaute Impliqué
Re,

Perso, je suis parti sur une méthode formule sur 8 fois 6561 lignes.
C'est pas finaud mais pas la peine de se ruer sur du code si ça n'est pas ce que tu souhaites.

Pour le résultat "j" de la 1ère date, je trouve 248 combinaisons possibles.
8 avec 5 uns, 40 avec 4, 80 avec 3 uns et même chose avec 2 uns. 40 combinaisosns à 1 un pour finir.

Comment fais-tu pour choisir? le maximum de 1 dans la combinaison? le minimum de lettres en commun?

Exemples avec 5 uns :
VB:
I1   I2   I3    I4    I5   I6   I7   I8
1    1    -1    -1    -1    1    1    1
1    1    -1    -1     0    1    1    1
1    1    -1     0    -1    1    1    1
1    1    -1     0     0    1    1    1
1    1     0    -1    -1    1    1    1
1    1     0    -1     0    1    1    1
1    1     0     0    -1    1    1    1
1    1     0     0     0    1    1    1
avec 4 uns :
VB:
I1  I2   I3   I4   I5   I6   I7   I8
0    1   -1   -1   -1    1    1    1
0    1   -1   -1    0    1    1    1
0    1   -1    0   -1    1    1    1
0    1   -1    0    0    1    1    1
0    1    0   -1   -1    1    1    1
0    1    0   -1    0    1    1    1
0    1    0    0   -1    1    1    1
0    1    0    0    0    1    1    1
1    0   -1   -1   -1    1    1    1
1    0   -1   -1    0    1    1    1
1    0   -1    0   -1    1    1    1
1    0   -1    0    0    1    1    1
1    0    0   -1   -1    1    1    1
1    0    0   -1    0    1    1    1
1    0    0    0   -1    1    1    1
1    0    0    0    0    1    1    1
1    1   -1   -1   -1    0    1    1
1    1   -1   -1   -1    1    0    1
1    1   -1   -1   -1    1    1    0
1    1   -1   -1    0    0    1    1
1    1   -1   -1    0    1    0    1
1    1   -1   -1    0    1    1    0
1    1   -1    0   -1    0    1    1
1    1   -1    0   -1    1    0    1
1    1   -1    0   -1    1    1    0
1    1   -1    0    0    0    1    1
1    1   -1    0    0    1    0    1
1    1   -1    0    0    1    1    0
1    1    0   -1   -1    0    1    1
1    1    0   -1   -1    1    0    1
1    1    0   -1   -1    1    1    0
1    1    0   -1    0    0    1    1
1    1    0   -1    0    1    0    1
1    1    0   -1    0    1    1    0
1    1    0    0   -1    0    1    1
1    1    0    0   -1    1    0    1
1    1    0    0   -1    1    1    0
1    1    0    0    0    0    1    1
1    1    0    0    0    1    0    1
1    1    0    0    0    1    1    0
etc...

cordialement
 

erics83

XLDnaute Impliqué
Merci ODVJ,

En fait, je comptabilise par date, là il y en a 2 (pour l'exemple), mais il faut s'imaginer qu'il y a 250 dates, donc à chaque date, la combinaison "gagnante" s'incrémente.
A la fin de l'étude des 250 dates, je regarderai quelle combinaison a le plus d'incrémentation (=le plus grand nombre de comptage "positif") et c'est ça qui me dira quelle combinaisons est la "meilleure".

Pour chaque date, 1 seule lettre est gagnante. donc "facile" à comparer : je "regarde" quelles lettres sont "sélectionnées" par la combinaison, et si = lettre gagnante, j'incrémente le comptage de la combinaison

Concernant le code, je pensais lister les combinaisons, et mettre en i,j,k,etc...les lettres sélectionnées (d'où le code pour rechercher) et ensuite en "z" le résultat "officiel" et en "aa" le nombre (=le comptage de la combinaison).

Mais si tu as une autre logique/solution, suis preneur...

Merci pour ton aide,
 

ODVJ

XLDnaute Impliqué
Je ne comprends pas ton expression "la combinaison gagnante s'incrémente".

Pour une date (la première) et un résultat ("j") j'obtiens 248 combinaisons potentiellement gagnantes.
Pour la deuxième date, tu changes de résultat ?
Tu obtiens d'autres combinaisons gagnantes......
Tu fais l'intersection sur les 250 dates des ensembles de combinaisons gagnantes ?

Bref, je ne comprends pas.
 

erics83

XLDnaute Impliqué
Merci ODVJ,

Oui, chaque date à un résultat différent , pour la première c'est "j".
Imagine 1 pronostiqueur donne 8 pronostics de résultats
exemple pour le 1/1/2014, il donne comme pronostic parmi les rencontres sportives : Marseille, Bordeaux, Lyon, Paris, Strasbourg, Lille, Monaco, Metz, et c'est Bordeaux qui gagne (on ne connaît le gagnant que le soir)
Donc un seul gagnant.
Le 2/1/14, c'est un autre jour, d'autres pronostics et d'autres gagnants, etc...sur 250 jours.
C'est en fait pour tirer des stats sur la meilleure combinaison qui donc comptera le plus grand nombre de fois où elle a donné le bon résultat.

Merci pour ton aide,
 

ODVJ

XLDnaute Impliqué
Bonjour,

1) Les résultats pronostiqués sont les victoires des 8 rencontres?
2) Chacun des 8 clubs de l'exemple rencontrent 8 autres équipes et, toujours dans l'exemple, parmi les 8 clubs pronostiqués comme vainqueurs, seul Bordeaux a gagné le 1/1/2014?
3) Pour une date donnée, il peut y avoir plusieurs vainqueurs je suppose?
Dans ce cas, une combinaison permettant d'obtenir le bon résultat sera une combinaison où :
  1. toutes les lettres/clubs vainqueurs seront communes aux lignes 1 de la combinaison et uniquement elles?
  2. toutes les lettres/clubs vainqueurs seront incluses dans la liste des lettres/clubs communs aux lignes 1 de la combinaison?
  3. au moins une lettre/club pronostiqué est dans la liste des lettres/clubs communs aux lignes 1 de la combinaison?
un exemple avec le 1/1/14 :
La combinaison 1 1 0 0 0 0 0 1 satisfait un pronostic i et j et r et t.
La combinaison 0 1 0 -1 -1 1 0 1 satisfait un pronostic j et p.
Faut-il considérer ces 2 combinaisons comme satisfaisantes pour un résultat j le 1/1/14?​

Maintenant, un a parte sur la représentation des données.

Chaque combinaison peut être considérée comme l'écriture en base 3 des nombres de 1 à 6560 moyennant une translation -1 de chaque chiffre pour retomber sur -1, 0, 1.

Tu peux donc considérer que les résultats des rapprochements 6561 combinaisons x 250 pronostics seront stockés dans un tableau 6251 x 250 où on met des 1 chaque fois qu'une combinaison est satisfaisante. Il y aurait ainsi 248 uns dans la colonne 1/1/14 avec résultat "j".

Une somme par ligne de ce tableau te fournira la ou les meilleures combinaisons.

Cordialement
 
Dernière édition:

erics83

XLDnaute Impliqué
Merci ODJV,

Faut-il considérer ces 2 combinaisons comme satisfaisantes pour un résultat j le 1/1/14?
oui, ce sont des combinaisons "gagnantes" donc je les retiens (=combinaison1=combinaison1+1) et (=combinaison2=combinaison2+1) (combinaison1 et combinaison2 de ton exemple)

Une somme par ligne de ce tableau te fournira la ou les meilleures combinaisons.
Oui, c'est exacetement ce que je recherche.

En te remerciant pour ton aide,

Pourrais-tu me montrer un code, que je puisse faire des essais et/ou voir concrètement si tout est OK ?

Merci pour ton aide,
 
Dernière édition:

erics83

XLDnaute Impliqué
Re,

J'ai mis la colonne "résultat" pour que tu saches le résultat escompté, (=pour connaitre le résultat final ) et pouvoir comparer et pouvoir déterminer, lorsque les combinaisons auront été calculées quelles sont les combinaisons "gagnantes" par jour.

Le résultat, c'est 1 lettre par jour

Oui, c'est normal, il y a 8 pronostiqueurs, mais parfois il ne sont pas en forme et/ou en congés et donc ne donnent pas de pronostics.

Oui c'est normal de ne pas avoir tout le temps 8 pronostiques : certains pronostiqueurs donnent parfois uniquement 4 pronostiques, car pas "inspirés" par les matchs du jour....

En te remerciant pour ton aide,
 

Discussions similaires

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