Algoritmo de clasificación Elo

El algoritmo de calificación Elo es un algoritmo de calificación ampliamente utilizado que se utiliza para clasificar a los jugadores en muchos juegos competitivos. Los jugadores con una calificación ELO más alta tienen una mayor probabilidad de ganar un juego que un jugador con una calificación ELO más baja. Después de cada juego, se actualiza la calificación ELO de los jugadores. Si gana un jugador con una calificación ELO más alta, solo se transfieren unos pocos puntos del jugador con una calificación más baja. Sin embargo, si gana un jugador de menor calificación, los puntos transferidos de un jugador de mayor calificación son mucho mayores.

Planteamiento: P1: Probabilidad de ganar del jugador con rating2 P2: Probabilidad de ganar del jugador con rating1. P1 = (1.0 / (1.0 + pow(10, ((calificación1 – calificación2) / 400)))); P2 = (1.0 / (1.0 + pow(10, ((calificación2 – calificación1) / 400)))); Obviamente, P1 + P2 = 1. La clasificación del jugador se actualiza utilizando la fórmula que se indica a continuación: – clasificación 1 = clasificación 1 + K* (puntuación real – puntuación esperada); En la mayoría de los juegos, el «Puntaje real» es 0 o 1, lo que significa que el jugador gana o pierde. K es una constante. Si K tiene un valor más bajo, la calificación cambia en una pequeña fracción, pero si K tiene un valor más alto, los cambios en la calificación son significativos. Diferentes organizaciones establecen un valor diferente de K.

Ejemplo:

Supongamos que hay una partida en vivo en chess.com entre dos jugadores rating1 = 1200, rating2 = 1000; P1 = (1,0 / (1,0 + potencia(10, ((1000-1200) / 400)))) = 0,76 P2 = (1,0 / (1,0 + potencia(10, ((1200-1000) / 400)))) = 0.24 Y suponga constante K=30; CASO-1: Suponga que el jugador 1 gana: rating1 = rating1 + k*(real – esperado) = 1200+30(1 – 0.76) = 1207.2; rating2 = rating2 + k*(real – esperado) = 1000+30(0 – 0.24) = 992.8; Caso 2: suponga que el jugador 2 gana: rating1 = rating1 + k*(real – esperado) = 1200+30(0 – 0.76) = 1177.2; rating2 = rating2 + k*(real – esperado) = 1000+30(1 – 0.24) = 1022.8;

CPP

// CPP program for Elo Rating
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate the Probability
float Probability(int rating1, int rating2)
{
    return 1.0 * 1.0 / (1 + 1.0 *
           pow(10, 1.0 * (rating1 - rating2) / 400));
}
 
// Function to calculate Elo rating
// K is a constant.
// d determines whether Player A wins or Player B.
void EloRating(float Ra, float Rb, int K, bool d)
{ 
 
    // To calculate the Winning
    // Probability of Player B
    float Pb = Probability(Ra, Rb);
 
    // To calculate the Winning
    // Probability of Player A
    float Pa = Probability(Rb, Ra);
 
    // Case -1 When Player A wins
    // Updating the Elo Ratings
    if (d == 1) {
        Ra = Ra + K * (1 - Pa);
        Rb = Rb + K * (0 - Pb);
    }
 
    // Case -2 When Player B wins
    // Updating the Elo Ratings
    else {
        Ra = Ra + K * (0 - Pa);
        Rb = Rb + K * (1 - Pb);
    }
 
    cout << "Updated Ratings:-\n";
    cout << "Ra = " << Ra << " Rb = " << Rb;
}
 
int main()
{
    // Ra and Rb are current ELO ratings
    float Ra = 1200, Rb = 1000;
     
    int K = 30;
    bool d = 1;
    EloRating(Ra, Rb, K, d);
 
    return 0;
}

Java

// Java program to count rotationally
// equivalent rectangles with n unit
// squares
class GFG {
 
    // Function to calculate the Probability
    static float Probability(float rating1,
                               float rating2)
    {
        return 1.0f * 1.0f / (1 + 1.0f *
                (float)(Math.pow(10, 1.0f *
               (rating1 - rating2) / 400)));
    }
     
    // Function to calculate Elo rating
    // K is a constant.
    // d determines whether Player A wins
    // or Player B.
    static void EloRating(float Ra, float Rb,
                            int K, boolean d)
    {
     
        // To calculate the Winning
        // Probability of Player B
        float Pb = Probability(Ra, Rb);
     
        // To calculate the Winning
        // Probability of Player A
        float Pa = Probability(Rb, Ra);
     
        // Case -1 When Player A wins
        // Updating the Elo Ratings
        if (d == true) {
            Ra = Ra + K * (1 - Pa);
            Rb = Rb + K * (0 - Pb);
        }
     
        // Case -2 When Player B wins
        // Updating the Elo Ratings
        else {
            Ra = Ra + K * (0 - Pa);
            Rb = Rb + K * (1 - Pb);
        }
     
        System.out.print("Updated Ratings:-\n");
         
        System.out.print("Ra = " + (Math.round(
                   Ra * 1000000.0) / 1000000.0)
                     + " Rb = " + Math.round(Rb
                      * 1000000.0) / 1000000.0);
    }
     
    //driver code
    public static void main (String[] args)
    {
         
        // Ra and Rb are current ELO ratings
        float Ra = 1200, Rb = 1000;
         
        int K = 30;
        boolean d = true;
         
        EloRating(Ra, Rb, K, d);
    }
}
 
// This code is contributed by Anant Agarwal.

Python3

# Python 3 program for Elo Rating
import math
 
# Function to calculate the Probability
def Probability(rating1, rating2):
 
    return 1.0 * 1.0 / (1 + 1.0 * math.pow(10, 1.0 * (rating1 - rating2) / 400))
 
 
# Function to calculate Elo rating
# K is a constant.
# d determines whether
# Player A wins or Player B.
def EloRating(Ra, Rb, K, d):
  
 
    # To calculate the Winning
    # Probability of Player B
    Pb = Probability(Ra, Rb)
 
    # To calculate the Winning
    # Probability of Player A
    Pa = Probability(Rb, Ra)
 
    # Case -1 When Player A wins
    # Updating the Elo Ratings
    if (d == 1) :
        Ra = Ra + K * (1 - Pa)
        Rb = Rb + K * (0 - Pb)
     
 
    # Case -2 When Player B wins
    # Updating the Elo Ratings
    else :
        Ra = Ra + K * (0 - Pa)
        Rb = Rb + K * (1 - Pb)
     
 
    print("Updated Ratings:-")
    print("Ra =", round(Ra, 6)," Rb =", round(Rb, 6))
 
# Driver code
 
# Ra and Rb are current ELO ratings
Ra = 1200
Rb = 1000
K = 30
d = 1
EloRating(Ra, Rb, K, d)
 
# This code is contributed by
# Smitha Dinesh Semwal

C#

// C# program to count rotationally equivalent
// rectangles with n unit squares
using System;
 
class GFG {
     
    // Function to calculate the Probability
    static float Probability(float rating1,
                                 float rating2)
    {
        return 1.0f * 1.0f / (1 + 1.0f *
               (float)(Math.Pow(10, 1.0f *
                 (rating1 - rating2) / 400)));
    }
      
    // Function to calculate Elo rating
    // K is a constant.
    // d determines whether Player A wins or
    // Player B.
    static void EloRating(float Ra, float Rb,
                                int K, bool d)
    { 
      
        // To calculate the Winning
        // Probability of Player B
        float Pb = Probability(Ra, Rb);
      
        // To calculate the Winning
        // Probability of Player A
        float Pa = Probability(Rb, Ra);
      
        // Case -1 When Player A wins
        // Updating the Elo Ratings
        if (d == true) {
            Ra = Ra + K * (1 - Pa);
            Rb = Rb + K * (0 - Pb);
        }
      
        // Case -2 When Player B wins
        // Updating the Elo Ratings
        else {
            Ra = Ra + K * (0 - Pa);
            Rb = Rb + K * (1 - Pb);
        }
      
        Console.Write("Updated Ratings:-\n");
         
        Console.Write("Ra = " + (Math.Round(Ra
                     * 1000000.0) / 1000000.0)
                    + " Rb = " + Math.Round(Rb
                     * 1000000.0) / 1000000.0);
    }
     
    //driver code
    public static void Main()
    {
         
        // Ra and Rb are current ELO ratings
        float Ra = 1200, Rb = 1000;
          
        int K = 30;
        bool d = true;
        EloRating(Ra, Rb, K, d);
    }
}
 
// This code is contributed by Anant Agarwal.

Javascript

<script>
// Javascript program for Elo Rating
 
// Function to calculate the Probability
function Probability(rating1, rating2) {
  return (
    (1.0 * 1.0) / (1 + 1.0 * Math.pow(10, (1.0 * (rating1 - rating2)) / 400))
  );
}
 
// Function to calculate Elo rating
// K is a constant.
// d determines whether Player A wins
// or Player B.
function EloRating(Ra, Rb, K, d) {
  // To calculate the Winning
  // Probability of Player B
  let Pb = Probability(Ra, Rb);
 
  // To calculate the Winning
  // Probability of Player A
  let Pa = Probability(Rb, Ra);
 
  // Case 1 When Player A wins
  // Updating the Elo Ratings
  if (d === true) {
    Ra = Ra + K * (1 - Pa);
    Rb = Rb + K * (0 - Pb);
  }
 
  // Case 2 When Player B wins
  // Updating the Elo Ratings
  else {
    Ra = Ra + K * (0 - Pa);
    Rb = Rb + K * (1 - Pb);
  }
 
  document.write("Updated Ratings:-<br>");
  document.write(
    "Ra = " +
      Math.round(Ra * 1000000.0) / 1000000.0 +
      " Rb = " +
      Math.round(Rb * 1000000.0) / 1000000.0
  );
}
 
// Ra and Rb are current ELO ratings
const Ra = 1200;
const Rb = 1000;
 
const K = 30;
const d = true;
 
EloRating(Ra, Rb, K, d);
 
// This code is contributed by Vishal Vilas Shinde.
</script>

Producción:

Updated Ratings:-
Ra = 1207.207642 Rb = 992.792419

Complejidad del tiempo La complejidad del tiempo del algoritmo depende principalmente de la complejidad de la función pow, cuya complejidad depende de la arquitectura de la computadora. En x86, esta es una operación de tiempo constante:-O(1) Referencias http://www.gautamnarula.com/rating/

Publicación traducida automáticamente

Artículo escrito por gaurav _purohit y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *