XL 2016 Rotation

NOUVEL

XLDnaute Nouveau
Bonjour,
J'aurais besoin d'aide pour un système de rotation de 49 personnes sur 7 tables sans que personne se rencontre deux fois.
 

JBARBE

XLDnaute Barbatruc
Bonsoir à tous,
Bon voilà c'est fait !
Bravo à ODVJ et à KenDev pour leur très bonne méthode de classement sans doublon !
Pour ma part, j'ai eu ma méthode au 1er tour et au 2éme tour sans trouver la bonne pour les tours suivants ( jusqu'au 8 éme)!
J'ai séché longuement sur le 7 éme tour sans trouver de solution aux chiffres manquants et sans enlever les doublons gênants !
Néanmoins, je joins mon fichier hélas inachevé et espère quand j'aurais le temps pouvoir le finir !
A moins qu'un bénévole trouve la solution des problèmes du classement de mon fichier sans copier les solutions ci-dessus proposées !
Bonne soirée !
 

Pièces jointes

  • Classement_Numeros_A.xls
    72.5 KB · Affichages: 57

ODVJ

XLDnaute Impliqué
Bonsoir,

Bravo plutôt à KenDev. Il a toutes les rencontres.
Il me manque des rencontres.
Normal ... vu qu'il doit y avoir 1176 têtes a têtes (49*48/2) pour 21 têtes a têtes par table (7*6/2) soit 56 tables d'où 8 manches.
Je n'ai que 50 tables.

Cordialement
 

ODVJ

XLDnaute Impliqué
Bonsoir,

voilà le complément :
upload_2017-11-11_22-56-34.png


cordialement
 

KenDev

XLDnaute Impliqué
Bonjour à tous,

Une généralisation méthode uniquement valable pour les 'carrés' de nombres premiers (49 sur 7 tables, 9 sur 3 tables, 2209 sur 47 tables, etc. mais pas 36 sur 6 tables ou 144 sur 12 tables)
Pour l'exemple demandé, lancer la sub aaa avec le paramètre 7

Cordialement
KD

VB:
Sub aaa()
  Call bbb(7)
End Sub

Sub bbb(ByVal n&)
  Dim a%(), i%, j%, k%, b%
  If n < 2 Then Exit Sub
  ReDim a(1 To n + 1, 1 To n, 1 To n)
  For i = 1 To n: For j = 1 To n: a(1, i, j) = n * (i - 1) + j: a(2, i, j) = n * (j - 1) + i: Next j, i
  For k = 3 To n + 1: For i = 1 To n: For j = 1 To n: b = i + (j - 1): b = b + n * (b > n): a(k, i, j) = a(k - 1, b, j): Next j, i, k
  Sheets.Add
  For k = 1 To n + 1: Cells((k - 1) * n + 1, 1) = "Tour " & k: For i = 1 To n: For j = 1 To n: Cells((k - 1) * n + i, j + 1) = a(k, i, j): Next j, i, k
  Cells.EntireColumn.AutoFit
End Sub
 
Dernière édition:

JBARBE

XLDnaute Barbatruc
Bonsoir à tous,
Bravo KenDev pour cette macro donnant le même résultat que le post #12 !
Mais j'aurais été curieux de voir une macro donnant des nombres aléatoires tout en respectant la demande de NOUVEL :
Il faut que les 49 personnes est vu tous le monde. Mais sans voir deux fois d'affilés les mêmes
En ce qui me concerne j'en suis totalement incapable !
Mais je pense que c'est possible compte tenu qu'on peut le faire suivant un ordre déterminé !
Peut-être que NOUVEL attend quel que chose de ce genre d'où son silence !
J’avoue que la macro aléatoire ( si elle peut être faite ) me sera très utile !
Bonne soirée à tous !
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Bonsoir à tous,
Bravo KenDev pour cette macro donnant le même résultat que le post #12 !
Mais j'aurais été curieux de voir une macro donnant des nombres aléatoires tout en respectant la demande de NOUVEL :
Il faut que les 49 personnes est vu tous le monde. Mais sans voir deux fois d'affilés les mêmes
En ce qui me concerne j'en suis totalement incapable !
Mais je pense que c'est possible compte tenu qu'on peut le faire suivant un ordre déterminé !
Peut-être que NOUVEL attend quel que chose de ce genre d'où son silence !
J’avoue que la macro aléatoire ( si elle peut être faite ) me sera très utile !
Bonne soirée à tous !
le fait que la macro liste tout les arrangements possibles sans doublons pour une personne rencontrant chaque autre personne une et une seule fois est par construction exhaustive ( i.e. il n'y en a pas d'autres, tout autre arrangement produira un doublon)
il suffit alors d'affecter aléatoirement les noms à chaque numéro :rolleyes:
piece jointe sur la base de la macro de Kendev
 

Pièces jointes

  • rotations2.xlsm
    47.6 KB · Affichages: 43

job75

XLDnaute Barbatruc
Bonsoir tout le monde,

Ce qu'il faut bien comprendre c'est que le 1er tour sert à ranger les 49 joueurs dans l'ordre, donc forcément sans doublon de paires.

Ensuite les 7 tours suivants déplacent les joueurs de manière astucieuse pour éviter les doublons de paires et donc aboutir à la solution unique.

Moi ce que j'aimerais savoir c'est si KenDev a (re)trouvé cette solution PAR LUI-MÊME, sinon qu'il nous dise il l'a trouvée.

Je ne serais pas étonné qu'un génie comme Blaise Pascal (1623-1662) qui s'intéressait aux joueurs et aux jeux de hasard ait trouvé cette manière de faire.

A+
 

KenDev

XLDnaute Impliqué
Bonsoir à tous,

@job75,

J'ai trouvé cette méthode FAUSSE par moi même oui, n'est pas Blaise Pascal qui veut... La méthode ne fonctionne en effet que dans les cas ou le nombre de tables est un nombre premier ce qui est le cas du 7 demandé, et par un hasard(?) amusant, également le cas des quelques nombres que j'ai utilisé pour vérifier cette macro...

Le post précédent s'en trouve modifié.

Cordialement
KD
 

job75

XLDnaute Barbatruc
Bonjour le forum,

Eh bien un grand bravo KenDev, j'ai ajouté la vérification des paires uniques créées :
Code:
Sub aaa()
  Call bbb(7)
End Sub

Sub bbb(ByVal n&)
  Dim a%(), i%, j%, k%, b%, t, d As Object
  If n < 2 Then Exit Sub
  ReDim a(1 To n + 1, 1 To n, 1 To n)
  For i = 1 To n: For j = 1 To n: a(1, i, j) = n * (i - 1) + j: a(2, i, j) = n * (j - 1) + i: Next j, i
  For k = 3 To n + 1: For i = 1 To n: For j = 1 To n: b = i + (j - 1): b = b + n * (b > n): a(k, i, j) = a(k - 1, b, j): Next j, i, k
  Sheets.Add
  For k = 1 To n + 1: Cells((k - 1) * n + 1, 1) = "Tour " & k: For i = 1 To n: For j = 1 To n: Cells((k - 1) * n + i, j + 1) = a(k, i, j): Next j, i, k
  Cells.EntireColumn.AutoFit
  '---vérification---
  t = Cells(1, 2).Resize(n * (n + 1), n)
  Set d = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(t): For j = 1 To n - 1: For k = j + 1 To n: d(t(i, j) & " " & t(i, k)) = "": Next k, j, i
  MsgBox "Nombre de paires uniques créées : " & d.Count & " sur " & n * n * (n * n - 1) / 2
End Sub
Bonne journée.
 

job75

XLDnaute Barbatruc
Re,

On peut analyser les doublons :
Code:
Sub aaa()
  Call bbb(15)
End Sub

Sub bbb(ByVal n&)
  Dim a%(), i%, j%, k%, b%, t, d As Object, x$, t1
  If n < 2 Then Exit Sub
  ReDim a(1 To n + 1, 1 To n, 1 To n)
  For i = 1 To n: For j = 1 To n: a(1, i, j) = n * (i - 1) + j: a(2, i, j) = n * (j - 1) + i: Next j, i
  For k = 3 To n + 1: For i = 1 To n: For j = 1 To n: b = i + (j - 1): b = b + n * (b > n): a(k, i, j) = a(k - 1, b, j): Next j, i, k
  Sheets.Add
  For k = 1 To n + 1: Cells((k - 1) * n + 1, 1) = "Tour " & k: For i = 1 To n: For j = 1 To n: Cells((k - 1) * n + i, j + 1) = a(k, i, j): Next j, i, k
  Cells.EntireColumn.AutoFit
  '---vérification---
  t = Cells(1, 2).Resize(n * (n + 1), n)
  Set d = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(t): For j = 1 To n - 1: For k = j + 1 To n: x = t(i, j) & " " & t(i, k): d(x) = d(x) + 1: Next k, j, i
  MsgBox "Nombre de paires uniques créées : " & d.Count & " sur " & n * n * (n * n - 1) / 2 & " "
  If d.Count = n * n * (n * n - 1) / 2 Then Exit Sub
  '---analyse des doublons---
  t = d.items: d.RemoveAll
  For n = 0 To UBound(t): d(t(n)) = d(t(n)) + 1: Next
  t = d.keys: t1 = d.items: x = ""
  For n = 0 To UBound(t): x = x & vbLf & t1(n) & " paires sont créées " & t(n) & " fois": Next
  MsgBox Mid(x, 2), , "Analyse"
End Sub
A+
 

job75

XLDnaute Barbatruc
Re,

Quand le nombre de tables n'est pas premier je pense que la méthode de KenDev minimise le nombre de doublons, mais il faudrait arriver à le démontrer.

On remarque que le nombre de fois où une paire est créée est toujours un diviseur du nombre de tables.

A+
 

Magic_Doctor

XLDnaute Barbatruc
Que je sache, un forum est destiné avant tout pour le "fun", et aucun commentaire pollue, à moins qu'il ne soit ordurier...
Comme tout le monde l'aura compris, cette citation n'est pas du célèbre cycliste-toujours-perdant, mais du célèbre janséniste dont on nous aura vacciné pour le Bac français avec ses fameuses "Pensées"...
Que KenDev ait trouvé par lui-même la solution, là n'est pas le problème. Ce qui importe, c'est la soution !

Une bonne réflexion, celle de José Gervasio Artigas (el prócer del Uruguay). Peut-être la plus belle définition de la liberté que j'aie jamais lue : " Con libertad no ofendo ni temo "
À cogiter !
 

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa