Necesita ayuda para identificar un algoritmo de programación de liga

9

Estoy tratando de crear un planificador de liga deportiva. Tengo problemas para identificar un algoritmo que me ayude a completar cada espacio de manera eficiente.

Los datos de muestra para construir el cronograma serían:

  1. 10 equipos
  2. Cada equipo juega entre sí 1 vez (se requieren 45 juegos en total)
  3. Cada equipo juega no más de 1 vez por día
  4. En mis pruebas estoy usando 9 días con 5 ranuras por día.

Mesa combinada (contiene 45 combos)

ID
Team1ID
Team2ID
bitAssigned

Tabla de programación (contiene 45 franjas horarias)

ScheduleID
homeTeamID
awayTeamID
GameDate
GameTime

En este momento, mis procedimientos existentes ocupan aproximadamente el 90% de los espacios, dejando el 10% de mis espacios vacíos a un conflicto de programación basado en las reglas anteriores.

Doy vueltas sobre mi tabla de horarios en orden ascendente de fecha / hora.
Mi primer puesto podría ser el sábado a las 8 a.m.
Consulto una lista de equipos que aún no se han programado. Luego hago una serie de posibles combinaciones de esos equipos. Luego uso esa matriz para extraer 1 registro aleatorio de mi tabla de combinaciones de combinaciones que aún no se han programado y ubico a esos equipos en el calendario. Luego configuro esa combinación como se usa.

Repito el ciclo una y otra vez y cada vez que mi lista de equipos disponibles se hace más pequeña y mi matriz como resultado también es más pequeña.

Estoy descubriendo que algunos días van bien, y otros días mis últimos dos últimos equipos restantes ya han jugado en una semana anterior, por lo que no se vuelven a agregar al calendario.

Lo único que no he intentado todavía es "restablecer" los días de conflicto e intentarlos nuevamente para ver si obtengo mejores ubicaciones.

¿Alguien tiene alguna sugerencia?

Steve
fuente
55
programación del torneo round-robin
kevin cline
Kevin gracias. tu derecho Parece que en este momento mi matriz comienza en el mismo lugar cada vez y no hay rotación, por lo que no hay un flujo ordenado para emparejar los equipos.
Steve
1
Yo uso un enfoque completamente al azar. Elige aleatoriamente un espacio y dos equipos. Si se cumplen las reglas, entonces programe el juego. Si no, deseche e intente nuevamente. Establezco un límite en los intentos totales y, si se alcanza el límite, descarto todo el programa y empiezo de nuevo. En realidad funciona bastante bien en la práctica.
Cerad
Terminé yendo y siguiendo el enfoque de round robin. Ya he terminado de escribir el script en un 95% para conectarme a la base de datos, pero en las pruebas parece funcionar sin problemas y equilibrado. Estoy tratando mis días como "rondas" y se mantienen agradables y equilibrados. Puedo jugar mis rondas en cualquier orden y poner los juegos para cada ronda en cualquier orden, pero mover un juego de una ronda a otra finalmente rompería las reglas.
Steve

Respuestas:

5

Aquí hay un algoritmo que inventé yo mismo. No sé si ya existe o si es realmente la implementación de round robin:

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

básicamente comienzas con

foto de rotación

y siempre mantenga el 1 en la misma posición y gire el resto.

De esa manera siempre obtendrás un calendario de partidos únicos. Esto es extremadamente fácil de implementar y se escala con cualquier número de oponentes, incluso o de manera desigual. Si tienes un número desigual de oponentes, simplemente no coloques a un equipo en la posición 1 y ellos tienen una ronda libre.

Pieter B
fuente
2
¿Cómo manejas los saldos en casa vs fuera?
Eric Cope
En realidad, esto no funciona: en este algoritmo de rotación simple, los equipos rotativos que están separados por 2 ranuras (2/4, 3/5) nunca jugarán.
mdryden
@mdryden funciona. Compruébelo mejor y elimine su comentario.
Pieter B
@PieterB Estaba pensando que funcionaría, pero en realidad no funciona si hay un número impar de equipos, ya que los que están uno al lado del otro (como 4 y 5) nunca jugarán entre sí. Puede verlo bastante fácilmente al final con el 1, y también en el otro extremo porque tiene el equipo colgante (con el adiós). Aquí hay una buena respuesta que también trata con el número impar: stackoverflow.com/a/6649732/ 6489306
ragingasiancoder
@ragingasiancoder si hay un número impar de equipos, agregue un equipo ficticio. La respuesta que vinculó describe exactamente la misma solución que presenté.
Pieter B
1

Creo que lo estás haciendo al revés. No comience con la tabla de programación, comience con una tabla / matriz / cualquiera de las combinaciones de juegos (los 45 juegos). A partir de ahí, es un proceso simple asignar los juegos a un día, basado en un equipo que solo juega una vez al día. Y dado que los enfrentamientos solo ocurren una vez (el Equipo A solo juega contra el Equipo B una vez), la programación es fácil porque solo debes asegurarte de que el enfrentamiento no haya sucedido (las entradas son "únicas" de esa manera).

Codificador desconocido
fuente
1

Genere el horario de 10 equipos de un solo round robin a continuación. Me llevó unos 3 minutos.

Información del horario:

10 equipos: 1 round robin (solo se muestran las primeras 6 semanas)
Fecha de inicio de la temporada 6/1/15 - fecha de finalización 3/5/15
2 juegos cada martes, 3 juegos cada jueves, 5 juegos cada semana sin fechas de omisión

  • Todos los equipos se distribuyen para jugar en las 5 franjas horarias por igual.
  • Todos juegan 9 juegos.
  • Todos juegan entre sí una vez.
  • Todos se distribuyen de manera uniforme como hogar y visitante (ya sea 5/4 o 4/5). Nota: al final del round robin 2 todos los equipos juegan 18 juegos (9 como local y 9 como visitante) y todos los equipos tienen 2 Byes.
  • Todos se distribuyen para jugar de manera uniforme en las 5 franjas horarias de cada semana.

Utilizamos una computadora de marco principal Honeywell obsoleta y poco menos de 3 años para armar todo esto. Una vez que nuestro software de programación fue depurado, la computadora de marco principal tardó muchas horas buscando millones de permutaciones y combinaciones para calcular y crear los patrones equilibrados para 4 a 22 equipos que estábamos buscando.

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 

No existe un algoritmo que resuelva los problemas generales de programación asociados con los cientos o miles de diferentes tipos de ligas, deportes y situaciones potenciales. Lo que hicimos para resolver este problema fue adoptar un enfoque diferente para calcular los horarios. Comienza con las matemáticas muy complejas para determinar los emparejamientos adecuados del equipo de round robin (emparejamientos), pero eso fue solo el comienzo. Se necesitan otras piezas para crear un programa equilibrado útil que se pueda publicar y distribuir. Los jugadores, entrenadores, padres, etc., todos necesitan saber no solo con quién juegan ; pero donde están jugando ; a qué hora están jugando ; si están en casa o visitantes ; y para muchas ligas, un número de juego .

Espero que esto les ayude a usted y a otros a comprender lo que nos llevó 3 años descubrir.

Comunidad
fuente