Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 05ea1cf66cdb0681b711bacc138e883e3b98e3f5
  • master par défaut
  • script
  • new-devel
  • devel
  • timingView-edit
  • fix-mpv
7 résultats

VivyDocumentStore.cc

Blame
  • 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>");