C++中的Elo评级算法
Elo评级算法是一种用于对竞技游戏中玩家进行排名评级的算法。比赛中玩家的排名是基于评级,评级会根据玩家的表现发生变化,具体如下:
对于两个评级不同的玩家之间的比赛。假设有两个玩家互相竞争:
玩家1 玩家2
玩家1的评级高于玩家2。
如果玩家1获胜,则一些评级将从玩家1转移到玩家2,反之亦然,如果玩家2获胜。
但胜利后转移的评级数量不是恒定的。相反,它取决于赢得比赛的人,
如果玩家1获胜,则转移的点数较少。
如果玩家2获胜,则转移的点数较多。
转移的点数取决于以下公式:
对于玩家1,
新评级 = 旧评级 + 评级常数 * (获胜概率 - P1)
对于玩家2,
新评级 = 旧评级 + 评级常数 * (获胜概率 - P2)
这里,
评级常数是一个常数,由游戏社区决定。
P1,玩家1获胜的概率。
P2,玩家2获胜的概率。
Rating1是玩家1的评级。
Rating2是玩家2的评级。
如果一个玩家获胜,则获胜概率为1,否则为0。
让我们举一个例子来理解Elo评级算法的工作原理:
输入:rating1 = 782,rating2 = 1432,
ratingConstant = 100,玩家1赢得比赛。
输出:rating1 = 780,rating2 = 1434
解释 -
玩家1获胜,
对于玩家1,
获胜概率 = 1
新评级 = 782 + 100 * (1 - 0.98) = 782 + 100 * (0.02) = 782 + 2 = 784
对于玩家2,
获胜概率 = 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
广告