2010-10-03 16 views

Odpowiedz

13

Nie wiem, jaki algorytm został użyty w prawdziwym świecie, ale to, co piszą w oknie w filmie, oparte jest na Elo rating system, który powstał w świecie szachów i jest teraz również używany w wielu inne gry.

+1

dzięki! W takim przypadku znalazłem parę linków. PHP: http: //webscripts.softpedia.com/scriptDownload/ELO-Calculator-Download-11611.html i Python: http://github.com/gak/elo-rating-simulator/blob/master//elo.py – ma11hew28

+22

To jest moje repozytorium github :) –

0

Nie tutaj nie ma nigdzie w Internecie. Kod źródłowy programu Facemash nigdy nie został udostępniony publicznie. Jedynym, który może nadal mieć kopię, jest sam.

5

Odtworzyłem go i sprawdziłem. Nie wiesz o PHP, ale klasy C# jest

http://lukedurrant.com/2010/11/c-elo-rating-class-used-on-facemash-as-seen-in-the-social-network-movie/

Używałem go na moim

Facemash

klucz kod prasowej jest

$(document).keydown(function(event) { 
    if (event.keyCode == 37) { 
     //Voted Face 1 
     Rate("face1", false); 
    } 
    if(event.keyCode == 39) { 
     //Voted Face 2 
     Rate("face2", false); 
    } 

}); 
+0

Mówi "jak widać w The Social Network", ale wygląda zupełnie inaczej. W filmie jest gruby, czerwony nagłówek i biały kolor tła. –

+0

jak zaimplementowałeś używanie klawiatury w lewo i prawo. czy możesz udostępnić kod? –

+0

Wow ... Jak udało Ci się zdobyć tak wiele osób korzystających z Twojej witryny? @Luke –

3
<?php 
    //This page is responsible to return a JSON object 
    //code starts after the functions for those who might get confused xD 

    header('content-type: application/json; charset=utf-8'); 


    global $responseData; 


    function AdjustRate($Ra, $Ea, $Sa) 
    { 
     //i used my own rules here 32 points for less than 500 
     if($Ra < 500) 
      $k = 32; 
     elseif ($Ra < 1000)//24 points for anything between 500 and 1000 
      $k = 24; 
     else 
      $k = 16;//16 for anything more than 1000 

     return $Ra + ($k*($Sa - $Ea)); 
    } 

    function GetExpectedChance($rA, $rB) // the ELO formula taken from http://en.wikipedia.org/wiki/Elo_rating_system 
    { 
     return (1/(1+pow(10,(($rB-$rA)/400)))); 
    } 

    function setNewRates($lastCall) // function I used to update my database tables 
    { 
     global $responseData; 

     $A = $lastCall->p1; 
     $B = $lastCall->p2; 
     $C = $lastCall->c; 
     $A->E = GetExpectedChance($A->rate, $B->rate); 
     $B->E = GetExpectedChance($B->rate, $A->rate); 

     // decide who won and who lost 
     if($A->id == $C){ 
      $winner = $A; 
      $looser = $B; 
     } 
     elseif ($B->id == $C) { 
      $winner = $B; 
      $looser = $A; 
     } 

     // 3 cases, in all of them winner will get his rate/hits increased by 1 
     //Case #1: normal case we just update rate/hits for the winner, this applies all the time 
     $winner->rate += 1; 
     $winner->hits += 1; 
     //Case #2/#3 : here we should adjust the rate after applying case #1 
     // if he won while he is expected to lose OR if he lost while expected to win 
     // there should be minimum rate different of 40 between the two 
     $diff = abs($winner->rate - $looser->rate); 
     if($diff >= 40 && ($winner->E < 0.5 || $looser->E >= 0.5)) { 
      $winner->rate = AdjustRate($winner->rate, $winner->E, 1); 
      $looser->rate = AdjustRate($looser->rate, $looser->E, 0); 
     } 


     // update the db to update rates, hits for both winner and looser 
      $updateQuery = 'UPDATE user SET rate='.$winner->rate.',hits='.$winner->hits.' WHERE id=' . $winner->id; 
      mysql_query($updateQuery); 

      $updateQuery = 'UPDATE user SET rate='.$looser->rate.' WHERE id=' . $looser->id; 
      mysql_query($updateQuery); 

     // Save to responsedate 
     $responseData->winner = $winner; 
     $responseData->looser = $looser; 
    } 

    //CODE STARTS HERE :) 

    // Setup the mysql connection 
    include 'db.php'; 
    // Part 1: calculate the rate and save to db, if we have a lastcall 
    // GET the last call data object, it has p1, p2, c, these are the items i recieved from my javascript ajax call 
    $lastCall = json_decode((string)$_GET['lastCall']); // it was a JSON object so i need to decode it first 
    // Save last call data, will be sent with the respond as well 
    $responseData->lastCall = $lastCall; 

    // if there is a json object, means that there was a rating process and I have to set the new rates 
    if($lastCall->c != NULL) 
    { 
     setNewRates($responseData->lastCall); 
    } 

    // Part 3: Select new persons and addthem to our responseData 
    $q = Array(); 
    $q[0] = 'SELECT id, name, sex, rate, hits FROM user WHERE fm_status=1 AND sex="female" ORDER BY RAND() LIMIT 2'; 
    $q[1] = 'SELECT id, name, sex, rate, hits FROM user WHERE fm_status=1 AND sex="male" ORDER BY RAND() LIMIT 2'; 

    // girls or boys ? 
    srand(mktime()); 
    $query = $q[array_rand($q)]; 
    $result1 = QueryIntoArray($query); 
    $responseData->user = $result1; 


    // Part 4: encode to JSON/JSONP string then respond to the call 
    $json = json_encode($responseData); 
    $json = isset($_GET['callback'])? "{$_GET['callback']}($json)" : $json; 
    echo $json; 

    mysql_close(); 
    // by Noor Syron :) 
    //I used this in my www.mimm.me 

    ?> 
25

enter image description here

UPDATE:

Jak powiedziałem w komentarzach, Dodałem ten algerithm do mojej nowej stronie internetowej. Z początku wydawało się, że działa doskonale. Ale po kilku dziwnych danych zaczęły się pojawiać dziwne wyniki.

Podczas debugowania zorientowałem się, co robiłem źle. Otrzymując wynik dla "bezpośredniego związku" (używanego w pośredniej relacji) między 2 węzłami, dodałem razem wyniki. Było to źle, wynik bezpośredniej relacji należy wyrazić w -1 do +1, gdzie:

-1 = lost everything 
+1 = won everything 

więc jeśli wygrał 8 razy, B, a B wygrał 2 razy zgodnie wynik powinien być następujący:

(A wins) 8 + (B wins) 2 = (total matches)10 
(delta of -1 and +1 =) 2/(total matches)10 = (points per win) 0.2 
Score of A vs B = (points per win) 0.2 * (wins) 8 - 1 = 0.6 
Score of B vs A = (points per win) 0.2 * (wins) 2 - 1 = -0.4 

także nie wspomnieć o tym w oryginalnym wyjaśnienia, ale to wszystko jest o trójkątów. Kiedy więc spojrzymy na wynik pośredni, nie trzeba iść dalej niż 1 skok.

+1

Witaj Peter, mam wątpliwości co do udostępniania tych informacji. W jednej ręce sądzę, że to informacje należące do ludzkości, dlatego muszę się z wami podzielić. Z drugiej strony są naprawdę duże firmy, które szukają czegoś podobnego do patentu, aby użyć go przeciwko ludziom takim jak ja. Przechowując go na własnym serwerze mogę zalogować wszystkich, którzy patrzyli na stronę i będą mogli z niego korzystać w sali sądowej, jeśli będzie to konieczne. Bardzo mi przykro, ale zachowuję to w ten sposób. – ikwillem

+1

Dobrze, rozumiem. –

+1

Zgaduję, że i tak tutaj dodałeś informacje. Dzięki. –

1

`Zaprojektowałem kod w Perlu z wyszukiwania google i działa.

Oto ona

use strict; 
use warnings; 
use WWW::Mechanize; 
use LWP::Simple; 

sub images() 
{ 
my $mech = WWW::Mechanize->new(); 
my ($site,$count,$file,$dir); 
print "\t\t\tDesigned By NUMWARZ GAMING\n\n"; 
print "Enter the name of the site you want to search for images\t:\n"; 
$site = <STDIN>; 

    print "Enter the folder where you want to save this\t:\n"; 

    $dir = <STDIN>; 

    open my $doc, ">" , $dir."sitelist.txt"; 

    $mech->get($site); 

    my @links = $mech->images(); 

    $count = 0; 

    for my $link (@links) 
    { 
    $file = $dir.$count.".jpg"; 

    mirror($link->url,$file); 

    print $file," : "$link->url,"\n"; 

    print $doc $link->url." ".$file."\n"; 

    $count+=1; 
    } 
    close $doc; 
    exit; 
    } 

images();