В этой статье я поведаю как сделать качественную систему рейтинга для пользователей вашего ресурса.
Сначала я проведу линию для вас разных алгоритмов рейтинга:
I — Пользователи получают только "+"
- Основные преимущества:
- * Нету заморочек.
* Минимальные нагрузки на сайт и базу.
- * один человек, один балл.
* Личный авторитет на сайте/форуме ничего не стоит. Ты одна единица и все.
- * Нету заморочек.
- Больших отличий мало от прошлой системы. Добавилось еще одно поле в базе.
Основные преимущества:- * Нету заморочек.
* Минимальные нагрузки на сайт и базу.
- * один человек, один балл.
* Личный авторитет на сайте/форуме ничего не стоит. Ты одна единица и все.
- * Нету заморочек.
- Да, это довольно интересная идея но для оценки материала. Но не пользователей.
Основные преимущества:- * «вес каждого плюса или минуса постоянно уменьшается в два раза, в порядке хронологии.
То есть первый юзер ставит плюс весом в +50 балла, следующий ставит плюс весом в +25 балла, минус в -50 балла, минус в -25, минус в -12,5 баллов»
- * Каждый последующий голос уже имеет меньший вес.
* Система еще не закончена.
- * «вес каждого плюса или минуса постоянно уменьшается в два раза, в порядке хронологии.
- Одна из самых распостраненных систем. В основе лежит общая сумма проголосовавших и общий бал деленный друг на друга.
Основные преимущества:- * Система давно проверена и работает.
* Не высокие затраты ресурсов.
- * Пользователю дано право голосовать с минимума до максимума. А обычно по статистике пользователи ставят самый низкий балл или самый высокий.
* Система для оценки исключительно материала.
- * Система давно проверена и работает.
- В основе принципа лежит изменение кармы в сторону плюса или минуса.
Основные преимущества:- * Пожалуй самая лучшая система для оценки пользователей/материала.
* Не высокие затраты ресурсов.
- * И снова. Твой авторитет на сайте/форуме в рейтенговой системе ничего не стоит.
- * Пожалуй самая лучшая система для оценки пользователей/материала.
Зачем изобретать велосипед было, когда уже существуют алгоритмы оценки людей?
— А ответ прост, они не являются корректными когда идет разговор о том, что нужно выделить действительно авторитетных людей на ресурсе.
В основе алгоритма лежит геометрическая фигура «прямоугольного треугольника».
Да порой в геометрии мы можем найти вполне необычные вещи.
Почему был избран именно треугольник?
Дело в том что высота треугольника может соответствовать рейтингу пользователя который ставит оценку.
Длинна треугольнка рейтингу которому ставят оценку. А гипотенуза как раз та разнице между авторитетами пользователей.
Теперь приступим к самому интересному.
Код: Выделить всё
$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/