1

私のサッカー リーグでは (ユーザーがチームでプレーする場合) ELO レーティングを使用しています。すべて正常に動作します。チーム プレーヤーの係数とパワーの追加を反映するために式を拡張する方法についてアドバイスが必要です。(チームの力は 1 から 10 まであり、1 = 最も弱いチーム、10 が最も強いチーム)。

例えば:

国内選手の係数は1000、訪問選手の係数は1000、定数イベントの重要度は32、結果は1:0

ホーム プレイヤーは +16、ビジター プレイヤーは -16 を獲得します。

そして、チームの強さ (たとえば、パワー 10/6) を組み込むと、結果は次のようになります -> +12 / -12 = 強いチームが勝った強いプレイヤー。

編集の仕方がわかりません。ありがとうございました。

ELO 評価式 = http://www.eloratings.net/system.html

私の悪い英語でごめんなさい。

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

URコメントの新しい編集と回答

興味深いアイデアですが、完全に正確ではありません。小さな例でデモンストレーションを試みます。

player1: spin_plate (1000 elo ポイント) player2: Kcko (1000 elo ポイント)

例:

spin_plate Kcko の敗北 (例: 1:0)、彼らはポイント +15 / -15 を獲得します -> これでも問題ありませんが、チームの力が含まれるようになりました

改善点: spin_plate が FC バルセロナ (フォース 10) でプレーし、Kcko を倒した (弱いチームが AS モナコでプレーした場合、フォース 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);
}
4

1 に答える 1

0

この状況で行う最善の方法は、コンピューターの強みを暫定的な ELO 評価に変換することだと思います。

Chess やFICSなどのインターネット チェス サーバーから例を挙げます。コンピューターがプレイするとき、コンピューターは人間の対戦相手と同じように扱われます。予備評価が行われ、後で人間とコンピューターの対戦相手に対して勝ったか負けたかに基づいて評価されます。

ただし、ブートストラップの問題が発生する可能性があります。十分なプレイヤーがいない場合、他のすべてのプレイヤーが弱いため、強力なコンピューターが適切な評価を取得できない可能性があります. この場合、1 ~ 10 を MIN_RATING ~ MAX_RATING の範囲に単純にマッピングできます。MAX_RATING は実際には最大レーティングではなく、MIN_RATING はおそらく 0 であってはなりません。ELO は相対的なランキング システムであり、絶対数は何の意味もないため、プレイヤー ベースに応じて選択することができます。チェスでは、より高いレーティングはグランドマスターの約 27 ~ 2800 であり、最も低いレーティングは約 400 年代の初心者であり、残りは改善されません。

ここでの要点は、仮のレーティングを与えると、プレイヤーとゲームをプレイし、それに応じて移動するため、時間の経過とともに「真のレーティング」に向かって移動するということです。

編集

チームの差に基づいて体重定数をスケーリングしないのはなぜですか? このようなものはどうですか:

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

ここで、F(x) はシグモイド関数または単なる線形関数 [0...9]->[1...0} です。これは、評価が等しいチームは完全な定数を取得し、差が大きいチームはゼロまたは選択したものにスケールダウンすることを意味します。

この計算がこの問題にアプローチする最良の方法であることに同意するかどうかはわかりません。このように使用すると、ELO の統計が適用されない可能性がありますが、さらに調査を行わなければ、より良い提案はありません。

于 2012-05-09T18:02:55.733 に答える