Organisation de Poules

Discussion générale entre passionnés et amateurs de mathématiques sur des sujets mathématiques variés
Mathusalem
Membre Irrationnel
Messages: 1837
Enregistré le: 14 Sep 2008, 04:41

Organisation de Poules

par Mathusalem » 08 Nov 2013, 16:58

Bonjour,
En organisant un tournoi, je suis confronté à la question suivante.

Soient 12 équipes, que je numérote de 1 à 12, réparties en 4 groupes de 3, se confrontant plusieurs jours d'affilée.
Par exemple,

Les équipes d'une même poule se voient. Chaque jour, les poules sont refaites.
Q1. A partir de combien de jours y aura-t-il obligatoirement des équipes qui se sont vues 2 fois ?

Je n'arrive pas à formaliser le problème pour le généraliser à :

Q2. Soient N équipes réparties en poules de taille telles que et . A partir de combien de jours y a-t-il obligatoirement des équipes qui se sont vues 2 fois. Combien de couples y a-t-il qui se sont vus deux fois ?
---------------------------------------------------
Par exemple, je voudrais savoir que dans le cas N=11, p = [4,4,3], la réponse est que dès le 2è jour il y aura forcément des équipes qui se voient 2 fois, et il y a 2 tels couples d'équipe.


Une idée d'algorithme pour connaître ces réponses m'est suffisant, mais pas de brute force.



Mathusalem
Membre Irrationnel
Messages: 1837
Enregistré le: 14 Sep 2008, 04:41

par Mathusalem » 11 Nov 2013, 13:00

Ce problème ne présente-t-il aucune intérêt ? Est-il trop particulier ?

J'aurais simplement besoin d'idées. Je n'arrive pas à attaquer le problème de manière méthodique. Pensez-vous que certains éléments de la théorie des graphes auraient leur place ici ?

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 11 Nov 2013, 22:19

j'ai essaye. J'ai failli.

Je suis parti sur cette reflexion:
soit n le nombre de joueurs.
je considere que les poules de 3.

On peut se faire une tite matrice d adjacence, symetrique et se concentrer sur la partie superieure.
on a n^2 cases, et seules n(n-1)/2 cases nous interessent

en loccurrence avec une grille 9x9, 36 cases ce qui donne envie de creer 12 poules.
Si on arrive a faire 12 poules sans que aucun joueur ne se croise, alors on peut affirmer que
a l issue des 4 jours on peut pas faire un jour de plus.

Par exemple, voici une matrice
Code: Tout sélectionner
   a   a   O   Y   H   H   O   Y
      a   g   X   P   g   X   P
         Q   e   f   e   f   Q
            b   b   g   O   Q
               b   e   X   Y
                  H   f   P
                     c   c
                        c
                        


les lettres designent des poules.
Par exemple joueur 1, joueur 2 et joueur 3 se rencontrent en poule a.
joueur 3, joueur 9, joueur 4 se rencontrent en poule Q.

On peut remarquer la symetrie par rapport a l axe (-x+9).
En particulier les poules b,e,X,et Y qui semblent delimiter des triangles dans la matrice.

Mais j ai essaye d extrapoler a 15 joueurs sans succes. (toujours des poules de 3 seulement).

je me suis servi de
Code: Tout sélectionner




.failed{
 background-color:yellow;
}
#grid td{
  width:40px;
  height:40px;
  font-size:20px;
}
#grid{
  border-collapse:collapse;
}
.sup{
  border:1px solid grey;
}
.same{
  background-color:grey;
}


var _size=0;
function getCell(i,j){
  var cell=document.getElementById('zz'+i+'-'+j);
  if(cell==null){
    console.log('is null '+i+'-'+j);//dbg purpose
  }
  return cell;
}
function getValue(i,j){
  return getCell(i,j).innerHTML.replace(//g,'');
}
function minValue(j,jRef){
  var a=j;
  var b=jRef;
  if(jRef';
    for(var j=0;ji){
        s+='';
      }else if(j==i){
        s+=''+(i+1)+'';
      }else{
        s+='';
      }
    }
    s+='';
  }
  return s;
}
function isFree(j,jRef,val){//i is the line, j is column, jRef is other
  var [a,b]=minValue(j,jRef);
  return getValue(a,b)==val ||getValue(a,b)=='';
}
function setOppositeCell(i,j,str){
  var jPrime=_size-i-1;//if i==0, want jprime=8 for size=9
  var iPrime=_size-j-1;//if j==1, want iprime=7
 
  setValue(iPrime,jPrime,str);
}
function fillOpposite(i,j,jRef,val){
  var [a,b]=minValue(j,jRef);
  if(parseInt(i,10)+parseInt(b,10)==_size-1){
    return;
  }
  setOppositeCell(i,a,val+'2');
  setOppositeCell(i,b,val+'2');
  setOppositeCell(a,b,val+'2');
}
function autofillAndCheck(e){
  if(e.keyCode==16){//shift
    return;
  }
  var [i,jRef]=this.id.substring(2).split('-');
  var val=getValue(i,jRef);
  if(val==''){
    return;
  }
  for(var j=parseInt(i,10)+1;j









en modifiant var s=generateTable(9); par le nombre d equipe desire, ce qui m evite de faire les symetriques (sans pour autant savoir si faire des symetries est la cle du succes)

edit: j ai reussi avec 5 poules de 3:
Code: Tout sélectionner
1,z,z,c2,d2,e2,f2,g2,g2,f2,e2,d2,c2, a, a
 ,2,z, w, y, y, t, r, w, u, u, t, b, r, b
 , ,3,m2, x,o2, x,o2, v,m2, v, c, h, h, c
 , , , 4,p2,q2,q2,p2, w,m2, d, i,c2, i, d
 , , ,  , 5, y, x,p2, s, e, j,d2, s, j, e
 , , ,  ,  , 6,q2,o2, f, k,e2, m, m, k, f
 , , ,  ,  ,  , 7, g, l,f2, n, t, n, l, g
 , , ,  ,  ,  ,  , 8,g2, o, p, p, o, r, g
 , , ,  ,  ,  ,  ,  , 9, q, v, q, s, l, f
 , , ,  ,  ,  ,  ,  ,  ,10, u, q, o, k, e
 , , ,  ,  ,  ,  ,  ,  ,  ,11, p, n, j, d
 , , ,  ,  ,  ,  ,  ,  ,  ,  ,12, m, i, c
 , , ,  ,  ,  ,  ,  ,  ,  ,  ,  ,13, h, b
 , , ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,14, a
 , , ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,15
la vie est une fête :)

Mathusalem
Membre Irrationnel
Messages: 1837
Enregistré le: 14 Sep 2008, 04:41

par Mathusalem » 14 Nov 2013, 17:13

Je vais décrire l'esprit dans lequel j'ai codé l'algorithme pour créer le tournoi.

Pour N équipes, il y a exactement N/2*(N-1) connections distinctes, où la connection signifie 'se voir dans une poule'. On peut organiser ces connections dans la partie triangulaire supérieure d'une matrice d'adjacence NxN, que j'apppelle C. Similairement à l'idée de fatal_error, C contient le nombre de fois que les couples se voient tout au long du tournoi.
R est la matrice des rencontres. Chaque ligne correspond à un nouveau jour.

Exemple: 9 équipes, 3 poules de 3, 6 Rencontres.



Optimisation:
Je souhaite que toutes les équipes se voient et je veux éviter le plus possible les répétitions. Dans ce sens, l'exemple du dessus n'est pas bon. Par exemple, les équipes 5 et 9 se voient 4 fois, alors que les équipes 4 et 8 ne rencontrent jamais l'équipe 9.
Je crée une mesure d'optimalité . La somme des entrées de C est constante pour un tournoi donné, puisque les poules ne varient pas, créant ainsi toujours le meme nombre de 'vus' par journées. Ainsi, en élevant les entrées au carré, et en minimisant M, je m'assure d'enlever les grands nombres (beaucoup de rencontres identiques), et puisque la somme des entrées est constante, je m'assure par la même occasion d'enlever beaucoup de 0s dans C.

Exemple optimisé


Au sens de ma mesure, il s'agit là de l'optimum absolu. Je ne peux pas éviter plus de 2 que ci-dessus.

Calculer M Optimum
L'algorithme reçoit un M_Optimum, et génère intelligemment des tournois. Il y a une composante aléatoire, et donc il réessaye jusqu'à atteindre M_Optimum.

Le calcul de M_Opt :
Nombre de connections distinctes : . Nombre connections créées lors d'un tournoi de J jours et poule : .
Ainsi, dans le cas optimal, le nombre de fois que les équipes se voient varie entre et . Dans le cadre de l'exemple, et . Il faut donc distribuer 54 'vus' sur 36 emplacements, ce qui signifie que le nombre de vus variera entre 1 et 2.
En toute generalite, si l'on appelle alors la matrice d'adjacence optimale contient
entrées valant et entrées valant . Sur l'exemple, cela se vérifie aisément : v = 3/2, Nombre de 1 : 36*1/2 = 18, Nombre de 2 : 36*1/2 = 18. Donc, l'optimum vaut 18*1^2+18*2^2 = 90.

Faute du calcul de M_Optimum

Si l'on prend l'exemple N=11, Poules = [4 4 3], J = 2, l'algorithme n'aboutira jamais.
En effet, on a , . Toutes les entrées varient donc entre 0 et 1. La matrice optimale doit contenir 30 fois 1, et 25 fois 0. Donc l'algorithme essaye de chercher ce tableau. Sauf qu'à cause de la structure de poules, dès le 2ème jour, il y a forcément 2 fois un "2" qui traîne quelque part dans la matrice d'adjacence. Donc le M_Optimum véridique est plus élevé que celui que cherche l'algorithme.

Conclusions

Dans certains cas, l'algorithme converge très vite à la solution optimale (moins de 10 secondes pour le premier tableau 9 optimisé), dans d'autres il converge lentement (1 heure pour 15 à 5 poules de 3). J'aimerais donc éviter d'attendre X heures pour être sûr que l'algorithme ne peut pas faire mieux. Je voudrais avoir un moyen de recalculer M_Optimum pour les cas pathologiques.

C'est afin d'avoir une méthode pour recalculer M_Optimum que je me tourne vers vous.

PS:
Fatal_error, j'ai cherché des symétries, mais dès que tu commences à avoir des poules mixtes de 4 et 3, la structure qu'engendre la poule de 4 dans la matrice d'adjacence n'a pas de symétrie particulière. Ca te fait des hexagones plus ou moins éfilés..De plus, mon algorithme fonctionne très bien pour trouver les tableaux. Ce que tu fais c'est enfait simuler un tournoi, et tu conclus à partir de la simulation. Moi, j'aimerais une caractérisation rapide de ces cas pathologiques pour recalculer mon optimum, et être sûr que mon algorithme a convergé.

 

Retourner vers ⚜ Salon Mathématique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 18 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite