Pull to refresh

Алгоритм популярности пользователя на сайте — «Нестандартный подход к стандартным вещам»

Reading time 3 min
Views 5.7K
Все видели на сайтах систему рейтинга статей и материалов. Многие ее даже делали сами, но не каждый делал рейтинг людей на сайте.
В этой статье я поведаю как сделать качественную систему рейтинга для пользователей вашего ресурса.



Сначала я проведу линию для вас разных алгоритмов рейтинга:
I — Пользователи получают только "+"
Основные преимущества:
  • Нету заморочек.
  • Минимальные нагрузки на сайт и базу.

Недостатки:
  • один человек, один балл.
  • Личный авторитет на сайте/форуме ничего не стоит. Ты одна единица и все.


II — Пользователи получают "+" и "-"
Больших отличий мало от прошлой системы. Добавилось еще одно поле в базе.
Основные преимущества:
  • Нету заморочек.
  • Минимальные нагрузки на сайт и базу.

Недостатки:
  • один человек, один балл.
  • Личный авторитет на сайте/форуме ничего не стоит. Ты одна единица и все.


III — гипербола от @klim-danilovklim-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).

Всем спасибо. Ищите вдохновление во всем что видите.
Tags:
Hubs:
+68
Comments 56
Comments Comments 56

Articles