PHP Facemash ELO Rating Class/Function
Asked Answered
F

2

8

I got the following ELO class from PHPClasses website.

<?php 
class elo_calculator {
    public function rating($S1, $S2, $R1, $R2) {
        if(empty($S1) or empty($S2) or empty($R1) or empty($R2))
            return null;
        if($S1 != $S2) {
            if($S1 > $S2) {
                $E = 120 - round(1 / (1 + pow(10, (($R2 - $R1) / 400))) * 120);
                $R['R3'] = $R1 + $E;
                $R['R4'] = $R2 - $E;
            } else {
                $E = 120 - round(1 / (1 + pow(10, (($R1 - $R2) / 400))) * 120);
                $R['R3'] = $R1 - $E;
                $R['R4'] = $R2 + $E;
            }
        } else {
            if($R1 == $R2) {
                $R['R3'] = $R1;
                $R['R4'] = $R2;
            } else {
                if($R1 > $R2) {
                    $E = (120 - round(1 / (1 + pow(10, (($R1 - $R2) / 400))) * 120)) - (120 - round(1 / (1 + pow(10, (($R2 - $R1) / 400))) * 120));
                    $R['R3'] = $R1 - $E;
                    $R['R4'] = $R2 + $E;
                } else {
                    $E = (120 - round(1 / (1 + pow(10, (($R2 - $R1) / 400))) * 120)) - (120 - round(1 / (1 + pow(10, (($R1 - $R2) / 400))) * 120));
                    $R['R3'] = $R1 + $E;
                    $R['R4'] = $R2 - $E;
                }
            }
        }
        $R['S1'] = $S1;
        $R['S2'] = $S2;
        $R['R1'] = $R1;
        $R['R2'] = $R2;
        $R['P1'] = ((($R['R3'] - $R['R1']) > 0)?"+" . ($R['R3'] - $R['R1']) : ($R['R3'] - $R['R1']));
        $R['P2'] = ((($R['R4'] - $R['R2']) > 0)?"+" . ($R['R4'] - $R['R2']) : ($R['R4'] - $R['R2']));
        return $R;
    }
} 
?>

I am trying to apply this to my food rating site.

Here is what i understand

  1. To start off with the system we need to assign a base score for all the dishes.
  2. We have 4 variables S1, S2, R1, R2 (S= score, R = rank)
  3. When rating between two dishes if i press the first dish. what will be the the S1 and S2 ? will it be 1-0 ?
  4. What if i add another dish after 10k battles ? since i will be assigning a base score for it will it fair better ?
  5. How can i stop a score of a Dish not to go below 0.

Here is PHP implementation of the same. Can you help me understand the 4 variables and how should i use it ?

Fivestar answered 10/4, 2011 at 7:40 Comment(4)
I found the mathematical theory behind the Elo rating quite helpful. It's easy to implement it straight like described en.wikipedia.org/wiki/Elo_rating#TheoryStimulate
check this question: https://mcmap.net/q/611047/-facemash-algorithm-closedOscoumbrian
@LumpN i checked it out. am a little confused about the variables in use and what they mean. will update my post. Plz have a look. @Oscoumbrian thank you. Having a little trouble implement it. will update my postFivestar
check out facemash.99k.orgTabanid
I
6

here on GitHub is the best php class for ELO rating system i've ever found: https://github.com/Chovanec/elo-rating

USAGE:

// player A elo = 1000
// player B elo = 2000
// player A lost
// player B win
$raging = new Rating(1000, 2000, 0, 1);

// player A elo = 1000
// player B elo = 2000
// player A draw
// player B draw
$raging = new Rating(1000, 2000, .5, .5);
Izanagi answered 12/2, 2012 at 13:50 Comment(0)
T
1

1.S1 should be the current score of the first dish and S2 for the second dish you are comparing with

2.R1 is the rank of the current dish and R2 is the current rank of the second dish

2.if its not fair this system wouldn't be used in global games

3.you probably are going to use a database to save scores so lets say it should be like this

if($elo_calcualtor->rating(1,2,1,2)['p1'] < 0){$current_dish_score = 0;}

finally you should make the rating starts from ten, so it won't go below 0 and most likely won't go higher than 20

hope this helps

Tinaret answered 20/5, 2011 at 15:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.