Somos un grupo de personas que juegan al floorball juntos de manera regular. Cada sesión comienza con la desalentadora tarea de dividir equipos ...
Entonces, ¿qué sería mejor que una aplicación para elegir equipos automáticamente?
Entonces, dado un historial de combinaciones de equipos y resultados, y una lista de personas que se presentan a esta sesión en particular, ¿cuál sería una buena estrategia para encontrar los equipos óptimos? Por óptimo, quiero decir equipos lo más iguales posible.
¿Algunas ideas?
Editar: para que quede claro, los datos en los que tengo que basar la selección serían algo como esto:
[{ team1: ["playerA", "playerB", "playerC"],
team2: ["playerD", "playerE", "playerF"],
goals_team1: 10,
goals_team2: 8
},
{ team1: ["playerD", "playerB", "playerC"],
team2: ["playerA", "playerE", "playerG"],
goals_team1: 2,
goals_team2: 5
},
{ team1: ["playerD", "playerB", "playerF"],
team2: ["playerA", "playerE", "playerC"],
goals_team1: 4,
goals_team2: 2
}]
algorithms
strategy
team
Vegar
fuente
fuente
Respuestas:
Lo primero a considerar, esto es para algo casual. No está diseñando un sistema para determinar rondas para la copa mundial de pelota de piso. Es para juegos casuales con un grupo de personas que disfrutan de un buen juego en lugar de una victoria desigual.
Recuerdo que Google tenía un generador de probabilidades de futbolín. Se trabajó un poco más en eso que yo en esto. Buscando una referencia para eso, encontré un artículo en SO y una calculadora True Skill que Microsoft usa para xbox .
Adoptando un enfoque mucho más simplista, cada jugador obtiene el puntaje de la proporción de puntos que su equipo tiene para el juego. Para el Juego 1, el jugador A obtendría 1.25 (10/8) mientras que el jugador D obtendría 0.8 puntos (8/10). Encuentra la media de todos los números y esa es la puntuación del jugador.
Para el conjunto de juegos descritos, esto proporciona:
En este punto, tiene un problema similar al del problema de partición con la restricción de que cada equipo necesita el mismo número de jugadores y los valores no necesitan ser exactos (sino lo más cercanos posible).
fuente
Enfoque rápido y sucio:
Calcule un puntaje para cada jugador que sea el total de puntos para el lado en el que estaba ese jugador dividido por el total de puntos en el juego para cada juego en el que participó. Luego ordene a los jugadores por puntaje. Coloque al primer jugador en el equipo A. Luego, para cada jugador, agréguelos al equipo con el puntaje agregado más bajo hasta que la mitad de los jugadores estén en un equipo. Todos los jugadores restantes van al otro equipo.
fuente
Si no desea profundizar en el embriagador mundo de los antecedentes bayesianos (pdf) y tal, un enfoque interesante es asignar un orden total a todos los jugadores (en función de la proporción de victorias / derrotas, puntos acumulativos, etc.) y luego dividir en Los equipos que utilizan la función de paridad son los siguientes
Tome la lista ordenada de jugadores (de mejor a peor) y sepárelos en equipos pares e impares según el número de 1 bits en su índice (comenzando en 0). Eso da la siguiente distribución:
... etc.
La función de paridad asegurará un número igual de jugadores en cada equipo, para cualquier número par de jugadores. Luego se alternará dando la ventaja del jugador impar a un equipo u otro de tal manera que los efectos tienden a equilibrarse con el tiempo.
Esta función funciona mejor cuando la distribución de la habilidad del jugador es plana. En realidad, la habilidad del jugador tiende a seguir la distribución de "suma de valores aleatorios", también conocida como la gaussiana (aunque tenga cuidado con las aplicaciones generales de esa suposición en sistemas como TruSkill).
Para compensar las grandes brechas de habilidades, puede aplicar permutaciones a esta lista. Por ejemplo, para contrarrestar a un jugador superior 0000 muy fuerte, puede intercambiar el jugador 0011 con un jugador impar de menor rango, como 0100. Aquí es donde las cosas se ponen onduladas, pero al menos proporciona un buen punto de partida que no requieren una medida precisa de habilidad absoluta, pero simplemente un orden basado en la habilidad relativa.
fuente
Dependiendo de cuánto tiempo tenga, comience las primeras sesiones seleccionando aleatoriamente a los capitanes de equipo y obtenga un borrador antes de cada juego. Mantenga un registro de qué selección va un jugador. Las elecciones anteriores obtienen calificaciones más altas:
Round #1 = 8 pts, Round #2 = 6 pts, Round #3 = 4 pts, etc
Winning a game = 5 pts
Todo esto dependerá del número de jugadores por equipo. Es posible que sea necesario convertir los puntos totales a un promedio diario o del juego si hay una gran discrepancia en la participación. También puede otorgar un equipo por un margen de victoria mayor.
Los jugadores que fueron seleccionados temprano y jugaron en un equipo ganador obtienen la mayor cantidad de puntos de poder.
Luego, deje que la computadora haga el bosquejo (selección de equipos) equilibrando los puntos de poder para cada equipo y colocando equipos con calificaciones casi iguales entre sí. Los jugadores que sean seleccionados temprano, pero que continúen jugando en equipos perdedores caerán en la clasificación.
fuente
La solución más fácil sería proporcionar una calificación / peso de la habilidad estimada e intentar equilibrar el puntaje de cada equipo.
A partir de ahí, podría sembrar una red bayesiana con estos valores y luego inferir hacia atrás en función del resultado observado de cada enfrentamiento en los datos históricos que tiene.
Como un punto de interés de mi parte: Infer.NET hace que esto sea relativamente fácil de imaginar y potencialmente implementar, y podría predecir las probabilidades de ganar dados los enfrentamientos de equipo. Infer.NET es algo en lo que realmente estoy empezando a entrar últimamente.
fuente
Supongamos, en aras de la discusión, que puede asignar a cada jugador un valor entero y esos valores se suman, es decir, un jugador con puntaje X es tan valioso como tres jugadores con puntajes A, B y C, si A + B + C = X. El objetivo es entonces separar el grupo en dos equipos para que ambos equipos tengan aproximadamente el mismo valor sumado.
Esta es la versión de optimización del famoso problema de PARTICIÓN que es NP-complete. Por lo tanto, su problema es por lo que sabemos que es difícil de resolver. Sin embargo, PARTITION es débilmente NP-completo y admite algunas estrategias de aproximación razonables.
Un ejemplo es un enfoque codicioso similar a lo que propone Steven. Esta es una aproximación de 4/3, es decir, el equipo más fuerte nunca es más de un 33% más fuerte que una división óptima.
Tenga en cuenta que probablemente tenga restricciones adicionales, como que necesita al menos una cantidad fija de jugadores por equipo. Entonces, si pones a Michael Jordan en una clase de preescolares, no podrás crear equipos casi justos que tengan un número completo. Tal límite inferior (constante) en el tamaño del equipo no debería afectar la dureza del problema subyacente, pero podría destruir los límites de aproximación válidos para el problema general.
fuente
¿Qué tan ridículo quieres ser? Siempre puede usar la regresión lineal múltiple para generar coeficientes para cada jugador en función de los puntajes de sus equipos en juegos anteriores. Luego ordena la lista y selecciona.
En realidad, probablemente no funcionaría, ya que no modelar la dinámica entre los jugadores, sino que va a darle una razón para jugar con R . (<- mira, lo mantuve relacionado con la programación)
fuente
Si desea que su algoritmo sea razonable, los algoritmos simples simplemente no lo cortarán. A menudo te darán resultados extraños
Tendrá que optar por algo como el sistema ELO o Trueskill (aunque ELO no funciona para equipos sin modificaciones).
fuente