อัลกอริธึมการให้คะแนน Elo เป็นอัลกอริธึมการให้คะแนนที่ใช้ในการจัดอันดับผู้เล่นในเกมการแข่งขัน การจัดอันดับผู้เล่นในการแข่งขันขึ้นอยู่กับการโวยวายซึ่งเปลี่ยนแปลงตามประสิทธิภาพของผู้เล่นดังนี้
สำหรับเกมระหว่างผู้เล่นสองคนที่มีเรตติ้งต่างกัน สมมติว่ามีผู้เล่นสองคนแข่งขันกันเอง−
Player1 Player2
คะแนนของผู้เล่น 1 มากกว่าผู้เล่น 2
ถ้า player1 ชนะเกม ผู้เล่นบางคนจะถูกโอนจากผู้เล่น 1 ไปยังผู้เล่น 2 และในทางกลับกันหากผู้เล่น 2 ชนะ
แต่จำนวนคะแนนที่จะโอนเพื่อชัยชนะนั้นไม่คงที่ แต่มันขึ้นอยู่กับบุคคลที่ชนะเกม
หากผู้เล่น 1 ชนะเกม คะแนนที่โอนจะน้อยกว่า
หากผู้เล่น 2 ชนะเกม คะแนนที่โอนจะมากกว่า
จำนวนคะแนนที่โอนขึ้นอยู่กับสูตร
สำหรับผู้เล่น1,
เรตติ้งใหม่ =เรตติ้งเก่า + เรตติ้งคงที่ * (successProb - P1)
สำหรับผู้เล่น2
เรตติ้งใหม่ =เรตติ้งเก่า + เรตติ้งคงที่ * (successProb - P2)
ที่นี่
RatingConstant เป็นค่าคงที่ ชุมชนเกมเป็นผู้ตัดสิน
P1 ความน่าจะเป็นที่ผู้เล่น 1 ชนะ
P2 ความน่าจะเป็นที่ผู้เล่น 2 จะชนะ
เรตติ้ง1 คือเรตติ้งของผู้เล่น1
เรตติ้ง2 คือเรตของผู้เล่น2.
หากผู้เล่นชนะ SuccessProb จะเป็น 1 มิฉะนั้นจะเป็น 0
มาดูตัวอย่างเพื่อทำความเข้าใจการทำงานของอัลกอริธึมการให้คะแนน ELO
ป้อนข้อมูล: คะแนน 1 =782 คะแนน 2 =1432
RatingConstant =100 ผู้เล่น 1 ชนะเกม
ผลลัพธ์: คะแนน1 =780 คะแนน2 =1434
คำอธิบาย −
ผู้เล่น1 ชนะ
สำหรับผู้เล่น1,
SuccessProb =1
คะแนนใหม่ =782 + 100*(1 - 0.98) =782 + 100*(0.02) =782 + 2 =784
สำหรับผู้เล่น2
SuccessProb =0
คะแนนใหม่ =1432 + 100*(0 - 0.02) =1432 - 2 =1430
โปรแกรมแสดงการทำงานของอัลกอริธึมการจัดเรต ELO
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; void updateRatingUsingELoRating(float rating1, float rating2, int ratingConstant, bool player1SuccessProb) { 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 (player1SuccessProb == 1) { rating1 = rating1 + ratingConstant * (1 - P1); rating2 = rating2 + ratingConstant * (0 - P2); } else { rating1 = rating1 + ratingConstant * (0 - P1); rating1 = rating1 + 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 player1SuccessProb = 1; cout<<"Ratings before the game: \n"; cout<<"Player 1 : "<<rating1<<"\t Player 2 : "<<rating2<<endl; if(player1SuccessProb) cout<<"Player 1 wins the game!\n"; else cout<<"Player 2 wins the game!\n"; updateRatingUsingELoRating(rating1, rating2, ratingConstant, player1SuccessProb); 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