Алгоритм Facemash [закрыт]


Кто-нибудь знает алгоритм facemash, который Марк Цукерберг реализовал на своем сайте facemash? http://www.thecrimson.com/article/2003/11/19/facemash-creator-survives-ad-board-the/

Предпочтительно в PHP и MySQL.

Author: Flimzy, 2010-10-03

8 answers

Я не знаю, какой алгоритм на самом деле использовался для реального сайта, но то, что они пишут в окне в фильме, основано на рейтинговой системе Elo, которая возникла в шахматном мире и теперь также используется во многих других играх.

 14
Author: Reid Barton, 2010-10-03 00:39:59

enter image description here

ОБНОВЛЕНИЕ:

Как я уже сказал в комментариях, я добавил этот алгоритм на свой новый веб-сайт. Сначала казалось, что это работает идеально. Но после некоторых странных вводов начал формироваться какой-то странный результат.

Во время отладки я понял, что я делал неправильно. При получении оценки за "прямую связь" (также используемую в косвенной связи) между 2 узлами я сложил оценки вместе. Это было неправильно, оценка прямой связи должна быть выражена в -1 до +1, где:

-1 = lost everything 
+1 = won everything

Таким образом, если A выиграл 8 раз у B, а B выиграл 2 раза у A, счет должен быть:

(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

Также я не упоминал об этом в первоначальном объяснении, но все дело в треугольниках. Поэтому, когда мы смотрим на косвенный результат, вам не нужно идти дальше 1 прыжка.

 26
Author: ikwillem, 2017-02-10 16:38:04

Я воссоздал его, а также проверил. Не уверен насчет php, но класс C# - это

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

Я использовал его на своем

Маска для лица

Код нажатия клавиши

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

});
 5
Author: Luke, 2011-05-18 11:50:58
    <?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

    ?>
 3
Author: Nour Chawich, 2010-12-23 17:05:45

"Я разработал код на Perl полностью из поиска в Google, и он работает.

Вот Оно

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();
 1
Author: Pratik Chowdhury, 2012-12-15 16:37:42

Нет, не здесь и нигде в Интернете. Исходный код Facemash никогда не был опубликован для широкой публики. Единственный, у кого все еще может быть копия, - это сам Марк Цукерберг.

 0
Author: Henrik P. Hessel, 2010-10-03 00:09:15

Здесь доступен клон facemash http://www.facemash.99k.org

 0
Author: abhijeet, 2012-03-23 19:23:58

Я также воссоздал его, но в плагине WordPress

Http://pofornot.com/

Http://codecanyon.net/item/pics-mash-image-rating-tool/3256459?ref=mikemayhem3030

 0
Author: Mike, 2012-12-20 22:26:06