Hai bisogno di aiuto per identificare un algoritmo di programmazione della lega


9

Sto cercando di creare un programmatore di campionati sportivi. Ho difficoltà a identificare un algoritmo per aiutarmi a riempire in modo efficiente ogni slot.

I dati di esempio per costruire il programma sarebbero:

  1. 10 squadre
  2. Ogni squadra si gioca 1 volta (sono necessari 45 giochi in totale)
  3. Ogni squadra gioca non più di 1 volta al giorno
  4. Nei miei test sto usando 9 giorni con 5 slot al giorno.

Tabella combinata (contiene 45 combo)

ID
Team1ID
Team2ID
bitAssigned

Tabella degli orari (contiene 45 fasce orarie)

scheduleID
homeTeamID
awayTeamID
GameDate
GameTime

In questo momento le mie procedure esistenti riempiono circa il 90% delle slot lasciando il 10% delle mie slot vuote in un conflitto di pianificazione basato sulle regole di cui sopra.

Ciclo sopra la mia tabella di programma in ordine crescente di data / ora.
La mia prima slot potrebbe essere sabato alle 8 del mattino.
Richiedo un elenco di team che non sono stati ancora programmati. Quindi creo una serie di possibili combinazioni di quelle squadre. Quindi uso quell'array per estrarre 1 record casuale dalla mia tabella delle combinazioni delle combinazioni che non sono state ancora programmate e inserisco quelle squadre nel programma. Ho quindi impostato quella combinazione come utilizzata.

Ripeto ripetutamente il loop e ogni volta il mio elenco di team disponibili diventa più piccolo e anche il mio array risulta più piccolo.

Sto scoprendo che alcuni giorni vanno bene e in altri giorni le mie ultime 2 squadre rimaste hanno già giocato in una settimana precedente, quindi non vengono nuovamente aggiunte al programma.

L'unica cosa che non ho ancora provato è "resettare" i giorni di conflitto e riprovarli per vedere se ottengo posizionamenti migliori.

Qualcuno ha qualche suggerimento?


5
programmazione dei tornei round-robin
kevin cline,

grazie Kevin. destra. Sembra che in questo momento il mio array inizi sempre nello stesso punto e non vi sia alcuna rotazione, quindi nessun flusso ordinato per accoppiare le squadre.
steve l'

1
Uso un approccio completamente casuale. Scegli casualmente uno slot e due squadre. Se le regole sono soddisfatte, programmare il gioco. In caso contrario, scartare e riprovare. Ho impostato un limite per i tentativi totali e se il limite viene raggiunto, scartare l'intero programma e ricominciare. In realtà funziona abbastanza bene nella pratica.
Cerad,

Ho finito per andare e seguire l'approccio round robin. Ho finito il 95% di scrivere lo script per connettermi al DB, ma nei test sembra che funzioni senza intoppi ed equilibrato. Sto trattando le mie giornate come "giri" e stanno bene ed equilibrate. Posso giocare i miei round in qualsiasi ordine e mettere i giochi per ogni round in qualsiasi ordine, ma spostare un gioco da un round all'altro alla fine infrange le regole.
steve,

Risposte:


5

Ecco un algoritmo che mi sono inventato. Non so se esiste già o in realtà è l'implementazione 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

praticamente inizi con

rotazione foto

e mantieni sempre 1 nella stessa posizione e ruota il resto.

In questo modo otterrai sempre un programma di partite uniche. Questo è estremamente facile da implementare e scalare con qualsiasi numero di avversari, pari o irregolare. Se hai un numero irregolare di avversari, non posizionare una squadra in 1 posizione e hanno un round gratuito.


2
come gestite i saldi tra casa e fuori casa?
Eric Cope,

In realtà non funziona: in questo semplice algoritmo di rotazione, le squadre rotanti distanti 2 slot (2/4, 3/5) non giocheranno mai.
mdryden,

@mdryden funziona. Controllalo meglio e rimuovi il tuo commento.
Pieter B,

@PieterB Pensavo che avrebbe funzionato, ma in realtà non funziona se ci sono un numero dispari di squadre, poiché quelle che si trovano una accanto all'altra (come 4 e 5) non si giocheranno mai. Puoi vederlo abbastanza facilmente alla fine con l'1 e anche dall'altra parte perché hai la squadra penzolante (con il ciao) Ecco una buona risposta che si occupa anche del numero dispari: stackoverflow.com/a/6649732/ 6489306
ragingasiancoder

@ragingasiancoder se c'è un numero dispari di squadre, aggiungi una squadra fittizia. La risposta che hai collegato descrive la stessa identica soluzione che ho presentato.
Pieter B,

1

Penso che lo stia facendo al contrario. Non iniziare con la tabella dei programmi, inizia con una tabella / matrice / qualunque delle combinazioni di gioco (i 45 giochi). Da lì, è un semplice processo per assegnare le partite a un giorno, basato su una squadra che gioca solo una volta al giorno. E poiché i matchup si verificano solo una volta (la Squadra A gioca solo una volta nella Squadra B), la programmazione è facile perché devi solo assicurarti che il matchup non sia già avvenuto (le voci sono "uniche" in quel modo).


1

Di seguito ho generato il programma di round robin a 10 squadre singole. Mi ci sono voluti circa 3 minuti.

Informazioni sull'orario:

10 squadre - 1 round robin (vengono visualizzate solo le prime 6 settimane)
Data inizio stagione 1/6/15 - data fine 3/5/15
2 partite ogni martedì, 3 partite ogni giovedì, 5 partite ogni settimana nessuna data salta

  • Tutte le squadre sono distribuite per giocare equamente nelle 5 fasce orarie.
  • Tutti giocano 9 giochi.
  • Si giocano tutti una volta.
  • Tutti sono distribuiti uniformemente come home e visitatore (5/5 o 4/5). Nota: alla fine del round robin 2 tutte le squadre giocano 18 partite (9 come da casa e 9 come visitatore) e tutte le squadre hanno 2 Bye.
  • Tutti sono distribuiti per giocare in modo uniforme nelle 5 fasce orarie ogni settimana.

Abbiamo usato un computer con telaio principale Honeywell obsoleto e poco meno di 3 anni per mettere insieme tutto. Una volta eseguito il debug del nostro software di pianificazione, ci sono volute molte ore al computer del frame principale alla ricerca di milioni di permutazioni e combinazioni per calcolare e creare schemi bilanciati per 4 o 22 team che stavamo cercando.

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 

Non esiste un algoritmo che risolva i problemi di pianificazione generali associati a centinaia o migliaia di diversi tipi di campionati, sport e situazioni potenziali. Quello che abbiamo fatto per risolvere questo problema è stato quello di adottare un approccio diverso per calcolare i programmi. Si inizia con la matematica molto complessa per determinare gli accoppiamenti delle squadre di round robin (match-up), ma quello era solo l'inizio. Altri pezzi sono necessari per creare un utile programma bilanciato che può essere pubblicato e distribuito. Giocatori, allenatori, genitori, ecc., Devono tutti sapere non solo chi stanno giocando ; ma dove stanno giocando ; a che ora stanno giocando ; se sono a casa o visitatori ; e per molti campionati, un numero di gioco .

Spero che questo aiuti te e gli altri a capire cosa ci sono voluti 3 anni per capire.

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.