Elo 평점 알고리즘이란?
Elo(엘로) 평점 알고리즘은 체스, 탁구, 각종 e스포츠 같은 대결형 경기에서 선수의 실력을 수치화하고 순위를 매기는 데 널리 쓰이는 레이팅 시스템입니다. 경기 결과에 따라 선수의 평점이 오르내리는데, 핵심은 단순히 승패만 보는 것이 아니라 두 선수 간의 평점 차이까지 함께 반영한다는 점입니다.
예를 들어 평점이 서로 다른 두 선수가 대결한다고 가정해 보겠습니다.
Player 1 vs Player 2
Player 1의 평점이 Player 2보다 높다면, Player 1이 승리할 확률이 더 높다고 예상할 수 있습니다. 따라서 승리 시 이동하는 평점은 고정된 값이 아니라 누가 이겼는지에 따라 달라집니다.
- Player 1(예상 승자)이 이긴 경우: 당연한 결과이므로 이동하는 평점이 작습니다.
- Player 2(예상 열세)가 이긴 경우: 이변을 일으킨 것이므로 이동하는 평점이 큽니다.
평점 계산 공식
경기가 끝난 후 새 평점은 다음 식으로 계산합니다.
새 평점 = 기존 평점 + K × (실제 결과 − 예상 승률)
각 항목의 의미는 다음과 같습니다.
- K(ratingConstant): 한 번의 경기에서 최대로 이동할 수 있는 평점 폭을 정하는 상수로, 운영 주체(게임 커뮤니티)가 결정합니다. 흔히 'K 팩터'라고 부릅니다.
- 실제 결과(successProb): 승리하면 1, 패배하면 0입니다.
- 예상 승률(P1, P2): 경기 전 두 선수의 평점 차이로 계산한 승률입니다.
예상 승률은 로지스틱 함수 형태의 다음 공식으로 구합니다.
P1 = 1 / (1 + 10((Rating2 − Rating1) / 400))
P2 = 1 − P1
여기서 Rating1, Rating2는 각각 Player 1, Player 2의 현재 평점이며, 두 예상 승률은 항상 P1 + P2 = 1을 만족합니다.
계산 예시
입력: rating1 = 782, rating2 = 1432, K = 100, Player 1 승리
출력: rating1 ≈ 784.32, rating2 ≈ 1429.68
풀이 과정:
먼저 예상 승률을 계산합니다. 두 선수의 평점 차가 650점이므로,
P1 = 1 / (1 + 10^(650/400)) ≈ 0.977
P2 = 1 − P1 ≈ 0.023
즉, 평점이 낮은 Player 2는 약 2.3%의 확률로, Player 1은 약 97.7%의 확률로 승리할 것으로 예상됩니다. Player 1이 실제로 승리했으므로,
Player 1: 새 평점 = 782 + 100 × (1 − 0.977) ≈ 782 + 2.32 = 784.32
Player 2: 새 평점 = 1432 + 100 × (0 − 0.023) ≈ 1432 − 2.32 = 1429.68
강자가 이겼기 때문에 평점 변화가 약 2점에 그친 것을 확인할 수 있습니다. 반대로 Player 2가 이겼다면 약 97.7점이라는 훨씬 큰 점수가 이동했을 것입니다.
C++ 구현 코드
다음은 Elo 평점 알고리즘의 동작을 보여주는 C++ 프로그램입니다.
#include <bits/stdc++.h>
using namespace std;
void updateRatingUsingEloRating(float rating1, float rating2,
int ratingConstant, bool player1Wins) {
float P1, P2;
// 예상 승률 계산
if (rating1 > rating2) {
P1 = 1.0 / (1.0 + pow(10.0, ((rating1 - rating2) / 400.0)));
P2 = 1 - P1;
} else {
P2 = 1.0 / (1.0 + pow(10.0, ((rating2 - rating1) / 400.0)));
P1 = 1 - P2;
}
// 경기 결과에 따라 평점 갱신
if (player1Wins) {
rating1 = rating1 + ratingConstant * (1 - P1);
rating2 = rating2 + ratingConstant * (0 - P2);
} else {
rating1 = rating1 + ratingConstant * (0 - P1);
rating2 = rating2 + ratingConstant * (1 - P2);
}
cout << "Ratings After the game\n";
cout << "Player 1 : " << rating1 << "\t Player 2 : " << rating2;
}
int main() {
float rating1 = 782, rating2 = 1432;
int ratingConstant = 100;
bool player1Wins = true;
cout << "Ratings before the game:\n";
cout << "Player 1 : " << rating1 << "\t Player 2 : " << rating2 << endl;
if (player1Wins)
cout << "Player 1 wins the game!\n";
else
cout << "Player 2 wins the game!\n";
updateRatingUsingEloRating(rating1, rating2, ratingConstant, player1Wins);
return 0;
}
실행 결과
Ratings before the game: Player 1 : 782 Player 2 : 1432 Player 1 wins the game! Ratings After the game Player 1 : 784.316 Player 2 : 1429.68
정리
Elo 평점 알고리즘은 '승리 확률이 높은 쪽이 이기면 적게 받고, 확률이 낮은 쪽이 이기면 많이 받는' 직관적인 규칙을 수학적으로 구현한 시스템입니다. 이러한 특성 덕분에 FIDE(국제체스연맹) 레이팅부터 온라인 게임의 매치메이킹 시스템까지 폭넓게 활용되고 있습니다. 위 코드를 응용하면 자신만의 랭킹 시스템이나 대전 게임 매치메이커도 손쉽게 만들어 볼 수 있습니다.