Computer >> Máy Tính >  >> Lập trình >> C ++

Thuật toán xếp hạng Elo trong C ++

Thuật toán xếp hạng elo là một thuật toán xếp hạng được sử dụng để xếp hạng người chơi trong các trò chơi cạnh tranh. Xếp hạng của người chơi của cuộc thi dựa trên việc xếp hạng, thay đổi dựa trên thành tích của người chơi như sau,

Đối với một trò chơi giữa hai người chơi có xếp hạng khác nhau. Giả sử có hai người chơi thi đấu với nhau−

Người chơi1 Người chơi2

Xếp hạng của người chơi 1 cao hơn người chơi 2.

Nếu player1 thắng trò chơi, một số người chơi sẽ được chuyển từ người chơi1 sang người chơi2 và ngược lại nếu người chơi 2 thắng.

Nhưng số lượng đánh giá được chuyển giao cho chiến thắng không phải là không đổi. Thay vào đó, nó phụ thuộc vào người chiến thắng trò chơi,

Nếu người chơi 1 thắng trò chơi, điểm được chuyển sẽ ít hơn.
Nếu người chơi 2 thắng trò chơi, điểm được chuyển sẽ nhiều hơn.

Số điểm được chuyển phụ thuộc vào công thức,

Đối với player1,

Xếp hạng mới =Xếp hạng cũ + xếp hạngConstant * (successProb - P1)

Đối với player2,

Xếp hạng mới =Xếp hạng cũ + xếp hạngConstant * (successProb - P2)

Đây,

ratingConstant là một hằng số, nó do cộng đồng game thủ quyết định.

P1, xác suất người chơi 1 chiến thắng.
P2, xác suất người chơi 2 chiến thắng.

Rating1 là xếp hạng của player1.
Rating2 là xếp hạng của player2.

Nếu người chơi thắng thành công thì Prob là 1, ngược lại là 0.

Hãy lấy một ví dụ để hiểu hoạt động của thuật toán xếp hạng ELO,

Đầu vào: rating1 =782, rating2 =1432,
ratingConstant =100, player1 thắng trò chơi.

Đầu ra: rating1 =780, rating2 =1434

Giải thích -

Người chơi 1 thắng,

Đối với player1,

thành côngProb =1

Xếp hạng mới =782 + 100 * (1 - 0,98) =782 + 100 * (0,02) =782 + 2 =784

Đối với player2,

thành côngProb =0

Xếp hạng mới =1432 + 100 * (0 - 0,02) =1432 - 2 =1430

Chương trình minh họa hoạt động của Thuật toán xếp hạng ELO,

Ví dụ

#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;
}

Đầu ra -

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