イロレーティングの計算用PHPコード

シンプルバージョン

シンプルなイロレーティング (Elo Rating System) 用のPHPコードです。

<?php

define('K_FACTOR', 20);

$rating_A = 1600;
$rating_B = 1500;
$goal_A = 2;
$goal_B = 1;

[$a, $b] = calc_elo($rating_A, $rating_B, $goal_A, $goal_B);

echo "A=$a, B=$b";

exit;

function calc_elo($r1, $r2, $g1, $g2) {
  $s = $g1 > $g2 ? 1 : ($g1 < $g2 ? 0 : 0.5);
  $e = 1 / (1 + pow(10, ($r2 - $r1) / 400));
  $dr = round(K_FACTOR * ($s - $e), 0);
  return [$r1 + $dr, $r2 - $dr];
}

まず、定数Kの値(K_FACTOR)を設定しています。
次に、両チームの元のレーティングと得点を変数に代入しています。
今回は、サッカーチームのレーティングの算出用なので、両チームの得点を引数としています。

calc_elo() にそれぞれの値を渡して、新しいレーティングを受け取り、表示しています。

応用バージョン

次に、得点差とホームアドバンテージを考慮したバージョンです。

<?php

define('K_FACTOR', 20);
define('HA', 50);

$rating_A = 1600;
$rating_B = 1500;
$goal_A = 2;
$goal_B = 1;

[$a, $b] = calc_elo2($rating_A, $rating_B, $goal_A, $goal_B);

echo "A=$a, B=$b";

exit;

function calc_elo2($r1, $r2, $g1, $g2) {
  $s = $g1 > $g2 ? 1 : ($g1 < $g2 ? 0 : 0.5);
  $e = 1 / (1 + pow(10, ($r2 - $r1 - HA) / 400));
  $dg = abs($g1 - $g2);
  if ($dg <= 1) {
    $kc = 1;
  } elseif ($dg == 2) {
    $kc = 1.5;
  } elseif ($dg == 3) {
    $kc = 1.75;
  } else {
    $kc = 1.75 + ($dg - 3) / 8;
  }
  $dr = round(K_FACTOR * $kc * ($s - $e), 0);
  return [$r1 + $dr, $r2 - $dr];
}

ホームチーム(Aチームのほう)へ加算するレーティング値を定数HAとして設定しています。

また、得点差($dg)を基に、Kの値を増やしています。
1点差以内ならそのまま、2点差なら1.5倍、3点差なら1.75倍という具合。

以上がPHPを使ったイロレーティングの算出コードです。
定数の値は仮なので、調整が必要です。

PHP code for Elo Rating System (Soccer Teams ver.)
Including goal difference and home advantage


この記事が気に入ったらサポートをしてみませんか?