Механизм подсчета рейтинга и силы

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

Ссылка на файл: http://goo.gl/oWgR9Z Файл с макросами, поэтому excel может ругнуться.

Ну и по порядку.
Рейтинг и сила (блога, пользователя) рассчитывается по формуле:
delta = min + log10(skill + 1) * max / log(maxSkill)

Я упростил формулу для наглядности. По ней видно, что дельта рейтинга (силы) увеличивается на десятичный логарифм значения skil и нормируется, что бы попасть в диапазон min-max – максимального и минимального допустимого значения силы.
К значению skil добавляется 1 для того, что бы получилось положительный результат. Вычисленная дельта добавляется к текущему рейтингу, если голосовали «За» и вычитается из него, если голосовали против.
Само значение skill берется как некоторая часть от силы голосующего пользователя. Например при голосовании в профиле пользователя skill рассчитывается следующим образом:
  • — если сила голосующего от 0 до 50 – skill = сила / 70;
  • — если сила голосующего от 50 до 200 – skill = сила / 40;
  • — если сила голосующего от 200 и выше – skill = сила / 2;

В механизме голосования есть особенность:
  1. При голосовании за комментарий Автору начисляется только Сила;
  2. При голосовании за топик Автору начисляется и Сила и Рейтинг.
  3. При голосовании за блог Владельцу блога ничего в зачет не идет – увеличивается только Рейтинг блога.
  4. При голосовании в профиле за пользователя увеличивается только рейтинг пользователя.

Механизм вроде простой, но при каждом виде голосования свои весовые коэффициенты и результат голосования разный. Что бы разобраться в этом я сделал excel-документ с расчетами. Как им пользоваться?


В верхней части листа кнопки, которые подставляют коэффициенты соответствующего типа голосования, используемые по умолчанию, в таблицу ниже.
Справа находится график, где о оси Х расположена линейка силы голосующего, а по оси Y значение дельты при выбранных коэффициентах.

Слева таблица коэффициентов. Из этой таблицы берутся данные для графика. Что они означают:
Входные данные
  • 1. Сила голосующего пользователя – сила пользователя который голосует за топик, автора, блог, комментарий.
  • 2. Голосуем за или против – собственно, направление голосования.

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

Расчет
В этом блоке представлены три части показателей:
  • желтым – те коэффициенты, которые можно изменить в коде модуля Rating, тем самым более тонко настроив систему голосования под свой проект;
  • светло-серым – промежуточные переменные при расчете итоговых показателей;
  • светло-зеленым – итоговые показатели, идущие в зачет Автору или блогу.
Эти показатели означают следующее:
  • 3. Значение минимально возможного изменения – минимальное значение дельты. Если расчетная дельта будет меньше, то она обнулится.
  • 4. Значение максимально возможного изменения – больше этого значения дельта не будет.
  • 5. Максимальный рейтинг голосующего – значение для нормировки. Предполагается, что это значение, умноженное на «Делитель правого диапазона (см. ниже)» даст рейтинг пользователя при котором дельта будет максимальной (немножко подробнее в комментарии http://altocms.ru/blog/inside/509.html#comment8304).

Следующие блок значений определяет диапазоны силы голосующего и их повышающие коэффициенты. Все возможные значений силы голосующего делятся на три части (по умолчанию это диапазоны до 50, от 50 до 200, от 200 и выше). Когда пользователь голосует за что-либо происходит оценка его силы на предмет попадания в один из этих диапазонов. Все следующие пояснения основаны на дианазонах ..-50-200-…. Эти диапазоны отчетливо видны на графике.
  • 6. Делитель левого диапазона – если сила пользователя меньше 50 и значение этого показателя 100 то для расчета будет браться одна сотая его силы.
  • 7. Делитель среднего диапазона – если сила пользователя от 50 до 200 и значение этого показателя 70 то для расчета будет браться одна семядисятая его силы.
  • 8. Делитель правого диапазона – если сила пользователя от 200 и выше и значение этого показателя 10 то для расчета будет браться одна десятая его силы.

Итоговые показатели
  • 9. Рейтинг силы Автора топика – то значение, которое добавится к рейтингу Автора за его топик.
  • 10. Дельта силы Автора топика – то значение, которое добавится к силе Автора при голосовании за его комментарий, топик или самого Автора.

Изменение рейтинга топика в зависимости от силы голосующего
Немного по другому дело обстоит с рейтингом топика. Здесь в зависимости от силы голосующего рейтинг топика увеличивается на одно из четырех значенй (по умолчанию 1-2-3-4).
Сами диапазоны и их весовые коэффициенты настраиваются аналогично предыдущей таблице.


Пересчет рейтинга блогов
Для формирования рейтинга блога можно использовать механизм принудительного пересчета рейтинга блога. Запускается он в админке, в инструментах. При этом формируется новый показатель рейтинга блога по следующей формуле:
rating = R*k1 + U*k2 + T*k3

В этой формуле:
  • R — cумма рейтинга всех топиков блога;
  • U — количество подписчиков в блоге;
  • T — количество топиков в блоге;
  • k1 — значение $config['module']['rating']['blog']['topic_rating_sum'] конфига;
  • k2 — значение $config['module']['rating']['blog']['count_users'] конфига;
  • k2 — значение $config['module']['rating']['blog']['topic_count'] конфига;


Вот и всё.
Всем удачной работы!

Похожие статьи

  • Alto 1.1: Изменения в рейтинговой системе
    Спасибо большое всем кто принимал и принимает участие в обсуждении существующей в Альто рейтинговой системы. В ней, действительно уже назревали изменения и, было решено их воплотить в жизнь. Сразу скажу, что все...
  • Рейтинг и сила — как это должно работать
    Выношу сюда стихийно возникшее обсуждение И вот еще статьи по теме: Механизм подсчета рейтинга и силы Сила и рейтинг Рейтинг юзеров и блогов Опишу реализацию, к которой я склоняюсь: 1) Модуль рейтингования...
  • Сила и рейтинг
    Наверное ни об одной функции в движке нет столько тем, сколько есть о силе и рейтинге. Причина этому, как мне кажется очень спорная система начисления рейтинга и наличие непонятной для «не хабропользователей»...
  • Как дать возможность голосовать за топики не зарегистрированному пользователю?
    Привет, друзья! И снова я с вопросом, пользователи делятся User Experience'ом, говорят хотим голосовать не авторизируясь или даже не регистрируясь. В общем задача Открыть возможность голосования за топик, всем ...

24 комментария

+4
Спасибо! Давно хотел детально разобраться, а вы сэкономили мне время, да еще и макрос сделали — супер!
+1
Огромное спасибо! Все очень подробно и даже с графиком, то что нужно.

Немного не понял только вот этот момент
5. Максимальный рейтинг голосующего – значение для нормировки. Предполагается, что это значение, умноженное на «Делитель правого диапазона (см. ниже)» даст рейтинг пользователя при котором дельта будет максимальной.

Речь ведь идет о силе? Если я беру это значение 500 * 10 (делитель правого диапазона) = 5000, а затем пытаюсь подставлять значения 5000, 8000, то вижу, что дельта силы или дельта рейтинга все равно продолжает расти. Это просто в экселе не учтено или я не правильно понял?
+2
Вы все правильно поняли, и в экселе все учтено — алгоритм расчета там такой-же как и в Alto.

Тут вот в чем дело — объясню на примере: Пусть некоторый человек работает в организации и у него в трудовом договоре написано, что он получает 500рублей оклада и 5 премий по 100рублей, ну, в зависимости от того, как он поработал. Пусть в этом месяце он заработал 800 рублей — это значит он выполнил норму на 80%. Почему, а потому, что:
1000рублей — 100%
800рублей — Х%

Отсюда: Х=800*100/1000=80(%), где 1000 — максимум того, что человек может заработать.

Теперь ситуация: этот человек спас от банкротства компанию и ему зачислили дополнительную премию — 100рублей, но и всю свою работу он выполнил полностью и получилось, что он выполнил норму на 110%

Применительно к текущему вопросу: Да Вы всё правильно поняли и рейтинг 5000 — максимальный при котором будет достигнут верхний порог диапазона дельты, но никто не запрещает пользователю получить и 10000 рейтинга, в этом случае будет просто 200% дельты.

У этого коэффициента есть и математический смысл — он масштабирует график по оси Y
0
но никто не запрещает пользователю получить и 10000 рейтинга, в этом случае будет просто 200% дельты.

кажется я понял, что просто при 5000 дельта совпадает с параметром «Значение максимально возможного изменения», но тем не менее по факту получается дельта продолжает расти и не имеет максимума…

Тогда получается что вот этот пункт не работает

4. Значение максимально возможного изменения – больше этого значения дельта не будет.
+2
Я, наверное, зря так категорично заявил, но на самом деле смысл этого коэффициента — это верхний порог дельты.

На Вашем примере: рейтинг 5000 — фактически недостижим и я не думаю, что кто-то и за 10 лет работы сайта его перейдет, посмотрите на рейтинги пользователей любого сайта LS или Alto. Я думаю, по этой причине его принудительно и не ограничили. Поэтому, опять же, мое мнение, эти коэффициенты и нужно понимать как верхняя граница дельты и максимально возможный рейтинг пользователя (с учетом делителя диапазона, конечно)
0
Ну да, это я согласен, просто хочется разобраться. К тому же я совершенно точно буду менять этот механизм под свои нужды и у меня может оказаться что «верхний предел» который таковым не является, будет достигнут куда быстрее… Хотя я пока склоняюсь чтобы оставить только рейтинг блогов. В открытых блогах можно оставить рейтинг комментариев, но безотносительно силы пользователя, а как механизм автомодерации.

Кстати а в какой момент и откуда запускается процедура пересчета рейтинга блогов?
Отредактирован:
0
Кстати а в какой момент и откуда запускается процедура пересчета рейтинга блогов?

Упс… пропустил.
Обновил топик, ответ там.
0
Спасибо, а если не принудительно, то откуда запускается, система сама пересчитывает, или это хранимые процедуры, или ...? и как часто происходит пересчет?
0
Чтобы не создавать новый топик, спрошу тут.
У меня пользователь с отрицательным рейтингом (-1) не может писать в свой личный блог.
Вот в конфиге по-умолчанию уставлен параметр
$config['acl']['create']['topic']['limit_rating']         =  -20; // порог рейтинга при котором юзер может создавать топики (учитываются любые блоги, включая персональные), как дополнительная защита от спама/троллинга

Но думаю, что он тут ни при чём.
Базу конвертировал вручную из другого движка, мог где-то накосячить, но надо сначала исключить варианты с настройками в конфиге.
0
При постинге может возникать несколько ошибок и каждая будет писать свой текст. Какой текст ошибки выводится?
— 'Пытаетесь разместить статью в неизвестный блог?',
— 'Вы не состоите в этом блоге!',
— 'Вы еще недостаточно окрепли, чтобы постить в этот блог',
— 'Вы не можете писать в этот блог',
Отредактирован:
0
Ошибка не выводится. При создании топика в выборе блога только один коллективный, личного в списке нет.
Если выставить вручную рейтинг в 0, то в списке появляется личный блог.
Отредактирован:
0
Даже не знаю в чем дело (. Попробую воспроизвести ситуацию у себя. Посмотрите в админке в списке блогов есть его персональный блог?
0
Да, конечно есть.
Если рейтинг 0 поставить — он в списке появляется.
0
Посмотрите в phpMyAdmin в таблице prefix_blog ограничения рейтинга в поле blog_limit_rating_topic. В персональном блоге должно стоять недостижимо низкое число, по умолчанию -1000. У вас, скорее всего, ограничение ==0. Исправьте и все заработает.
0
Именно -1000 и стоит.
0
Пока мысли кончились (.
0
У вас версия 1.0? Посмотрите в админке настройки типов блогов — там тоже устанавливаются минимальные рейтинги на создание, комментирование и т.д. Кажется у меня была такая же история как у вас, толи блог не создавался, толи топик, настройка помогла.
0
Да, как я уже писал — версия февральская.
В настройках персонального блога устанавливается только лимит рейтинга для комментирования…
0
А для создания блога там что стоит — 0? Если поставить -30 проблема не решится?
0
Стоял 0. Поставил -10, ничего не изменилось. Да и относится это к настройке «Могут создавать пользователи», которая выключена.
0
Я понимаю, но я выше написал что у меня нечто похожее было. Что касатеся именно персональных блогов, не все так прозрачно работает и я сам постил пару багов в этой связи. Ладно, не изменилось значит не изменилось.

Настройка «могут создавать пользователи» кстати для персональных блогов не действует. Можете проверить.
Отредактирован:
0
А данный баг у вас на версии 0.9 или уже на 1.0?
0
Версия из гитхаба второй половины февраля.
0
Спасибо за ответ. Сейчас как раз переделываю плагин под 1.0 и проверю обязательно. А вы все же обновите файлы движка, ибо с февраля уже много чего исправили.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.