Precisa de ajuda para identificar um algoritmo de programação da liga

9

Estou tentando criar um agendador de liga esportiva. Estou tendo problemas para identificar um algoritmo para me ajudar a preencher com eficiência cada slot.

Os dados de amostra para criar a programação seriam:

  1. 10 equipes
  2. Cada time joga um ao outro uma vez (são necessários 45 jogos no total)
  3. Cada equipe joga no máximo 1 vez por dia
  4. Nos meus testes, estou usando 9 dias com 5 slots por dia.

Tabela Combo (contém 45 combos)

ID
Team1ID
Team2ID
bitAssigned

Tabela de agendamento (contém 45 horários)

scheduleID
homeTeamID
awayTeamID
GameDate
GameTime

No momento, meus procedimentos existentes preenchem cerca de 90% dos slots, deixando 10% dos slots vazios para um conflito de agendamento com base nas regras acima.

Percorro minha tabela de agendamento em ordem crescente de data / hora.
Meu primeiro horário poderia ser no sábado às 8h.
Consulto uma lista de equipes que ainda não foram agendadas. Em seguida, faço uma série de combinações possíveis dessas equipes. Em seguida, uso essa matriz para extrair 1 registro aleatório da minha tabela de combinações de combinações que ainda não foram agendadas e coloco essas equipes na programação. Em seguida, defino essa combinação como usada.

Repito o ciclo repetidamente e cada vez que minha lista de equipes disponíveis fica menor e minha matriz, como resultado, também é menor.

Estou descobrindo que alguns dias correm bem e, em outros, meus últimos 2 times restantes já jogaram na semana anterior, para que não sejam adicionados à programação novamente.

A única coisa que ainda não tentei é "redefinir" os dias de conflito e experimentá-los novamente para ver se consigo melhores posicionamentos.

Alguém tem alguma sugestão?

Steve
fonte
5
agendamento de torneios round-robin
kevin cline
Kevin obrigado. você está certo. Parece que, no momento, minha matriz começa no mesmo local todas as vezes e não há rotação, portanto não há fluxo ordenado para emparelhar as equipes.
steve
11
Eu uso uma abordagem completamente aleatória. Escolha aleatoriamente um slot e duas equipes. Se as regras forem cumpridas, programe o jogo. Caso contrário, descarte e tente novamente. Defino um limite para o total de tentativas e, se o limite for atingido, descarte o cronograma inteiro e comece novamente. Na verdade, funciona muito bem na prática.
Cerad 11/11/14
Acabei indo e seguindo a abordagem round robin. Estou 95% pronto para escrever o script para conectar-se ao banco de dados, mas nos testes ele parece estar funcionando perfeitamente. Estou tratando meus dias como "rodadas" e eles estão ficando bem e equilibrados. Eu posso jogar minhas rodadas em qualquer ordem e colocar os jogos para cada rodada em qualquer ordem, mas mover um jogo de uma rodada para outra acabaria quebrando as regras.
Steve

Respostas:

5

Aqui está um algoritmo que eu me inventei. Não sei se ele já existe ou é realmente a implementação de rodízio:

1 4    1 5   1 6   1 3   1 2
2 5    4 6   5 3   6 2   3 4
3 6    2 3   4 2   5 4   6 5

basicamente você começa com

foto de rotação

e sempre mantenha o 1 na mesma posição e gire o resto.

Dessa forma, você sempre terá uma programação de correspondências únicas. Isso é extremamente fácil de implementar e dimensiona com qualquer número de oponentes, pares ou desiguais. Se você tem um número desigual de oponentes, não coloque um time na posição 1 e eles terão uma rodada grátis.

Pieter B
fonte
2
como você gerencia os saldos em casa e fora?
Eric Cope
Na verdade, isso não funciona - nesse algoritmo de rotação simples, as equipes rotativas com 2 slots de diferença (2/4, 3/5) nunca serão jogadas.
Mdryden 6/06/19
@mdryden funciona. Verifique melhor e remova seu comentário.
Pieter B
@PieterB Eu estava pensando que funcionaria, mas na verdade não funcionará se houver um número ímpar de equipes, pois as que estão próximas umas das outras (como 4 e 5) nunca se jogarão. Você pode vê-lo facilmente no final com o 1, e também no outro lado, porque você tem a equipe pendente (com o adeus). Aqui está uma boa resposta que também lida com o número ímpar: stackoverflow.com/a/6649732/ 6489306
ragingasiancoder
@ragingasiancoder se houver um número ímpar de equipes, adicione uma equipe falsa. A resposta que você vinculou descreve exatamente a mesma solução que apresentei.
Pieter B
1

Eu acho que você está fazendo isso ao contrário. Não comece com a tabela de agendamento, comece com uma tabela / matriz / qualquer que seja a combinação de jogos (os 45 jogos). A partir daí, é um processo simples atribuir os jogos a um dia, com base em uma equipe que joga apenas uma vez por dia. E como os confrontos acontecem apenas uma vez (o time A joga o time B apenas uma vez), o agendamento é fácil porque você só precisa se certificar de que o confronto ainda não aconteceu (as entradas são "únicas" dessa maneira).

Codificador desconhecido
fonte
1

Gerei o cronograma de 10 rodadas de equipe única abaixo. Demorei cerca de 3 minutos.

Informações da programação:

10 equipes - 1 round robin (apenas as 6 primeiras semanas são exibidas)
Data de início da temporada 1/6/15 - data final 3/5/15
2 jogos a cada terça-feira, 3 jogos a cada quinta-feira, 5 jogos a cada semana sem pular datas

  • Todas as equipes são distribuídas para jogar nos 5 horários iguais.
  • Todos jogam 9 jogos.
  • Todos jogam um ao outro uma vez.
  • Todos são distribuídos igualmente como casa e visitante (5/4 ou 4/5). Nota: no final da rodada 2, todas as equipes jogam 18 jogos (9 em casa e 9 como visitante) e todas as equipes têm 2 Byes.
  • Todos são distribuídos para jogar uniformemente nos 5 horários de cada semana.

Usamos um computador com estrutura principal desatualizado da Honeywell e pouco menos de três anos para montar tudo isso. Depois que nosso software de agendamento foi depurado, o computador de quadro principal levou muitas horas pesquisando milhões de permutações e combinações para calcular e criar os padrões balanceados para 4 a 22 equipes que estávamos procurando.

10 Team Division Schedule   DATE 12/20/14

DATE   DAY TIME    LOCATION  GM  HOME vs VISITOR

Jan  6 Tue 6:00pm  Field #1   1  # 1 vs #10 
Jan  6 Tue 6:00pm  Field #2   1  # 2 vs # 9 
Jan  8 Thu 6:30pm  Field #3   1  # 3 vs # 8 
Jan  8 Thu 6:30pm  Field #4   1  # 4 vs # 7 
Jan  8 Thu 6:30pm  Field #5   1  # 5 vs # 6

Jan 13 Tue 6:00pm  Field #1   2  # 6 vs # 3 
Jan 13 Tue 6:00pm  Field #2   2  #10 vs # 8 
Jan 15 Thu 6:30pm  Field #3   2  # 7 vs # 2 
Jan 15 Thu 6:30pm  Field #4   2  # 9 vs # 1 
Jan 15 Thu 6:30pm  Field #5   2  # 4 vs # 5

Jan 20 Tue 6:00pm  Field #1   3  # 7 vs # 9 
Jan 20 Tue 6:00pm  Field #2   3  # 5 vs # 2 
Jan 22 Thu 6:30pm  Field #3   3  # 6 vs #10 
Jan 22 Thu 6:30pm  Field #4   3  # 3 vs # 4 
Jan 22 Thu 6:30pm  Field #5   3  # 8 vs # 1

Jan 27 Tue 6:00pm  Field #1   4  # 9 vs # 5 
Jan 27 Tue 6:00pm  Field #2   4  # 1 vs # 7 
Jan 29 Thu 6:30pm  Field #3   4  # 2 vs # 3 
Jan 29 Thu 6:30pm  Field #4   4  # 8 vs # 6 
Jan 29 Thu 6:30pm  Field #5   4  #10 vs # 4

Feb  3 Tue 6:00pm  Field #1   5  # 4 vs # 8 
Feb  3 Tue 6:00pm  Field #2   5  # 7 vs # 5 
Feb  5 Thu 6:30pm  Field #3   5  # 1 vs # 6 
Feb  5 Thu 6:30pm  Field #4   5  #10 vs # 2 
Feb  5 Thu 6:30pm  Field #5   5  # 3 vs # 9

Feb 10 Tue 6:00pm  Field #1   6  # 3 vs # 7 
Feb 10 Tue 6:00pm  Field #2   6  # 6 vs # 4 
Feb 12 Thu 6:30pm  Field #3   6  # 5 vs # 1 
Feb 12 Thu 6:30pm  Field #4   6  # 9 vs #10 
Feb 12 Thu 6:30pm  Field #5   6  # 8 vs # 2 

Não existe um algoritmo que resolva os problemas gerais de programação associados a centenas ou milhares de tipos diferentes de ligas, esportes e situações potenciais. O que fizemos para resolver esse problema foi adotar uma abordagem diferente para calcular os cronogramas. Começa com a matemática muito complexa para determinar os pares adequados de equipes de rodízio (match-ups), mas isso foi apenas o começo. Outras peças são necessárias para criar uma programação equilibrada útil que possa ser publicada e distribuída. Jogadores, treinadores, pais, etc., todos precisam saber não apenas quem eles estão jogando ; mas onde eles estão jogando ; a que horas eles estão jogando ; se eles estão em casa ou visitante ; e para muitas ligas, um número de jogo .

Espero que isso ajude você e outras pessoas a entender o que levou três anos para descobrir.

Comunidade
fonte