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.