2010-10-03 39 views

Trả lời

13

Tôi không biết thuật toán nào thực sự được sử dụng cho trang web thực, nhưng những gì họ viết trên cửa sổ trong phim dựa trên Elo rating system, bắt nguồn từ thế giới cờ vua và hiện cũng được sử dụng trong nhiều các trò chơi khác.

+1

Cảm ơn! Trong trường hợp đó, tôi tìm thấy một vài liên kết. PHP: http: //webscripts.softpedia.com/scriptDownload/ELO-Calculator-Download-11611.html & Python: http://github.com/gak/elo-rating-simulator/blob/master//elo.py – ma11hew28

+22

Đó là repo github của tôi :) –

0

Không có ở đây không phải bất cứ nơi nào trên web. Mã nguồn Facemash chưa bao giờ được phát hành ra công chúng. Người duy nhất, người vẫn có thể có một bản sao là bản thân số Mark Zuckerberg.

5

Tôi đã tạo lại nó để kiểm tra. Không chắc về php nhưng C# lớp là

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

tôi đã sử dụng nó trên

Facemash

đang báo chí chính của tôi là

$(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

Nó nói 'như đã thấy trong Mạng xã hội' nhưng có vẻ rất khác. Trong bộ phim có tiêu đề màu đỏ, dày và màu nền trắng. –

+0

cách bạn triển khai việc sử dụng bàn phím bên trái và bên phải. bạn có thể chia sẻ mã cho nó không? –

+0

Wow ... Làm thế nào bạn có được rất nhiều người sử dụng trang web của bạn? @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:

Như tôi đã nói trong các ý kiến, tôi đã thêm algerithm này đến trang web mới của tôi. Lúc đầu nó dường như hoạt động hoàn hảo. Nhưng sau khi một số đầu vào lạ một số kết quả lạ bắt đầu hình thành.

Trong khi gỡ lỗi, tôi đã tìm ra những gì tôi đã làm sai. Khi nhận được điểm số cho một "mối quan hệ trực tiếp" (được sử dụng trong mối quan hệ gián tiếp quá) giữa 2 nút tôi đã thêm điểm số với nhau. Đây là sai, số điểm của một mối quan hệ trực tiếp nên được thể hiện bằng -1 đến +1, trong đó:

-1 = lost everything 
+1 = won everything 

Vì vậy, nếu A thắng 8 lần đến B, và B thắng 2 lần đến A tỷ số nên là:

(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 

Ngoài ra tôi đã không đề cập đến điều này trong lời giải thích ban đầu nhưng đó là tất cả về hình tam giác. Vì vậy, khi chúng ta nhìn vào điểm gián tiếp, bạn không cần phải đi xa hơn 1 hop.

+1

Xin chào Peter, tôi hoàn toàn nghi ngờ về việc chia sẻ thông tin này. Một mặt, ý kiến ​​của tôi là nó là thông tin thuộc về nhân loại, do đó tôi phải chia sẻ với các bạn. Trong tay khác, có những công ty thực sự lớn đang tìm kiếm thứ gì đó như thế này cho bằng sáng chế để sử dụng nó chống lại những người như tôi. Bằng cách giữ nó trên máy chủ của riêng tôi, tôi có thể đăng nhập tất cả mọi người mà nhìn vào trang và sẽ có thể sử dụng nó trong một phòng xử án nếu cần thiết. Tôi rất tiếc nhưng tôi vẫn giữ nó theo cách này. – ikwillem

+1

Tốt, tôi hiểu. –

+1

Tôi đoán bạn đã thêm thông tin ở đây. Cảm ơn. –

1

`Tôi đã thiết kế mã trong Perl tất cả từ tìm kiếm trên google và nó hoạt động.

Dưới đây là Nó

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();