Sono stato gentilmente fornito questo algoritmo per aiutarmi a creare un elenco di fixture in SQL, ma applicandolo come codice SQL, non ho idea di come fare. C'è un modo in cui qualcuno può guidarmi su come applicarlo con il codice?Come codificare un determinato algoritmo matematico
Qui di seguito è il mio schema di tabelle e sotto che è l'algoritmo:
League:
[LeagueID] TINYINT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[LeagueName] VARCHAR(30) UNIQUE
della squadra:
[TeamID] TINYINT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[TeamAbbreviation] CHAR(3) UNIQUE,
[TeamName] VARCHAR(50) UNIQUE,
[LeagueID] TINYINT CONSTRAINT FK_Team_League FOREIGN KEY REFERENCES League(LeagueID)
Fixture:
[FixtureID] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[WeekNumber] INT NOT NULL,
[FixtureDate] DATE NULL,
[HomeTeamID] TINYINT NULL,
[AwayTeamID] TINYINT NULL,
[LeagueID] TINYINT CONSTRAINT FK_Fixture_League FOREIGN KEY REFERENCES League(LeagueID)
ALGORITMO:
Consente a tradurre l'algoritmo, chiamato round robin scheduling, in termini di una lista ordinata l
delle squadre N (che corrispondono a N-1 poligono vertici + il centro del poligono):
l
definisce infissi giocando la prima squadra dalla lista contro l'ultima, la seconda contro la prima prima, ecc.
Cioè, per0 ≤ x < N
, si gioca la squadral[x]
contro la squadral[N-1-x]
.Per generare il set successivo di dispositivi, si ruotano i primi elementi dell'elenco
N-1
.
Questo èl = l[1] + l[2] + ... + l[N-2] + l[0] + l[N-1]
Una volta fatto il set completo di
N-1
rotazioni, farlo di nuovo, ma lo scambio di casa e in trasferta le squadre: giocheràl[N-1-x]
vs squadral[x]
anziché il contrario.
Se si inizia con l'elenco numerico ordinato 0..N-1
poi alla rotonda i
la lista è: l = [(i + 0) % (N-1)] + [(i + 1) % (N-1)] + ... + [(i + N-2) % (N-1)] + [N-1]
Cioè, infissi sono a turno i
:
i
vsN-1
- Per
0 < x < (N-1)/2
,(x + i) % (N-1)
vs(N-1 - x + i) % (N-1)
Ora c'è un trucco, in quanto questo funziona solo per i numeri pari. Altrimenti l'ultima squadra gioca sempre (contro la squadra i
al turno i
) mentre naturalmente ogni turno ha una squadra che non può giocare. Ciò significherebbe che la squadra 4 gioca una partita in più rispetto alle altre squadre.
Per risolvere questo problema, abbiamo aggiungiamo un team fittizio, quindi per 5 squadre abbiamo N = 6
, e al giro i
:
i
vs5
(la squadra fittizio)(i + 1) % 4
vs(4 + i) % 4
(i + 2) % 4
vs(3 + i) % 4
Ora che lo sai, puoi generare una funzione che ti darà fixture basate sul numero tondo. Esso deve emettere il seguente:
turno 0: 0 resti, 1 vs 4, 2 vs 3
rotonda 1: 1 resti, 2 vs 0, 3 vs 4
rotondo 2: 2 pause, 3 vs 1, 4 vs 0
rotondo 3: 3 resti, 4 vs 2, 0 vs 1
rotondo 4: 4 resti, 0 vs 3, 1 vs 2
Nota che invece di i
in le formule x + i
e N-1 - x + i
è possibile utilizzare qualsiasi multiplo m * i
(quindi x + m * i
e N-1 - x + m * i
) fino a m
e N-1
e relatively prime. Qui N - 1 = 5
è primo, quindi puoi utilizzare qualsiasi m
che desideri.
UPDATE:
Come necessario sotto è te testare dati per prima la classifica e secondo la tabella squadre (corrispondenti colonne di schema tabella in ordine)
campionato:
1, 'English Premiership'
2, 'English Division 1'
Squadre:
1, 'BCN', 'FC Barcelona', 1
2, 'MAD', 'Real Madrid', 1
3, 'ATH', 'Athletico Madrid', 1
4, 'ESP', 'Espanyol', 1
5, 'MAN', 'Manchester United', 2
6, 'BOL', 'Bolton', 2
7, 'CHE', 'Chelsea', 2
8, 'ARS', 'Arsenal', 2
squadre giocano tra loro casa e in trasferta e può giocare solo contro le squadre che si trovano nella stessa lega (da qui le varie LeagueIDs)
Le partite dovrebbero essere come questo per ogni turno:
League 1:
Round 1- 01/05/2016:
1v4, 2v3
Round 2- 08/05/2016:
1v2, 3v4
Round 3- 15/05/2016:
3v1, 4v2
Round 4- 22/05/2016:
4v1, 3v2
Round 5- 29/05/2016:
2v1, 4v3
Round 6- 05/06/2016:
1v3, 2v4
League 2:
Round 1- 01/05/2016:
5v8, 6v7
Round 2- 08/05/2016:
5v6, 7v8
Round 3- 15/05/2016:
3v1, 4v2
Round 4- 22/05/2016:
8v5, 7v6
Round 5- 29/05/2016:
6v5, 8v7
Round 6- 05/06/2016:
5v7, 6v8
- League numero è numero tondo 'LeagueID'
- è 'WeekNumber'
- Data è 'Data Fixture'
- numero squadra di casa è 'HomeTeamID'
- Il numero di squadra assente è "AwayTeamID"
Questo dovrebbe essere inserito nella tabella "Fixture".
Ora che è come un domanda dovrebbe essere posta. –
semplicemente collegandoti alla tua domanda precedente: http://stackoverflow.com/questions/37610060/creating-a-fixture-list-logic – Tanner
@Tanner Cool, sì il problema con quell'approccio precedente era anche se mostrava correttamente le squadre , ha avuto problemi a visualizzare i numeri settimanali corretti per round di partite. In questo modo l'utilizzo di un algoritmo aiuterà a risolvere il problema della settimana, ma è un percorso completamente nuovo e più matematico. –