Strategia / algoritmo per dividere team equi in base alla storia


20

Siamo un gruppo di persone che giocano a floorball insieme su base regolare. Ogni sessione inizia con il compito scoraggiante di dividere le squadre ...

Cosa sarebbe meglio di un'applicazione per scegliere automaticamente i team?

Quindi, data una storia di combinazioni di team e risultati e un elenco di persone che si presentano per questa particolare sessione, quale sarebbe una buona strategia per trovare i team ottimali? Per ottimale, intendo squadre il più uguali possibile.

Qualche idea?

Modifica: Per chiarire, i dati su cui devo basare il picking sarebbero qualcosa del genere:

[{ 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
 }]

4
Che cos'è il floorball?
Dinamico

1
Presumo che tu abbia solo punteggi di squadra e nessun punteggio di contributo individuale?
Gort il robot

1
@Dinamica: Immagino che sia un altro nome per Floor Hockey - l'hockey ha giocato su un pavimento della palestra con una pallina di gomma invece che sul ghiaccio con un disco (e senza pattini, ovviamente).
FrustratedWithFormsDesigner,

2
Potresti voler chiarire che le uniche informazioni da utilizzare in questo algoritmo sono il numero di squadre vincenti / perse in cui ciascun giocatore ha partecipato.
TehShrike

2
@TehShrike Per ogni partita giocata, ho informazioni su chi ha giocato in quale squadra e quale è stato il punteggio finale. Per esempio. {Team1: ["a", "b", "c"], Team2: ["d", "e", "f"], Punteggio: "10-5"}
Vegar

Risposte:


6

La prima cosa da considerare, questa è una cosa casual. Non sta progettando un sistema per determinare i turni per la coppa del mondo di palla da terra. È per i giochi di ritiro casuali con un gruppo di persone a cui piace un buon gioco piuttosto che una vittoria sbilenco.

Ricordo qualcosa di Google che ha un generatore di probabilità di calcio balilla. È stato fatto molto più lavoro di quello che sto facendo su questo. Alla ricerca di un riferimento per questo, ho trovato un articolo in SO e un calcolatore True Skill che viene utilizzato da Microsoft per l'xbox .

Adottando un approccio molto più semplicistico, ogni giocatore ottiene il punteggio del rapporto tra i punti della propria squadra per il gioco. Per il gioco 1, il giocatore A otterrebbe 1,25 (10/8) mentre il giocatore D otterrebbe 0,8 punti (8/10). Trova la media di tutti i numeri e questo è il punteggio del giocatore.

Per il set di giochi descritto, ciò fornisce:

  A 1.42
  B 1.22
  C 0.72
  D 1.07
  E 1.27
  F 1.40
  G 2.50

A questo punto, hai un problema simile a quello del problema della partizione con il vincolo che ogni squadra ha bisogno dello stesso numero di giocatori e i valori non devono essere esatti (ma il più vicino possibile).


Stesso numero di giocatori, o il più vicino possibile se si presenta un numero dispari di giocatori ;-)
Vegar

Grazie per il riferimento al problema della partizione ! You rock, @ user40980
Eric Gopak

3

Approccio rapido e sporco:

Calcola un punteggio per ogni giocatore che è il punteggio totale per la parte in cui quel giocatore era diviso per i punti totali del gioco per ogni partita a cui ha partecipato. Quindi ordina i giocatori per punteggio. Posiziona il primo giocatore nella squadra A. Quindi, per ogni giocatore, aggiungili alla squadra con il punteggio aggregato più basso fino a quando metà dei giocatori fanno parte di una squadra. Tutti i giocatori rimanenti vanno nell'altra squadra.


Questo approccio può funzionare, anche se la data combinazione di persone è totalmente nuova.
Vegar

Fare meglio sembra una variante del problema dello zaino . Anche i pesi potrebbero essere rilevanti: il modo in cui me lo ricordo, il giocatore più pesante (io) è sempre stato scelto per ultimo.
Steve314,

Questo approccio avido è noto per dare un'approssimazione di 4/3 alla soluzione ottimale (Wikipedia)
Radek,

3

Se non vuoi scavare nel mondo inebriante dei priori bayesiani (pdf) e simili, un approccio interessante è quello di assegnare un ordine totale a tutti i giocatori (basato su razione di vincita / perdita, punti cumulativi, ecc.) E poi dividere in squadre che utilizzano la funzione di parità come segue.

Prendi l'elenco ordinato dei giocatori (dal migliore al peggio) e separali in squadre pari e dispari in base al numero di 1 bit nel loro indice (a partire da 0). Ciò fornisce la seguente distribuzione:

  • 0000 (migliore) - Pari
  • 0001 - Dispari
  • 0010 - Dispari
  • 0011 - Pari
  • 0100 - Dispari
  • 0101 - Pari
  • 0110 - Pari
  • 0111 - Dispari

...eccetera.

La funzione di parità garantirà un numero uguale di giocatori in ogni squadra, per qualsiasi numero pari di giocatori. Si alternerà quindi dando il vantaggio del giocatore dispari a una squadra o all'altra in modo tale che gli effetti tendano ad equilibrarsi nel tempo.

Questa funzione funziona al meglio quando la distribuzione delle abilità del giocatore è piatta. In realtà, l'abilità del giocatore tende a seguire la distribuzione della "somma di valori casuali", nota anche come gaussiana (anche se attenzione alle applicazioni generali di tale ipotesi in sistemi come TruSkill).

Per compensare grandi lacune di abilità, è possibile applicare permutazioni a questo elenco. Ad esempio, per contrastare un giocatore in testa 0000 molto forte, puoi scambiare il giocatore 0011 con un giocatore dispari di livello inferiore, come 0100. Qui è dove le cose si fanno ondulate, ma almeno fornisce un buon punto di partenza che non lo fa richiede una misura accurata dell'abilità assoluta, ma semplicemente un ordinamento basato sull'abilità relativa.


2

A seconda di quanto tempo hai, inizia le prime sessioni selezionando casualmente i capitani della squadra e fai una bozza prima di ogni partita. Tieni traccia della scelta di un giocatore. Le scelte precedenti ottengono valutazioni più elevate:

Round #1 = 8 pts, Round #2 = 6 pts, Round #3 = 4 pts, etc

Winning a game = 5 pts

Tutto questo dipenderà dal numero di giocatori per squadra. I punti totali possono avere bisogno di essere convertito in una media giornaliera o gioco, se v'è una grande differenza nella partecipazione. Puoi anche assegnare una squadra per un margine di vittoria maggiore.

I giocatori che sono stati selezionati in anticipo e hanno giocato in una squadra vincente ottengono il maggior numero di punti potere.

Quindi lascia che il computer esegua la redazione (selezione delle squadre) bilanciando i punti di forza per ciascuna squadra e mettendo le squadre con punteggi quasi uguali l'una contro l'altra. I giocatori che vengono selezionati in anticipo, ma continuano a giocare in caso di sconfitte, scenderanno in classifica.


Bella risposta! Questo può funzionare per il team medio, ma alcuni team sono strategici. Ad esempio, se vuoi che tutta la tua squadra sia difesa, allora i giocatori in generale peggiorerebbero nei round più alti. Ma suppongo di non aver chiesto canonico: P. Grazie!
Dynamic

È un ottimo modo per iniziare. Per i primi round, tutto ciò che si basa sul punteggio della squadra non si applicherà individualmente poiché avrai membri della squadra che giocano insieme in ogni round.
Gort the Robot

1

La soluzione più semplice sarebbe quella di fornire un grado / peso dell'abilità stimata e provare a bilanciare il punteggio per ogni squadra.

Da lì, potresti seminare una rete bayesiana con questi valori e quindi inferiresti all'indietro in base al risultato osservato di ogni confronto nei dati storici che hai.

Come punto di interesse da parte mia: Infer.NET rende questo relativamente facile da immaginare e potenzialmente implementare, e potrebbe prevedere le probabilità di una vittoria dato incontri di squadra. Infer.NET è qualcosa che sto davvero iniziando ad approfondire ultimamente.


Avresti abbastanza dati per essere significativi, dato che probabilmente ci sarebbero solo una manciata di giochi?
Gort il robot

Speravo di risolverlo con javascript o ruby, ma infer.net sembra comunque interessante.
Vegar

@StevenBurnap: dipende da quanto sono buone / accurate le tue ipotesi iniziali sull'abilità del giocatore - cosa che dovrai fare per la maggior parte o per tutti i sistemi. Il vantaggio dell'uso della rete è che sarai in grado di inferire nuovi punteggi per ogni giocatore col passare del tempo per migliorare quel valore.
Steven Evers,

1

Supponiamo per amor di discussione che è possibile assegnare a ciascun giocatore un valore intero e che si sommino quei valori, ovvero un giocatore con punteggio X ha il valore di tre giocatori con punteggi A, B e C, se A + B + C = X. L'obiettivo è quindi di separare il gruppo in due squadre in modo che entrambe abbiano un valore sommato uguale.

Questa è la versione di ottimizzazione del famoso problema PARTITION che è NP-completo. Pertanto, il tuo problema è per tutto ciò che sappiamo difficile da risolvere. Tuttavia, PARTITION è debolmente NP-completa e ammette alcune strategie di approssimazione ragionevoli.

Un esempio è un approccio avido simile a quello che Steven propone. Questa è un'approssimazione di 4/3, ovvero la squadra più forte non è mai più del 33% più forte di una divisione ottimale.

Nota che probabilmente hai ulteriori vincoli, ad esempio hai bisogno di almeno un numero fisso di giocatori per squadra. Quindi, se metti Michael Jordan in una classe di bambini in età prescolare, non sarai in grado di creare squadre quasi giuste che abbiano il numero completo. Un limite inferiore (costante) delle dimensioni della squadra non dovrebbe influire sulla durezza del problema sottostante ma potrebbe distruggere i limiti di approssimazione validi per il problema generale.


1
Non puoi adattare molti giocatori su una palestra. Con un massimo di 20 giocatori, supponendo che tu voglia 10 su un lato, ci sono solo 92378 combinazioni da controllare. Ma non ci vogliono molti giocatori prima che il numero di combinazioni renda impossibile una ricerca esaustiva.
Kevin Cline,

@kevincline: giusto. Ho assunto implicitamente che la forza bruta non fosse un'opzione (altrimenti, perché chiedere?).
Raffaello,

Non ci sarebbero mai più di sei persone per squadra. Più spesso quattro.
Vegar,

@Vegar: Quindi la tua domanda è più su come sfruttare i punteggi delle squadre per modellare il valore del giocatore e meno sugli algoritmi, giusto?
Raffaello,

1
A meno che tu non riesca a trovare un modo per segnare veramente le persone esattamente in base al loro talento, la precisione dell'algoritmo non è probabilmente così importante. Con il problema a portata di mano, abbiamo solo un punteggio di squadra e una manciata di prove. Qualsiasi valutazione del giocatore sarà una stima selvaggia.
Gort the Robot

0

Quanto ridicolo vuoi ottenere? Puoi sempre utilizzare la regressione lineare multipla per generare coefficienti per ciascun giocatore in base ai punteggi delle loro squadre nelle partite precedenti. Quindi ordinare l'elenco e selezionare.

In realtà, probabilmente non avrebbe funzionato in quanto non modellare la dinamica tra i giocatori, ma ti do un motivo per giocare con R . (<- vedi, l'ho tenuto legato alla programmazione)


1
Sto prendendo in considerazione la possibilità di presentare una domanda per evitare un'attività di 2 minuti due volte a settimana, costringendomi a dedicare quasi la stessa quantità di tempo alla registrazione dei risultati per calcoli futuri. Così abbastanza ridicolo immagino ...
Vegar

-1

Se vuoi che il tuo algoritmo sia ragionevolmente, i semplici algoritmi non lo taglieranno. Spesso ti daranno strani risultati

Dovrai scegliere qualcosa come ELO o il sistema Trueskill (ELO non funziona per i team senza modifiche).


1
Questo non è vero. Deve esserci un algoritmo che funzioni.
Dinamico
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.