Bonne disposition des sièges pour la séquence des repas et des tables de taille k pour un groupe de personnes


23

Étant donné un ensemble S de personnes, je voudrais les asseoir pour une séquence de repas à des tables de taille k . (Bien sûr, il y a suffisamment de tables pour asseoir tous les |S| pour chaque repas.) J'aimerais organiser cela de telle sorte que personne ne partage une table avec la même personne deux fois. Les valeurs typiques sont |S|=45 et k=5 et 6 à 10 repas.

De manière plus abstraite, j'aimerais trouver une séquence de partitions de S telle que chaque partition se compose de sous-ensembles disjoints de cardinalité k et de la propriété globale ajoutée que toute intersection entre deux de ces sous-ensembles ne contient pas plus d'un élément. Je soupçonne que cela peut être formulé comme un problème théorique ou combinatoire de graphes.

Je serais reconnaissant pour une meilleure formulation du problème et des pointeurs vers la littérature pertinente car elle est en dehors de mon domaine.

Le contexte: cela pourrait être utilisé pour la disposition des sièges au Schloss Dagstuhl où de nombreux informaticiens viennent discuter de leurs recherches au cours d'une semaine. Actuellement, l'assise se fait au hasard et sans surprise, certaines personnes se retrouvent assis avec les mêmes personnes deux fois (ou plus souvent) au cours d'une semaine. Sans surprise, nous recevons quelques plaintes à ce sujet et de vagues suggestions sur la façon de l'améliorer. J'aimerais mieux comprendre cela. Une formulation plus forte du problème implique d'optimiser qui est assis côte à côte, mais je pense que cela n'est pas pertinent pour les tableaux de taille 5.

En dehors de l'application, je pense que la question intéressante concerne le nombre maximum de repas pouvant être servis pour un et un k donnés , c'est-à-dire combien de telles partitions existent.Sk


IIRC, cela ressemble au problème de Hamilton-Waterloo.
Juho

En jetant un coup d'œil à un document sur le problème de Hamilton-Waterloo, j'ai l'impression qu'il traite du problème plus strict de s'assurer qu'un participant s'assied à côté l'un de l'autre exactement une fois.
Christian Lindig

1
Le problème des écolières de Kirkman semble être de nature similaire et pourrait être un point de départ.
Christian Lindig

Réponses:


11

Voici une variante de la réponse originale (ci-dessous) qui donne le réglage souhaité: des tables de taille 5, 45 personnes et 10 repas, sauf qu'un repas a quelques tables de taille 4.

Soit le champ de taille 9. Choisissez 4 lignes verticales dégénérées { ( b , x ) | x F pour chaque b = 0 , 1 , 2 , 3 et déclarer leur peuple "vide". Il nous reste 81 - 9x4 = 45 personnes.{(b,x)|xF}b=0,1,2,3

9 repas sont donnés par pistes . Les intersections avec les 4 lignes dégénérées vides réduisent la taille du tableau à 9-4 = 5.a=0,1,,8

Un repas supplémentaire est donné par les lignes dégénérées restantes pour chaque b = 4 , 5 , 6 , 7 , 8 . Ici, la taille du tableau est 9. Cependant (dans toute solution), nous pouvons diviser un tableau de taille 9 en un tableau de taille 5 et un de taille 4.{(b,x)|xF}b=4,5,6,7,8

S'il y a encore quelques personnes, on peut utiliser le champ de taille 11.


Tout d' abord nous traitons personnes et k repas.k2k

Choisissez un champ fini de taille k et identifierpersonnes avec F × F . A chaque repas correspond une pente, à une table une ligne parallèle à cette pente.FkF×F

Plus précisément, le repas a k tables { ( x , a x + b )ak pour chaque b F .{(x,ax+b)|xF}bF

La propriété d'intersection que vous souhaitez est le fait que les lignes avec des pentes distinctes se coupent en un seul point.


Pour gérer personnes, divisez-les en deux groupes de k 2 chacun et appliquez la construction ci-dessus à chaque groupe. Pour gérer 2 k 2 - k = 45 , étiquetez (dans le premier groupe) une ligne fixe telle que { ( x , x ) | x F } comme "vide". Vous pouvez avoir quelques tables avec k - 1 personnes.2k2k22k2k=45{(x,x)|xF}k1

Pour plus de repas, on pourrait par exemple choisir une partition différente en deux groupes au début du 6ème repas. (Supposons que vous entrelaciez la partition d'origine, pour vous assurer que les deux groupes «se mélangent».) Bien sûr, cela peut entraîner des intersections.


C'est une construction intéressante mais trop limitative pour mon cas particulier à cause de mais pourrait servir de limite inférieure. |S|=k2
Christian Lindig

J'ai modifié la question pour aborder des paramètres plus généraux.
Manu

1
Je pense que [conception de blocs] ( en.wikipedia.org/wiki/Block_design ) est le cadre approprié pour le cas général, comme le souligne domotorp ci-dessous. Cependant, j'aime l'aspect constructif de cela et j'accepte comme une bonne réponse.
Christian Lindig

3
Je suis curieux de savoir s'il existe une solution avec 10 repas; J'ai fait quelques recherches sur Google, mais je n'ai pas trouvé de réponse. Quoi qu'il en soit, une fois la meilleure solution trouvée, qu'en est-il de la coder pour que les organisateurs puissent coller les noms des participants et récupérer toutes les attributions de sièges? Cela leur serait-il utile? Si nous simplifions cela, d'autres ateliers pourraient adopter cette belle tradition de Dagstuhl.
Manu

1
Belle mise à jour. Nous devrions boire une bière à Dagstuhl en votre honneur si cela est mis en œuvre :)
Suresh Venkat

4

Voici une limite supérieure (lâche?) Du nombre de repas que vous pouvez servir.

Soit et supposons que n est divisible par k . Supposons également que vous avez exactement n|S|=nnk tables et que vous souhaitez que chaque table soit pleine à chaque repas.n/k

Pour chaque repas, construisez un graphique avec un nœud pour chaque personne en et un bord lorsque deux personnes partagent une table. Ce graphique est une collection de n / k cliques de taille k chacune . Ainsi, le nombre d'arêtes dans le graphique est Θ ( nSn/kk .Θ(nk)

nΘ(n2)O(n/k)

n1k1 , qui, pour vos valeurs typiques, est 11.


3

Si vous voulez que deux personnes s'assoient à la même table exactement une fois, alors cela s'appelle un design 2 résolvable et a été beaucoup étudié. Bien sûr, permettre de sauter quelques repas donnerait une solution à votre problème lorsque deux personnes peuvent se rencontrer au plus une fois. (Mais d'autres solutions pourraient exister, je suppose.)


J'aimerais que deux personnes se rencontrent au plus une fois. L'identité de la table n'est pas un problème et je ne suis pas sûr de l'importance de s'asseoir à la même table dans le cadre de votre réponse, mais recherchera la définition liée.
Christian Lindig

2

Je ne sais pas si vous avez besoin d'un algorithme déterministe, mais j'ai résolu un problème similaire dans le passé en utilisant une méthode Monte Carlo à chaîne de Markov .

Vous pouvez voir un exemple de travail de cette approche sur Github - ce programme tente de placer un groupe de personnes à des tables d'une taille fixe, étant donné un ensemble de contraintes de sièges qui peuvent être positives ou négatives ("doit" ou "ne doit pas" ), et absolu ou relatif ("préférable").

Remarque: ce programme ne résout pas exactement le même problème que vous proposez, mais il donne une démonstration de travail d'une méthode Monte Carlo de chaîne de Markov, et il est suffisamment proche pour que vous puissiez facilement l'ajuster en fonction de votre problème.

Le programme résout le problème pour un dîner, mais dans votre cas, un moyen facile d'aborder le problème serait d'exécuter l'algorithme une fois pour chaque dîner, en fournissant à chaque fois les compagnons précédents de chaque dîner en tant qu'exigences floues ou absolues négatives. (L'avantage des exigences floues est que vous êtes assuré que l'algorithme s'arrêtera sur toutes les entrées, même si un arrangement parfait ne peut pas être trouvé).

Dans ce processus, nous tenterions d'abord de placer chaque salle à manger selon les exigences absolues - vous voudrez peut-être ignorer cette partie du processus, car cela ne fonctionne que lorsque les exigences absolues sont relativement peu nombreuses; sinon vous vous retrouvez avec un problème incroyablement énorme !

Dans l'étape suivante, nous créons une série de tableaux et affectons au hasard des participants aux tableaux pour une configuration initiale, et un score est calculé pour représenter le nombre d'exigences floues qui ont été satisfaites. Les paires de convives sont commutées au hasard et le score est recalculé pour ces tables afin de déterminer si la nouvelle configuration est préférable.

Cette partie du processus devrait idéalement être répétée avec plusieurs configurations initiales, et peut facilement être calculée en parallèle.


Intéressant et +1 pour nous montrer le code. J'ai pensé à dessiner au hasard des configurations de table et à essayer de répéter celles où les collisions se produisent. Le recuit simulé est également venu à l'esprit. Pour mon cas particulier, il suffirait même de pré-calculer les configurations pour divers|S|.
Christian Lindig

0

Je pense que tout arrangement de sièges valide équivaut à un hypergraphe d-régulier sur | S | sommets, où d est le nombre de dîners, avec un classement au plus k et un codegree maximum 1. La solution triviale est d'avoir tout le monde toujours assis seul, mais je suppose que le but est de minimiser le nombre de tables?


1
Le nombre de tables est fixe dans ce paramètre. Et c'est strictement inférieur au nombre de personnes.
Suresh Venkat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.