Golf-rangeringssystem: Teknisk & Funktionel Oversigt
Dette dokument giver en detaljeret forklaring af golf-rangeringssystemet. Det dækker den funktionelle logik bag rangeringerne, den tekniske implementering i databasen og eksempler til at illustrere nøglekoncepter.
1. Funktionel Oversigt
Rangeringssystemet er en dynamisk, pointbaseret metode til evaluering af spillerpræstationer. En spillers rang bestemmes af deres Gennemsnitspoint, som beregnes ud fra deres præstationer i turneringer over en rullende toårig periode. For at sikre, at nylige præstationer har større indflydelse, er point optjent fra ældre turneringer underlagt en forfaldsmekanisme. Systemet er designet til at være retfærdigt for alle spillere, uanset om de spiller hyppigt eller ej, ved brug af en minimumsdivisor.
2. Kerneberegningskoncepter Forklaret
2.1. Det Rullende 104-Ugers Vindue
Rangeringssystemet fungerer ikke på en fast sæson; i stedet bruger det et 104-ugers (2-årigt) rullende vindue. Det betyder, at på et givet tidspunkt er de eneste turneringer, der bidrager til en spillers rangering, dem, der blev spillet i de umiddelbart foregående 104 uger. Hver uge, når en ny uge begynder, droppes den ældste uge i vinduet. Dette sikrer, at rangeringen altid er en afspejling af en spillers aktuelle form over de sidste to år.
2.2. Pointforfald: Belønning af Nylig Form
Pointforfald er en kritisk funktion, der giver mere vægt til nylige resultater. Sådan fungerer det:
- Fuld Værdi Periode (13 Uger): I de første 13 uger efter en turnering er spillet, bevarer de point, en spiller optjener, deres fulde, 100% værdi.
- Lineær Forfaldsperiode (Uge 14-104): Efter den 13-ugers henstandsperiode begynder pointene at miste værdi i en lige linje (lineært). Forfaldet sker over de resterende 91 uger af rangeringsvinduet. Hver uge mister pointene cirka 1,099% af deres oprindelige værdi (1/91-del).
- Slutningen af Vinduet: Når en turnering er 104 uger gammel, bliver dens pointværdi nul, og den bidrager ikke længere til en spillers rangering.
Eksempel på Forfald:
Forestil dig, at en spiller optjener 50 point i en turnering. Rangeringen beregnes for 31. dec. 2023.
- Turnering A (1. dec. 2023): 4 uger gammel. Den er i fuld-værdi perioden. Bidrag: 50 point (100% værdi).
- Turnering B (4. juni 2023): 30 uger gammel. Den er i forfaldsperioden.
- Uger inde i forfald: 30 - 13 = 17 uger.
- Forfaldsformel:
1 - ((UgerGamle - FuldUger) / (VindueUger - FuldUger))
- Vægt:
1 - ((30 - 13) / (104 - 13)) = 1 - (17 / 91) ≈ 0.813
- Effektive Point:
50 * 0.813 = 40.65 point.
2.3. Den Årlige "Ultimo" (Årsafslutningssnapshot)
Mens den primære rangering er "live" og rullende, er TakeYearEndSnapshot-proceduren designet til at fange en definitiv rangering ved udgangen af hvert kalenderår (31. december). Dette tjener flere formål:
- Historisk Arkiv: Det skaber en permanent optegnelse over spillerrangeringer, hvilket er afgørende for historisk analyse, årsafslutningspriser og sporing af spillerudvikling over årene.
- Kvalifikationskriterier: Disse årsafslutningsrangeringer kan bruges som en officiel målestok for sæsonafsluttende kvalifikationer eller hædersbevisninger.
- Dataintegritet: Det giver et stabilt, ikke-rullende referencepunkt for dataanalyse og rapportering.
Denne proces udføres én gang for et givet år og gemmer resultaterne i dbo.RankingSnapshots-tabellen, hvilket sikrer, at historiske data aldrig går tabt, når det rullende vindue bevæger sig fremad.
3. Turneringspoint & Styrke af Feltet (SOF)
Antallet af point, en spiller optjener fra en enkelt turnering, er ikke fast. Det afhænger af turneringens prestige og, vigtigst af alt, kvaliteten af de spillere, der konkurrerer i den. Bemærk: Logikken for SOF og turneringsbasepoint bestemmes, før dataene indgår i rangeringssystemet; SQL-funktionerne, der vises senere, opererer på de resulterende point.
3.1. Styrke af Feltet (SOF)
Styrken af Feltet (SOF) er en numerisk værdi, der repræsenterer kvaliteten af feltet i en turnering. En højere SOF betyder, at der er flere rangeringspoint at vinde. Selvom den nøjagtige formel kan variere, beregnes den typisk ud fra de præ-turneringsrangeringer af de spillere, der konkurrerer. For eksempel kan en turnerings SOF være afledt af:
- Antallet af top-10 rangerede spillere i feltet.
- Antallet af top-50 rangerede spillere i feltet.
- De kumulative rangeringspoint for alle spillere i feltet.
En høj SOF sikrer, at det at vinde en turnering mod verdens bedste spillere belønnes kraftigere end at vinde mod et svagere felt.
3.2. Turneringsniveauer og Basepoint
Turneringer er ofte kategoriseret i niveauer, hvilket bestemmer et minimums- eller baseantal point, der er tilgængelige, uanset SOF. Denne struktur garanterer, at prestigefyldte begivenheder altid har betydelig vægt.
- Majors: Disse er de mest prestigefyldte begivenheder og er garanteret de højeste pointtotaler (f.eks. 100 point til vinderen), ofte uanset SOF.
- Mesterskaber/Invitationsbegivenheder: Disse begivenheder udgør det næste niveau og har en høj basepoint-værdi.
- Regulære Tour-begivenheder: Disse udgør størstedelen af programmet. Deres samlede pointpulje er stærkt afhængig af SOF.
De endelige point, der tildeles ved en begivenhed, er en kombination af dens niveaus basisværdi og dens beregnede SOF. Disse point fordeles derefter til spillerne baseret på deres slutposition, hvor vinderen modtager den største andel.
4. Tekniske Detaljer
Rangeringssystemet er implementeret gennem et sæt SQL-databaseobjekter, herunder funktioner, en tabel til at gemme historiske snapshots og en lagret procedure til at udføre rangeringsberegningerne.
4.1. Databasefunktioner
dbo.GetRankingParams()
Denne funktion centraliserer de vigtigste parametre i rangeringssystemet, hvilket gør dem nemme at justere.
CREATE OR ALTER FUNCTION dbo.GetRankingParams()
RETURNS TABLE
AS RETURN
SELECT
CAST(104 AS int) AS WindowWeeks,
CAST(13 AS int) AS FullWeeks,
CAST(6 AS int) AS MinDivisor;
dbo.DecayWeight(@EventDate, @AsOfDate)
Beregner forfaldsvægten (fra 0,0 til 1,0) af point fra en turnering baseret på dens dato i forhold til rangeringsberegningsdatoen (@AsOfDate).
CREATE OR ALTER FUNCTION dbo.DecayWeight(@EventDate date, @AsOfDate date)
RETURNS decimal(9,6)
AS
BEGIN
DECLARE @w int = (SELECT WindowWeeks FROM dbo.GetRankingParams());
DECLARE @f int = (SELECT FullWeeks FROM dbo.GetRankingParams());
DECLARE @weeks int = DATEDIFF(WEEK, @EventDate, @AsOfDate);
IF @weeks < 0 RETURN 0.0;
IF @weeks >= @w RETURN 0.0;
IF @weeks <= @f RETURN 1.0;
RETURN CAST(1.0 - ((@weeks - @f) * 1.0) / (@w - @f) AS decimal(9,6));
END;
dbo.EffectiveContribution(...)
Beregner den faktiske pointværdi, der er bidraget med af et enkelt turneringsresultat efter anvendelse af forfald.
CREATE OR ALTER FUNCTION dbo.EffectiveContribution
(
@TournamentDateId int,
@ApplicationUserId nvarchar(450),
@AsOfDate date
)
RETURNS decimal(12,6)
AS
BEGIN
-- ... (Fuld funktionslogik) ...
END;
4.2. Rangeringssnapshot-tabel
dbo.RankingSnapshots
Denne tabel gemmer de historiske rangeringsdata, der genereres af årsafslutningsproceduren.
| Kolonnenavn |
Datatype |
Beskrivelse |
SnapshotDate |
date |
Datoen for hvilken rangeringen blev beregnet. En del af primærnøglen. |
ApplicationUserId |
nvarchar(450) |
Den unikke identifikator for spilleren. En del af primærnøglen. |
TotalPoints |
decimal(12,6) |
Summen af alle effektive (forfaldne) point for spilleren. |
EventsActual |
int |
Det faktiske antal begivenheder, spilleren deltog i under rangeringsvinduet. |
EventsDivisor |
int |
Divisoren, der bruges til at beregne gennemsnitspoint (enten EventsActual eller MinDivisor). |
AveragePoints |
decimal(12,6) |
De endelige gennemsnitspoint (TotalPoints / EventsDivisor), der bruges til rangering. |
RankDense |
int |
Spillerens endelige rang for snapshot-datoen, beregnet med DENSE_RANK. |
4.3. Lagret Procedure
dbo.TakeYearEndSnapshot(@Year)
Denne procedure orkestrerer hele rangeringsberegningen for et givet år og gemmer resultaterne i dbo.RankingSnapshots-tabellen.
CREATE OR ALTER PROCEDURE dbo.TakeYearEndSnapshot
@Year int
AS
BEGIN
-- ... (Fuld procedurelogik som angivet) ...
END;