Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

อัลกอริธึมการให้คะแนน Elo ใน C++


อัลกอริธึมการให้คะแนน 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