php - 如何延长ELO等级?

标签 php algorithm

在我的足球联赛中,我使用(用户与球队比赛时)ELO 评分。一切正常。我需要关于如何扩展公式以反射(reflect)团队球员的系数和力量的增加的建议。 (团队有 1 到 10 的权力,1 = 最弱的团队,10 最强的团队)。

例如:

国内球员系数1000,客队球员系数1000,常量赛事重要度32,1:0结果

主场球员获得 +16,客队球员获得 -16。

现在结合团队的力量(例如,力量 10/6),结果应该是这样的 -> +12/-12 = 更强的玩家和更强的团队获胜。

我不知道怎么编辑。谢谢。

ELO 评分公式 = http://www.eloratings.net/system.html

抱歉我的英语不好。

============================================= ==========================

对您的评论进行新的编辑和回答

有趣的想法,但并不完全准确。我将尝试在一个小例子上进行演示:

玩家 1:spinning_plate(1000 分) player2: Kcko (1000 elo 点数)

例子:

spinning_plate Kcko 失败(例如 1:0),他们得到 +15/-15 分 -> 这仍然很好,但现在我们包括团队的力量

改进: spinning_plate 效力于 FC Barcelona(Force 10),击败 Kcko(较弱的球队效力于 AS Monaco,force 7),spinning_plate 获得不到 15 分(因为他们有强队的优势。两位球员的 ELO 积分是相同,但他们的团队实力不同)。

你明白问题的本质了吗?

玩家为拥有不同实力的不同球队效力,这应该包含在 ELO 函数中:)

取自真实公式 ( http://www.eloratings.net/system.html ) 我需要通过真实地添加到公式(s1 和 s2)中来增加强度

$k1 - elo points of player 1
$k2 - elo points of player 2
$konstanta = weight constant for the tournament played
$g1 = goals for player 1
$g2 = goals for player 2
$s1 = new my own constant = strenght of team of player 1
$s2 = new my own constant = strenght of team of player 2



function elo($k1, $k2, $konstanta = 0, $g1, $g2, $s1 = 0, $s2 = 0)
{


    $arg_list = func_get_args();
    //debug($arg_list

    $s1 = (int) $s1;
    $s2 = (int) $s2;

    $G_rozdil = Abs($g1 - $g2); // golovy rozdil 
    // Konstanta za vysledek hry
    if ($g1 > $g2)  
        $W = 1;
    elseif ($g1 == $g2)
        $W = 0.5;
    else
        $W = 0;  

    // Rating puvodni, za domaciho
    $Ro = $koeficient1; 
    $K  = $konstanta; // Zakladni konstanta pro hrane zapasy, cim dulezitejsi turnaj tim vyssi 20-60
                        // a dale se navysuje o urcity koeficient pocitaneho z rozdilu golu
    if ($G_rozdil==2) 
        $K=$K*1.5;
    elseif ($G_rozdil==3) 
        $K=$K*1.75;
    elseif ($G_rozdil>3) 
        $K=$K*((1.75+(($G_rozdil-3)/8)));


    $dr = $k1 - $k2; // 100 zvyhodnuje hosta , protoze hraje venku 


    // Konecny result
    $Rn = $Ro + $K * ($W - $We);


    // To dostanou domaci
    $Body1 = Round($Rn - $Ro);

    // Toto hoste
    $Body2 = $Body1 * -1;

    if ($Body1 == 0 || $Body2 == 0)
    {
        return array(0, 0);
    }

    return array($Body1, $Body2);
}

最佳答案

我认为在这种情况下最好的办法是将计算机的优势转化为初步的 ELO 评级。

我以国际象棋和互联网国际象棋服务器为例 FICS .当计算机玩游戏时,它就像人类对手一样对待 - 它会获得初步评级,然后根据它与人类和计算机对手的胜负来进行评级。

但是,如果您没有足够多的玩家在强大的计算机中,您可能会遇到引导问题,因为其他所有玩家都很弱,因此可能无法获得不错的评级。在这种情况下,您可以简单地将 1-10 映射到 MIN_RATING-MAX_RATING 的范围内。 MAX_RATING实际上不是最高评分,MIN_RATING可能不应该为0。ELO是一个相对排名系统,绝对数字没有任何意义,所以你可以根据你的玩家群来选择它们。在国际象棋中,大师级的评分较高,约为 27-2800,而最低的评分约为 400 左右的新手,他们坚持但没有提高。

这里的要点是,如果您给他们一个初步评级,随着时间的推移,他们将向“真实评级”靠拢,因为他们将与玩家进行游戏并相应地移动。

编辑

为什么不根据团队差异来调整权重常数呢?这样的事情怎么样:

K*(F(9-abs(s1-s2))) 

其中 F(x) 是 sigmoid function甚至只是一个线性函数 [0...9]->[1...0}。这意味着评分相同的团队获得完整的常数,差异较大的团队缩小到零或您选择的任何值。

我不知道我是否同意这个计算是解决这个问题的最佳方法。如果你这样使用它,ELO 的统计数据可能不适用,但我没有做更多的研究,我没有更好的建议。

关于php - 如何延长ELO等级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10520490/

相关文章:

php - 如何使用 php 发出 http 请求并获得响应

javascript - 如何使这种登录/重定向方法更安全

php - 匹配大括号之间的空格

php - 在 PHP 中使用混合字母数字边界查找范围内所有值的最优雅/最有效的方法是什么?

algorithm - 如何确定哪些纵横比最接近

algorithm - 插值搜索比二分搜索慢的例子是什么?

php - Laravel 和 Dropbox WebAuth : "Missing CSRF token in session"

php - 获取父类中子类的实例

java - 通过删除数字来计算最大点的算法

javascript - 如何解决这个 "parse and balance angle brackets"问题? (JavaScript)