Aquí hay un cronograma donde 59 de los 66 pares de miembros juegan entre sí (50 pares una vez, 6 pares dos veces, 2 pares tres veces, 1 par en las cuatro rondas).
ABCD EFGH IJKL
ABEK CFGI DHJL
ADEI BFJL CGHK
ADFK BGHI CEJL
Permutar y volver a etiquetar cuidadosamente los miembros a mano hace que la simetría sea más evidente:
- ¿Qué implica la afirmación 'Algunos infinitos son más grandes que otros infinitos' en un contexto filosófico?
- ¿Hay una gran diferencia entre el MNNIT, Allahabad y el PEC en CSE?
- Problema del conejo de Fibonacci: ¿por qué no hay bebés a finales de febrero?
- Cómo resolver: (- i) ^ (1/4) =
- Cómo calcular la raíz cuadrada de 1764
Aabc BXYZ Cxyz
AaXx BbYz CcZy
AaYy BbZx CcXz
AaZz BbXy CcYx
Encontré esto con el siguiente programa Haskell (usando la biblioteca concurrente-sa de Hackage, que hace recocido simulado).
import Control.Concurrent.Annealer import Control.Monad import Control.Monad.Random import Data.List start = take 4 $ repeat ["ABCD", "EFGH", "IJKL"] pairs xs = [(x, y) | x <- xs, y <- xs, x < y] energy schedule = length . nub $ pairs =<< concat schedule perturb schedule = do iRound <- getRandomR (1, 3) let (initRounds, round : tailRounds) = splitAt iRound schedule iGame <- getRandomR (0, 2) let (initGames, gameC : tailGames) = splitAt iGame round [gameA, gameB] = initGames ++ tailGames iA <- getRandomR (0, 3) iB <- getRandomR (0, 3) let (initA, memberA : tailA) = splitAt iA gameA (initB, memberB : tailB) = splitAt iB gameB gameA' = initA ++ memberB : tailA gameB' = initB ++ memberA : tailB return $ initRounds ++ [gameA', gameB', gameC] : tailRounds main = forever $ do schedule <- fmap (sort . map (sort . map sort)) $ annealForTime 1 200000 =<< initAnnealer (take 1 $ repeat start) energy 1 perturb print $ energy schedule print schedule