Алгоритм популярности пользователя на сайте

Distructor
Администратор
Все видели на сайтах систему рейтинга статей и материалов. Многие ее даже делали сами, но не каждый делал рейтинг людей на сайте.
В этой статье я поведаю как сделать качественную систему рейтинга для пользователей вашего ресурса.

Сначала я проведу линию для вас разных алгоритмов рейтинга:

I — Пользователи получают только "+"
  • Основные преимущества:
    • * Нету заморочек.
      * Минимальные нагрузки на сайт и базу.
    Недостатки:
    • * один человек, один балл.
      * Личный авторитет на сайте/форуме ничего не стоит. Ты одна единица и все.
II — Пользователи получают "+" и "-"
  • Больших отличий мало от прошлой системы. Добавилось еще одно поле в базе.
    Основные преимущества:
    • * Нету заморочек.
      * Минимальные нагрузки на сайт и базу.
    Недостатки:
    • * один человек, один балл.
      * Личный авторитет на сайте/форуме ничего не стоит. Ты одна единица и все.
III — гипербола от klim-danilov
  • Да, это довольно интересная идея но для оценки материала. Но не пользователей.
    Основные преимущества:
    • * «вес каждого плюса или минуса постоянно уменьшается в два раза, в порядке хронологии.
      То есть первый юзер ставит плюс весом в +50 балла, следующий ставит плюс весом в +25 балла, минус в -50 балла, минус в -25, минус в -12,5 баллов»
    Недостатки:
    • * Каждый последующий голос уже имеет меньший вес.
      * Система еще не закончена.
IV — среднее статистическое
  • Одна из самых распостраненных систем. В основе лежит общая сумма проголосовавших и общий бал деленный друг на друга.
    Основные преимущества:
    • * Система давно проверена и работает.
      * Не высокие затраты ресурсов.
    Недостатки:
    • * Пользователю дано право голосовать с минимума до максимума. А обычно по статистике пользователи ставят самый низкий балл или самый высокий.
      * Система для оценки исключительно материала.
V — плавающая система
  • В основе принципа лежит изменение кармы в сторону плюса или минуса.
    Основные преимущества:
    • * Пожалуй самая лучшая система для оценки пользователей/материала.
      * Не высокие затраты ресурсов.
    Недостатки:
    • * И снова. Твой авторитет на сайте/форуме в рейтенговой системе ничего не стоит.
Теперь я внесу свою лепту.
Зачем изобретать велосипед было, когда уже существуют алгоритмы оценки людей?
— А ответ прост, они не являются корректными когда идет разговор о том, что нужно выделить действительно авторитетных людей на ресурсе.

В основе алгоритма лежит геометрическая фигура «прямоугольного треугольника».
Да порой в геометрии мы можем найти вполне необычные вещи.

Почему был избран именно треугольник?
Дело в том что высота треугольника может соответствовать рейтингу пользователя который ставит оценку.
Длинна треугольнка рейтингу которому ставят оценку. А гипотенуза как раз та разнице между авторитетами пользователей.

Теперь приступим к самому интересному.

Код: Выделить всё

$a = 254; // Рейтинг пользователя голосующего
$b = 47;  // Рейтинг пользователя получающего голос

/* Установим стандартные цифры, которые можно встретить на любом форуме*/


if($b<=0){ $b=1; }
/* Проверяем наличие нуля и отрицательного числа в переменной $b */

###    Получаем квадрат стороны А * 2    ###
$aInSquare = ($a * 2) * ($a * 2);

/* Сейчас вы спросите, а почему мы увеличиваем значение переменной в 2 раза?
Методом научного тыка, я увидел что когда у переменной $a число больше в 2 раза, то и результат получается более естественным */

###    Получаем квадрат стороны B    ###
$bInSquare = $b * $b;


###Получаем квадрат стороны гипотенузы    ###
$cInSquare = $bInSquare + $aInSquare;



###    Получаем длину гипотенузы###
$c = sqrt($cInSquare);


$result = (int) round($c / $b);
/* Делим полученный результат гипотенузы на содержимое стороны $b и сводим значение в целое с помощью округления и превращения числа в int */

if($result > $b / 2){ $result = (int) round($b / 2); }
/* Проверим чтоб пользователю не прилетело слишком много баллов. Если ему поставл очень авторитетный человек, то карма максимум возрастет на 50% */


var_dump($result);
/* А в конце мы получим ответ 11, это число как раз адекватно поднимит карму пользователя. */
 

Может кто-то спросит. А почему не использовал формулу $result = ($a * 2) / $b;?
Данная формула не адекватно работает когда $a меньше $b более чем в 2 раза.

В течении пары месяцев мной будет закончено написание проекта (об этом я напишу после закрытого бета-тестирования).
Алгоритм будет проверен на реальном проекте, где это критически необходимо.

Итог:

После тысячи тестов с $a = rand(0,99999); $b = rand(0,99999);
я пришел к паре багов:
1й — делить на 0.
Исправил if($b<=0){ $b=1; }

2й — когда получающий пользователь имеет 1 балл, и получает от пользователя с 1000, то его объем получающегося становится 2000
Исправил if($result > $b / 2){ $result = (int) round($b / 2); } Максимум можно увеличить на 50%.

Бенчмарк Code-Igniter не дал результатов нагрузки (0,0000).

Всем спасибо. Ищите вдохновление во всем что видите.

источник: http://habrahabr.ru/blogs/php/107685/
Вернуться к началу