4 votos

Repetidos tripletes incompletos de Steiner

Yo no soy un matemático, así que espero que esta pregunta tiene sentido. Como un hobby, puedo organizar ligas de aficionados de voleibol de los equipos. Para minimizar los gastos de viaje de los partidos se juegan como pequeños torneos con 3 equipos, donde todo el mundo juega cada uno de los otros (2+1=3 partidos). Al final de la temporada, todos los equipos deberían haber jugado a cada uno la misma cantidad de veces. Para las últimas temporadas, el número de equipos ha sido de 7 o 9, por lo que todo salió bien. Este año hay 10 equipos, por lo que descubrí que algunos juegos tienen que ser jugado como juegos individuales.

Entonces descubrí que esto tiene un nombre:

http://mathworld.wolfram.com/SteinerTripleSystem.html

y eso sólo es posible si el número de equipos de mod 6 es igual a 1 o 3.

Hay un algoritmo que para un determinado número v de minimizar el número de "resto" de 2-tuplas? Además, ¿bajo qué circunstancias es posible la combinación de 2 o más conjuntos, de modo que el resto de las 2-tuplas se pueden combinar en trillizos?

Como un ejemplo de cuando podemos combinar incompleta trillizos es de 5 elementos

S = {A, B, C, D, E}

Si repetimos este proceso 3 veces, es posible terminar con:

A   B   C
E   B   D
D   C   E
C   A   D
B   A   E
A   D   E
C   B   E
D   A   B
E   A   C
B   C   D 

I. e., todo el mundo juega cada una de las otras 3 veces, con un total de 3*(4+3+2+1)=30 juegos.

2voto

saulspatz Puntos 116

He pasado una buena cantidad de tiempo esta mañana Googlear esto, y tengo algo de información para usted.

Lo que usted describe se llama un "parcial Steiner sistema de triple" (PST). Es decir, sin pareja puede pertenecer a más de un triple. Un PST se dice maximal si no hay más triple puede ser añadido sin violar la condición. El orden de los archivos PST es el número de puntos (equipos, en su aplicación). El espectro de la máxima archivos PST de orden $v$ es el conjunto de valores posibles del número de triples en un sistema.

El problema de determinar el espectro de un máximo de Steiner triple sistema de orden de $v$ ha sido resuelto. Los resultados se resumen en la Sección 9 de este documento.

Veamos el caso de $v=10.$ En la nota en la página $16$ el espectro es $S^{(3)}(10)$ y el mayor elemento del espectro es $M^{(3)}(10)$. Desde $10\equiv4\pmod{6},$ utilizamos la fórmula $$M^{(3)}(10)={v(v-2)-2\over6} = {10\cdot8-2\over6}=13$$

The smallest value in the spectrum is denoted $m^{(3)}(10)$. To compute this we must first compute the number $\delta_v$. Since $10\equiv10\pmod{12},$ we use the formula $$\delta_v=-2v+16=-2\cdot10+16=-4$$.

Now we use the formula $$ m^{(3)}(v)={v^2+\delta_v\over12}={10^2-4\over12}=8$$

This goes a long way to answering your question I think. There are maximal PSTS's of order $10$ with as few as $8$ triples, so it seems highly unlikely that a naive greedy algorithm will produce a maximal PSTS with $13$ triples.

For completeness, let's finish computing the spectrum. We know that $R(10)$ = $\{8,9,10,11,12,13\}$ contains all possible values, and we have to determine which values, if any, are omitted from the spectrum.

We first have to compute $Y(10)$. We use the last formula, with $k=0,$ to find $Y(10)=11.$ There are some typos in the form for the set of omitted values, $Q(10)$, so it doesn't make any sense, but by using "Search Inside" on amazon.com, I was able to look at page $164$ of "Triple Systems" by Coburn and Rosa, to find that the correct formula is $$ P(v)=\left\{s:m^{(3)}(v)<s<Y(v) \text{ y }\left\lfloor{v-1\over2}\right\rfloor\equiv1\pmod{2}\right\}$$ Since $9$ is the only integer between $8$ and $10$ and $\left\lfloor{9-1\over2}\right\rfloor\equiv0\pmod{2},$ we see that $Q(10)=\emptyset,$ so that the spectrum is exactly $R(10).$

I couldn't find any deterministic algorithms for generating maximal PSTS's on the Web. For such small numbers as you are dealing with, I think the right approach is to write a script that computes $M^{(3)}(v)$ and then finds a maximal PSTS of this order by backtracking.

On page $174$ of "Triple Systems" a randomized algorithm called Rödl's "nibble method" is described. Start with an empty set choose a triple uniformly at random. If none of the pairs in the triple have already occurred, add it to the set. Otherwise, discard it. Continue until there are no candidate triples. This is supposed to cover almost all the pairs, so if you know what the maximum is, you can just try a few times until you hit the jackpot. This would be very easy to implement, of course.

EDIT

I wrote a python script implementing the "nibble method" as described above. It works well so long as the number of teams doesn't get too big. I've set the maximum number of random trials at $500$ and so far that's always bee enough, though with $12$ teams, it's come awfully close a number of times.

#mpsts.py
'''
Given n, construct a partial Steiner triple system on 
n points, containing as many triples as possible.
'''
from itertools import combinations 
from random import choice 
import sys

def M(n):
    m = n%6
    if m in (1,3):
        return n*(n-1)//6
    if m in (0,2):
        return n*(n-2)//6
    if m== 4:
        return (n*(n-2)-2)//6
    if m== 5:
        return (n*(n-1)-8)//6

def report():
    assert audit()
    print("%d points, %d triples, %d pairs, %d trials" %(n, len(triples), len(pairs)-len(usedPairs), trials))
    for t in triples:
        print(tuple(sorted(t)))
    for p in pairs:
        if p not in usedPairs:
            print(p)

def audit():
    if len(triples) != max3:
        return False
    if 3*max3 != len(usedPairs):
        return False
    return True

n = int(sys.argv[1])
max3 = M(n)  
pairs = set(combinations(range(1,n+1), 2))

trials = 1
maxTrials = 500
while trials <= maxTrials:
    candidates = list(combinations(range(1,n+1), 3))
    usedPairs = set()
    triples = set()
    while candidates:
        t = choice(candidates)
        p = set(combinations(t, 2))
        candidates.remove(t)
        if not (p & usedPairs):
            triples.add(t)
            usedPairs |= p
    if len(triples) ==max3:
        report()
        break
    trials += 1
else:
    print("no successes in %d trials"%maxTrials)

Here's sample output for $10$ teams:

10 points, 13 triples, 6 pairs, 3 trials
(1, 4, 7)
(2, 6, 7)
(3, 7, 9)
(4, 6, 9)
(1, 9, 10)
(1, 2, 3)
(7, 8, 10)
(3, 4, 10)
(2, 4, 5)
(2, 8, 9)
(5, 6, 10)
(1, 6, 8)
(3, 5, 8)
(5, 9)
(4, 8)
(1, 5)
(3, 6)
(2, 10)
(5, 7)

Notice that $5$ occurs $3$ times in the $6$ leftover pairs at the end. You might have a tournament with say, $1,5,\text{ y }9$ where $5$ played the other two teams, but $1$ and $9$ didn't meet again, or just had a "friendly." I don't know if that would be considered fair. It seems unfair to me if $5$ had to play all $3$ equipos, pero entonces, yo no sé nada acerca de voleibol.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X