web-dev-qa-db-fra.com

Algorithme de masque facial

Est-ce que quelqu'un connaît l'algorithme de masque facial que Mark Zuckerberg a implémenté dans son site de masque facial? http://www.thecrimson.com/article/2003/11/19/facemash-creator-survives-ad-board-the/

De préférence dans PHP & MySQL.

18
ma11hew28

Je ne sais pas quel algorithme a été réellement utilisé pour le site du monde réel, mais ce qu'ils écrivent sur la fenêtre du film est basé sur le système de notation Elo , qui est originaire du monde des échecs et est maintenant également utilisé dans de nombreux autres jeux.

15
Reid Barton

enter image description here

METTRE À JOUR:

Comme je l'ai dit dans les commentaires, j'ai ajouté cet algorithme à mon nouveau site Web. Au début, cela semblait fonctionner parfaitement. Mais après quelques entrées étranges, un résultat étrange a commencé à se former.

Pendant le débogage, j'ai compris ce que je faisais mal. Lors de l'obtention du score pour une "relation directe" (utilisée également dans la relation indirecte) entre 2 nœuds, j'ai ajouté les scores ensemble. C'était faux, le score d'une relation directe devrait être exprimé de -1 à +1, où:

-1 = lost everything 
+1 = won everything

Donc, si A a gagné 8 fois contre B et B a gagné 2 fois contre A, le score devrait être:

(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

De plus, je n'ai pas mentionné cela dans l'explication originale, mais il s'agit de triangles. Donc, quand nous regardons le score indirect, vous n'avez pas besoin d'aller plus loin que 1 saut.

28
ikwillem

Je l'ai recréé et vérifiez-le. Pas sûr de php mais la classe C # est

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

Je l'ai utilisé sur mon

Facemash

Le code de pression des touches est

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

});
6
Luke
    <?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

    ?>
4
Nour Wolf

`J'ai conçu le code en Perl à partir de la recherche Google et cela fonctionne.

Voici

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
Pratik Chowdhury

voici un clone de facemash disponible http://www.facemash.99k.org

0
abhijeet

Non, pas ici, nulle part sur le Web. Le code source de Facemash n'a jamais été rendu public. Le seul, qui pourrait encore avoir une copie est Mark Zuckerberg lui-même.

0
Henrik P. Hessel
0
Mike