From 6edc89ca7aad2517139fe64449647ba2904c977d Mon Sep 17 00:00:00 2001 From: Anton Micke Date: Mon, 24 Mar 2025 15:25:45 +0100 Subject: [PATCH] Update 2 vs 2 Elo calculation --- .../service/EloCalculationService.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/kickerelo/kickerelo/service/EloCalculationService.java b/src/main/java/org/kickerelo/kickerelo/service/EloCalculationService.java index a702e88..90d530c 100644 --- a/src/main/java/org/kickerelo/kickerelo/service/EloCalculationService.java +++ b/src/main/java/org/kickerelo/kickerelo/service/EloCalculationService.java @@ -39,10 +39,27 @@ public class EloCalculationService { * @param toreVerlierer The number of goals of the losing teams */ public void updateElo2vs2(Spieler gewinnerVorn, Spieler gewinnerHinten, Spieler verliererVorn, Spieler verliererHinten, short toreVerlierer) { - gewinnerVorn.setElo2vs2(gewinnerVorn.getElo2vs2() + 10 - toreVerlierer); - gewinnerHinten.setElo2vs2(gewinnerHinten.getElo2vs2() + 10 - toreVerlierer); - verliererVorn.setElo2vs2(verliererVorn.getElo2vs2() - 10 + toreVerlierer); - verliererHinten.setElo2vs2(verliererHinten.getElo2vs2() - 10 + toreVerlierer); + final float baseK = 100; + final double adjustedK = baseK * (1 - (0.1 * toreVerlierer)); + var totalWinnerElo = gewinnerVorn.getElo2vs2() + gewinnerHinten.getElo2vs2(); + var totalLoserElo = verliererVorn.getElo2vs2() + verliererHinten.getElo2vs2(); + var eloDifference = totalWinnerElo - totalLoserElo; + var winnerProbability = 1 / (1 + Math.pow(10, -eloDifference / 500)); + + var winner1Contribution = gewinnerVorn.getElo2vs2() / totalWinnerElo; + var winner2Contribution = gewinnerHinten.getElo2vs2() / totalWinnerElo; + var loser1Contribution = verliererVorn.getElo2vs2() / totalLoserElo; + var loser2Contribution = verliererHinten.getElo2vs2() / totalLoserElo; + + var winner1EloChange = adjustedK * winner1Contribution * (1 - winnerProbability); + var winner2EloChange = adjustedK * winner2Contribution * (1 - winnerProbability); + var loser1EloChange = adjustedK * loser1Contribution * (0 - (1 - winnerProbability)); + var loser2EloChange = adjustedK * loser2Contribution * (0 - (1 - winnerProbability)); + + gewinnerVorn.setElo2vs2((float) (gewinnerVorn.getElo2vs2() + winner1EloChange)); + gewinnerHinten.setElo2vs2((float) (gewinnerHinten.getElo2vs2() + winner2EloChange)); + verliererVorn.setElo2vs2((float) (verliererVorn.getElo2vs2() + loser1EloChange)); + verliererHinten.setElo2vs2((float) (verliererHinten.getElo2vs2() + loser2EloChange)); } public float getInitialElo1vs1() {