fix: seed darts bracket by Elo instead of world ranking
World ranking (PDC Order of Merit) is prize-money-based and can diverge from current skill — e.g. Kevin Doets (1818 Elo) was ranked 35th while Joe Cullen (1667 Elo) held the 32nd seed. Seeding the weaker player and leaving the stronger one unseeded contradicts the Elo-based match model. Seeding by Elo descending ensures the 32 strongest players (by the same metric used to compute match probabilities) get protected bracket positions. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
d5c39d3270
commit
2387173cf5
1 changed files with 9 additions and 12 deletions
|
|
@ -29,7 +29,7 @@
|
||||||
* Final: best-of-13 sets, first to 7
|
* Final: best-of-13 sets, first to 7
|
||||||
*
|
*
|
||||||
* Seeding (pre-bracket path):
|
* Seeding (pre-bracket path):
|
||||||
* Top 32 players (by world ranking) are seeded into fixed bracket positions
|
* Top 32 players (by Elo, descending) are seeded into fixed bracket positions
|
||||||
* using the standard balanced bracket structure:
|
* using the standard balanced bracket structure:
|
||||||
* R1 seeds: 1v32, 16v17, 9v24, 8v25 (top half) + 5v28, 12v21, 13v20, 4v29
|
* R1 seeds: 1v32, 16v17, 9v24, 8v25 (top half) + 5v28, 12v21, 13v20, 4v29
|
||||||
* 3v30, 14v19, 11v22, 6v27 (bottom half) + 7v26, 10v23, 15v18, 2v31
|
* 3v30, 14v19, 11v22, 6v27 (bottom half) + 7v26, 10v23, 15v18, 2v31
|
||||||
|
|
@ -468,17 +468,14 @@ export class DartsSimulator implements Simulator {
|
||||||
// the seeded tour players.
|
// the seeded tour players.
|
||||||
const fallbackElo = 1400;
|
const fallbackElo = 1400;
|
||||||
|
|
||||||
// Sort participants by world ranking (ascending). Fall back to Elo order (descending) for
|
// Seed by Elo descending — the top 32 strongest players (by Elo) get protected
|
||||||
// any without a ranking, then alphabetical as a final tiebreak.
|
// bracket positions. World ranking (PDC Order of Merit) is prize-money-based and
|
||||||
const sorted = [...allParticipants].toSorted((a, b) => {
|
// can diverge from current skill; a player ranked 35th by earnings might have a
|
||||||
const rankA = rankingMap.get(a.id);
|
// higher Elo than someone ranked 28th. Using Elo for seeding keeps the bracket
|
||||||
const rankB = rankingMap.get(b.id);
|
// consistent with the Elo-based match simulation.
|
||||||
if (rankA !== undefined && rankB !== undefined) return rankA - rankB;
|
const sorted = [...allParticipants].toSorted((a, b) =>
|
||||||
if (rankA !== undefined) return -1; // ranked before unranked
|
(eloMap.get(b.id) ?? fallbackElo) - (eloMap.get(a.id) ?? fallbackElo)
|
||||||
if (rankB !== undefined) return 1;
|
);
|
||||||
// Both unranked — sort by Elo descending
|
|
||||||
return (eloMap.get(b.id) ?? fallbackElo) - (eloMap.get(a.id) ?? fallbackElo);
|
|
||||||
});
|
|
||||||
|
|
||||||
const topSeeds = sorted.slice(0, TOP_SEEDS).map((p) => p.id); // seeds 1–32
|
const topSeeds = sorted.slice(0, TOP_SEEDS).map((p) => p.id); // seeds 1–32
|
||||||
const unseeded = sorted.slice(TOP_SEEDS).map((p) => p.id); // remaining players
|
const unseeded = sorted.slice(TOP_SEEDS).map((p) => p.id); // remaining players
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue