Sélectionner une révision Git
VivyDocumentStore.cc
ELO_function_progress.php 4,00 Kio
<?php
/**
* Created by PhpStorm.
* User: phoenix
* Date: 01/04/16
* Time: 18:32
*
*/
/**
* 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 ELO_duel($SA, $RA, $SB, $RB, $K, $nmax=20, $nA=20, $nB=20)
{
if ($nA > $nmax)
$nA = $nmax;
if ($nB > $nmax)
$nB = $nmax;
$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);
if ($newRA>0)
$newRA = floor($newRA);
else
$newRA = ceil($newRA);
if ($newRB>0)
$newRB = floor($newRB);
else
$newRB = ceil($newRB);
return array($newRA, $newRB);
}
/**
* 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_classement($S, $R, $n, $K, $nmax=20)
{
$m = count($S);
if (count($R) != $m)
throw new DomainException;
$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
$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[0]);
$count[$i]++;
$res[$j] = 1/($count[$j] + 1) * ($count[$j] * $res[$j] + $newSAB[1]);
$count[$j]++;
}
}
for ($i = 0; $i<$m; $i++)
{
if ($res[$i]>0)
$res[$i] = floor($res[$i]);
else
$res[$i] = ceil($res[$i]);
}
return $res;
}
function random_classement($n)
{
$r = array();
for ($j=0; $j<$n; $j++)
{
array_push($r, $j+1);
}
shuffle($r);
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);
$n = array(0,0,0,0,0);
print("<tr><td>0</td>");
foreach ($DS as $value) {
print("<td>$value</td>");
}
$p = array_sum($DS);
print("<td>$p</td></tr>");
for($j=1;$j<100;$j++){
$sa = random_classement(5);
$res = ELO_classement($DS, $sa, $n, 32);
print("<tr><td>$j</td>");
for ($i=0;$i<count($DS);$i++) {
$DS[$i] = $DS[$i] + $res[$i];
$k1 = $DS[$i];
$k2 = $res[$i];
$k3 = $sa[$i];
$n[$i]++;
print("<td>$k1 ($k2) ($k3)</td>");
}
$p = array_sum($DS);
print("<td>$p</td></tr>");
}
print("</table></body></html>");