fanom
Новичок
Расчёт рейтинга ELO
не могу победить эту формулу, может поможет кто.
сама формула тут http://ru.wikipedia.org/wiki/Футбольный_рейтинг_Эло
и ещё тут http://www.eloratings.net/system.html
Что смог сделать
Вообщем при каких то случаях это всё работает правильно, но если выигрывает игрок с малым рейтингом у игрока с большим, то всё равно ему дают мало, это неправильно, где то косяк, найти сам немог, убил 2ое суток.... может кто поможет
не могу победить эту формулу, может поможет кто.
сама формула тут http://ru.wikipedia.org/wiki/Футбольный_рейтинг_Эло
и ещё тут http://www.eloratings.net/system.html
Что смог сделать
PHP:
// $pl_1 id первого игрока, $pl_2 id второго ,
// $score_home счёт первого игрока, $score_away счёт второго , $koef = 20
function addRating($pl_1 , $pl_2 , $score_home , $score_away , $koef)
{
global $db;
$rh = $db->query("SELECT skill FROM ae_users WHERE id=".$pl_1); // тут получаю старый рейтинг для первого игрока
$ra = $db->query("SELECT skill FROM ae_users WHERE id=".$pl_2); // тут получаю старый рейтинг для второго игрока
$Ro_pl_1 = $rh['skill'];
$Ro_pl_2 = $ra['skill'];
if($Ro_pl_1 >= $Ro_pl_2) { $difference = $Ro_pl_1 - $Ro_pl_2; } else { $difference = $Ro_pl_2 - $Ro_pl_1; } // высчитываю разницу в рейтинге
if($score_home > $score_away) // если выиграл первый игрок
{
$g = $score_home - $score_away; // разница в забитых мячах
if($g <= 1) { $G = '1'; } if($g == 2) { $G = '1.5'; } if($g == 3) { $G = '1.6'; } if($g > 3) { $G = (11+$g)/8; }
$We = 1/(pow(10, -$difference/400)+1); // тут сама формула
$do_pl_1 = $koef*$G*(1 - $We); $do_pl_1 = round($do_pl_1);
$do_pl_2 = $koef*$G*(0 - (1-$We)); $do_pl_2 = round($do_pl_2);
// вот новый рейтинг для игрока $do_pl_1 WHERE id=".$pl_1);
// новый рейтинг для игрока 2 $do_pl_2 WHERE id=".$pl_2);
}
// ниже тоже самое, но уже если выиграл игрок 2 может это лишнее, я запутался .
if($score_home < $score_away)
{
$g = $score_away - $score_home;
if($g <= 1) { $G = '1'; } if($g == 2) { $G = '1.5'; } if($g == 3) { $G = '1.6'; } if($g > 3) { $G = (11+$g)/8; }
$We = 1/(pow(10, -$difference/400)+1);
$do_pl_1 = $koef*$G*(0 - (1-$We)); $do_pl_1 = round($do_pl_1);
$do_pl_2 = $koef*$G*(1 - $We); $do_pl_2 = round($do_pl_2);
$db->update("UPDATE ae_users SET skill=(skill+$do_pl_1) WHERE id=".$pl_1);
$db->update("UPDATE ae_users SET skill=(skill+$do_pl_2) WHERE id=".$pl_2);
}
if($score_home == $score_away)
{
$g = $score_away - $score_home;
if($g <= 1) { $G = '1'; } if($g == 2) { $G = '1.5'; } if($g == 3) { $G = '1.6'; } if($g > 3) { $G = (11+$g)/8; }
$We = 1/(pow(10, -$difference/400)+1);
$do_pl_1 = $koef*$G*(0.5 - $We); $do_pl_1 = round($do_pl_1);
$do_pl_2 = $koef*$G*(0.5 - (1-$We)); $do_pl_2 = round($do_pl_2);
$db->update("UPDATE ae_users SET skill=(skill+$do_pl_1) WHERE id=".$pl_1);
$db->update("UPDATE ae_users SET skill=(skill+$do_pl_2) WHERE id=".$pl_2);
}
}