alcalyn/elo

具有可靠性目的的Elo系统

v1.0 2014-11-26 09:56 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:50:11 UTC


README

另一个在 PHP 中的 Elo 实现!但这个引入了 可靠性 目的。

Scrutinizer Code Quality Build Status License

可靠性目的

历史:你有一个优秀的玩家 A,他玩了很多游戏,得分达到了 2100 Elo。一个新玩家 B 订阅了游戏网站,因此他的 Elo 得分初始化为 1500。但实际上,他是一名非常优秀的玩家,比 A 更优秀,并且像碾蚂蚁一样击败了他。

问题:新玩家 B 将会因为击败了一个 2100 Elo 的玩家而赢得很多 Elo。这没问题。但是玩家 A2100 Elo)会因为输给一个 1500 Elo 的玩家而失去很多 Elo,但实际上他是最强的。

事实上,新玩家的 Elo 得分是不可靠的,因此它不应影响其他玩家的 Elo 得分。

解决方案:这个库。它为 Elo A 和 Elo B 引入了一个 可靠性系数(介于 0.0 和 1.0 之间的十进制数)。

Composer

通过 composer 安装

{
    "require": {
        "alcalyn/elo": "1.x"
    }
}

如果您不使用 composer,可以手动下载库。

使用方法

  • 实例化一个标准 Elo 系统
use Alcalyn/Elo/EloSystem;

$eloSystem = new EloSystem();
  • 从旧 Elo 计算更新后的 Elo 得分
/**
 * A player with 1650 Elo beat another with 1920
 */
$updatedElos = $eloSystem->calculate(1650, 1920, 1);

print_r($updatedElos);
/* Output:
    Array
    (
        [0] => 1663.2084157978
        [1] => 1906.7915842022
    )
*/
  • 为 Elo 得分设置 可靠性 系数
/**
 * A player with 1907 Elo (1.0 reliability)
 * lose against a new player with 1500 (and reliability to 0.0)
 */
$updatedElos = $eloSystem->calculate(1907, 1500, 0, 1.0, 0.0);

print_r($updatedElos);
/* Output:
Array
(
    [0] => 1907
    [1] => 1514.5978664353
)
*/
  • 使用方法别名进行赢、输或平局
/**
 * Method Aliases
 */
$elo->win(2100, 1500, 1.0, 0.0);
$elo->lose(2100, 1500, 1.0, 0.0);
$elo->draw(2100, 1500, 1.0, 0.0);
  • 实例化一个具有不同 K 因子的系统(默认为 16)
/**
 * Use a different K factor in your Elo system
 */
$eloSystemK32 = new EloSystem(32);

详细示例

新玩家:

玩家 A2100 Elo,可靠性 1.0
玩家 B1500 Elo,可靠性 0.0

A 赢:预期结果,所以 B 会损失少量 Elo,而 A 则不赢。
B 赢:非预期结果,所以 B 会赢得大量 Elo,而 A 则不损失。

A 的 Elo 得分不会在和他打新玩家(具有不可靠 Elo 得分)的对战中更新。

(并且新玩家 B 应该在每场比赛后将其 Elo 可靠性提高大约 1/10,直到其可靠性达到 1)

$elo = new EloSystem();

/**
 * Result without reliability
 */
print_r($elo->lose(2100, 1500));

/* Output:
    Array
    (
        [0] => 2084.4904548805 // lose -16 Elo
        [1] => 1515.5095451195 // win  +16 Elo
    )
*/

/**
 * Result with reliability
 */
print_r($elo->lose(2100, 1500, 1.0, 0.0));

/* Output:
    Array
    (
        [0] => 2100 // don't lose Elo against new player
        [1] => 1515.5095451195 // win +16 Elo vs reliable Elo score
    )
*/

另一个示例:两名新手玩家:

玩家 A1500 Elo,可靠性 0.0
玩家 B1500 Elo,可靠性 0.0

有两个新玩家,因此他们的可靠性都是 0.0:算法会将他们视为可靠性都是 1.0。

如果玩家 A 的 Elo 可靠性等于 0.4,而玩家 B 等于 0.0,算法会将其相加 +0.6,以便其中一个可靠性达到 1.0

许可证

本项目采用 MIT 许可证