Skip to content
Extraits de code Groupes Projets
Valider d9a9c9b8 rédigé par Eliah REBSTOCK's avatar Eliah REBSTOCK
Parcourir les fichiers

Fonction ELO_duel et ELO_classements plus propres et plus justes.

parent f961805a
Aucune branche associée trouvée
Aucune étiquette associée trouvée
2 requêtes de fusion!21Merge de Dev dans Master,!2Dev phoenix
......@@ -7,66 +7,76 @@
*
*/
/* @param $tab array
* @param $j int
* @requires $j >= 0 and $j < count($tab)
* @returns float
* Renvoie la moyenne du tableau en passant l'indice $j
/**
* Fonction qui calcule les différentiels de scores obtenus après une partie d'un jeu à deux joueurs
* où l'on peut perdre (0) ou gagner (1).
* @param int $SA : score actuel du premier joueur
* @param int $RA : score (valant 0 ou 1) du premier joueur
* @param int $SB : score actuel du second joueur
* @param int $RB : score (valant 0 ou 1) du second joueur
* @param int $K : la quantité max de points gagnable ou perdable sur une partie
* @param int $nmax : le nombre de parties pour considérer "qu'un joueur est aguerri". Vaut 20 par défaut.
* @param int $nA : le nombre de parties effectués par le premier joueur sur le jeu.
* @param int $nB : le nombre de parties effectués par le second joueur sur le jeu.
* @return array : le différentiel de score du premier joueur et du second joueur
*/
srand();
function avg_skip($tab, $j)
{
$s = 0;
$n = count($tab);
for($i=0;$i < $n;$i++)
{
if ($i != $j)
function ELO_duel($SA, $RA, $SB, $RB, $K, $nmax=20, $nA=20, $nB=20)
{
$s = $s + $tab[$i];
}
}
if ($nA > $nmax)
$nA = $nmax;
if ($nB > $nmax)
$nB = $nmax;
return $s/($n-1);
}
$EA = 1/(1+10**(($SB-$SA)/400));
$EB = 1/(1+10**(($SA-$SB)/400));
$newRA = ($K*$nB)/$nmax * ($RA-$EA);
$newRB = ($K*$nA)/$nmax * ($RB-$EB);
return array($newRA, $newRB);
}
/* @param $scores_actuel array
* @param $scores_obtenus array
* @param $K int (Coefficient multiplicatif propre au jeu, plus il est élevé, plus le résultat est fin)
* @param $D int (nombre de points pour qu'un joueur soit 10x plus fort qu'un autre)
* @return int
*
* @requires count($scores_actuel) == count($scores_obtenus)
* @requires $K >= 1 and $D > 1
*
* Renvoie le nombre de points obtenus (ou perdus, dans ce cas c'est négatif) dans un tableau
* correspondant aux indices de $scores_obtenus.
*
/**
* Fonction qui calcule les différentiels de scores obtenus après une partie à count($S) joueurs
* en considérant que $R correspond au classement des joueurs dans ce jeu (du type array(1,3,4,2) pour
* le premier joueur est 1er, le second est 2e, etc).
* On suppose qu'il y a correpondance entre les indices de $S et les indices de $R.
* @param array $S : scores actuels des joueurs
* @param array $R : classement des joueurs
* @param int $nmax : le nombre de parties pour considérer "qu'un joueur est aguerri". Vaut 20 par défaut.
* @param array $n : nombre de parties de chaque joueurs
* @param int $K : la quantité max de points gagnable ou perdable sur une partie
* @return array : le différentiel de score de chaque joueur
* @throws DomainException
*/
function ELO($scores_actuel, $scores_obtenus, $K, $D)
function ELO_classement($S, $R, $n, $K, $nmax=20)
{
$newS = array();
$c = max($scores_obtenus)-min($scores_obtenus);
$d = min($scores_obtenus);
for ($j=0; $j<count($scores_obtenus); $j++)
{
$m = avg_skip($scores_actuel, $j);
$EA = 1/(1+10**(($m-$scores_actuel[$j])/$D));
$EA = $c * $EA + $d;
$s = $K * ($scores_obtenus[$j]-$EA);
$m = count($S);
if (count($R) != $m)
throw new DomainException;
if ($s>=0)
$newS[$j] = floor($s);
$count = array_fill(0, $m, 0);
$res = array_fill(0, $m, 0);
for ($i = 0; $i<$m; $i++)
{
for($j=$i+1; $j<$m; $j++)
{
if ($R[$i]<$R[$j])
$newSAB = ELO_duel($S[$i], 1, $S[$j], 0, $K, $nmax, $n[$i], $n[$j]);
else
$newS[$j] = ceil($s);
$newSAB = ELO_duel($S[$i], 0, $S[$j], 1, $K, $nmax, $n[$i], $n[$j]);
$res[$i] = 1/($count[$i] + 1) * ($count[$i] * $res[$i] + $newSAB[1]);
$count[$i]++;
$res[$j] = 1/($count[$j] + 1) * ($count[$j] * $res[$j] + $newSAB[2]);
$count[$j]++;
}
return $newS;
}
return $res;
}
/*
function random_scores($n, $min, $max)
{
$r = array();
......@@ -77,8 +87,9 @@ function random_scores($n, $min, $max)
return $r;
}
*/
/* Test */
/*
print("<html><body><table><th>Itération</th><th>Joueur 1</th><th>Joueur 2</th><th>Joueur 3</th><th>Joueur 4</th><th>Joueur 5</th><th>Somme</th></tr>");
$DS = array(1000,1000,1000,1000,1000);
......@@ -107,4 +118,4 @@ for($j=1;$j<20;$j++){
}
print("</table></body></html>");
*/
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter