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

suppression fichier tmp

parent a5681ce5
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!21Merge de Dev dans Master
<?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>");
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter