Рейтинг: выбывшие между собой не сравниваются
Решение владельца: в партии все выбывшие проиграли и одинаково слабы, миров у них нет, поэтому пара двух выбывших в сумму не входит — ни S − E, ни множитель отрыва. Пары с невыбывшими считаются как прежде, нормировка на N − 1 тоже: при равных рейтингах результат не меняется. Слабый выбывший больше не получает рейтинг за счёт сильных выбывших. Эталон — флаг skip_eliminated_pairs у предложенной системы; документ: 4.3, 4.4, 4.9, пример 5, итоги 7.3 пересчитаны (сдвиг в третьем знаке), решение 8 в разделе 9; справка. #91 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
This commit is contained in:
@@ -93,6 +93,9 @@ class Params:
|
||||
m_min: float = 0.5
|
||||
m_max: float = 2.0
|
||||
autocorr: bool = False # поправка на автокорреляцию (см. документ)
|
||||
# Выбывшие между собой не сравниваются: пара двух выбывших не входит в сумму
|
||||
# (решение владельца, #91). У систем для сравнения — как было.
|
||||
skip_eliminated_pairs: bool = False
|
||||
|
||||
def closeness_for(self, reason: str | None) -> float:
|
||||
return dict(self.closeness).get(reason, 1.0) if reason else 1.0
|
||||
@@ -181,6 +184,8 @@ def rate_match(
|
||||
k = {s.player: k_factor(games.get(s.player, 0), p) for s in m.seats}
|
||||
delta = {s.player: 0.0 for s in m.seats}
|
||||
for a, b in combinations(m.seats, 2):
|
||||
if p.skip_eliminated_pairs and a.eliminated and b.eliminated:
|
||||
continue
|
||||
if a.place > b.place:
|
||||
a, b = b, a
|
||||
s_ab = 0.5 if a.place == b.place else 1.0
|
||||
@@ -550,6 +555,7 @@ PROPOSED = Params(
|
||||
w_obj=0.5,
|
||||
w_worlds=0.5,
|
||||
closeness=CLOSENESS,
|
||||
skip_eliminated_pairs=True,
|
||||
)
|
||||
|
||||
|
||||
@@ -594,7 +600,7 @@ def examples() -> list[tuple[str, str, dict, dict, Match]]:
|
||||
("4e", "Разгром: 3-й раунд, 2:0 цели, 8:2 миров",
|
||||
{"A": 1500, "B": 1500}, _vets("A", "B"),
|
||||
Match([Seat("A", 1, 2, 8), Seat("B", 2, 0, 2)], "objectives", round=3)),
|
||||
("5", "Стол на 4: ничья выбывших, раунд 7",
|
||||
("5", "Стол на 4: двое выбывших, раунд 7",
|
||||
{"A": 1550, "B": 1500, "C": 1480, "D": 1450}, _vets(*"ABCD"),
|
||||
Match(
|
||||
[Seat("A", 1, 4, 8), Seat("B", 2, 3, 7),
|
||||
@@ -625,7 +631,7 @@ EXPECTED: dict[str, dict[str, float]] = {
|
||||
"4c": {"A": 4.8, "B": -4.8},
|
||||
"4d": {"A": 3.4, "B": -3.4},
|
||||
"4e": {"A": 16.0, "B": -16.0},
|
||||
"5": {"A": 9.27, "B": 5.85, "C": -7.78, "D": -7.35},
|
||||
"5": {"A": 9.27, "B": 5.85, "C": -7.6, "D": -7.53},
|
||||
"6a": {"A": 12.0, "B": 7.2, "C": 2.4, "D": -2.4, "E": -7.2, "F": -12.0},
|
||||
"6b": {"A": 10.29, "B": 7.54, "C": 2.74, "D": -2.06, "E": -6.86, "F": -11.66},
|
||||
"7": {"A": 32.0, "B": -8.0},
|
||||
|
||||
Reference in New Issue
Block a user