Как написать алгоритм, который учитывает 3 взвешенных действия, с затуханием времени? - PullRequest
0 голосов
/ 03 мая 2018

Я заинтересован в создании алгоритма, который обеспечивает ранжирование пользователей на основе 3 действий, которые имеют весовую значимость. Пример:

  • Действие А (50%)
  • Действие B (30%)
  • Действие С (20%)

Затем я хотел бы иметь время, в течение которого максимальное значение поставщика в момент действия будет уменьшаться, и будет уменьшаться до 0 в течение периода, подобного (день / неделя / месяц / год).

Любые предложения о том, с чего начать, как реализовать алгоритм, подобный этому?

Обновления на основе комментариев Джима:

  • значения A, B, C представляют собой совокупное количество точек с одинаковым значением ... количество раз, когда пользователь выполнил действие
  • Компонент времени должен затухать линейно. без ускорения.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Съемка дизайна высокого уровня.

Есть только две причины, по которым оценка пользователя изменится:

  1. Пользователь выполнил какое-то действие; или
  2. Прошла единица времени.

Взаимодействие времени приводит к линейному затуханию .


Алгоритм

Вы пытаетесь ранжировать пользователей на основе оценки, полученной из их вклада в Действия A, B и C. Давайте начнем с описания того, что будет делать программное обеспечение, когда происходит одна из двух причин изменения оценки.


  1. Когда пользователь выполняет действие: Создайте оценки пользователя за оставшееся время, предполагая, что пользователь больше не будет совершать никаких действий, и поместите их в очередь в объекте пользователя. Передняя часть очереди сообщит текущую оценку пользователя.

  2. Когда проходит единица времени: Просто снимите фронт с очереди очков.


Структуры данных

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

Я могу представить себе хэш-карту с двойными связями. Выглядело бы примерно так:

Multi-augmented Data Structure

Итак, на приведенной выше диаграмме у нас есть одно общее хранилище, содержащее все пользовательские объекты. Затем у нас есть несколько однократно / двусвязных индексов в хранилище пользователя Таким образом, все индексы, связанные с объектом пользователя, будут обновляться при изменении оценки пользователя.


Наконец, можно разрешить ранжирование не обязательно начиная с 1. Sorted-concurrent-hashmap может быть обновлено и может содержать отрицательные ранги. Поскольку карта отсортирована, самый отрицательный ранг будет первым рангом, и дальнейшие ранги могут быть получены путем прохождения отсортированной карты. Ранги можно нормализовать, чтобы они начинались с некоторого высокого положительного числа, когда минимальный ранг приближается к пределу недостаточного потока.


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


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

0 голосов
/ 03 мая 2018

Любые предложения о том, с чего начать

Очевидное решение - отслеживать каждое событие вместе с отметкой времени для этого события. Тогда остальное просто математика. Однако для этого может потребоваться больше памяти и больше времени вычислений, чем желательно.

Так что я предлагаю использовать биннинг. Если общий период затухания составляет один день, используйте 12 двухчасовых корзин. Например, в полночь первый контейнер (который представляет период времени с 00:00 до 02:00) очищается. Затем любые события, происходящие до 2:00 утра, обновляют счетчики ABC в этой корзине. Контейнер имеет полный вес до 2:00 утра, после чего он уменьшается в весе, пока не будет очищен в полночь.

Если период времени составляет неделю, используйте 7 ежедневных корзин или 14 полудневных корзин. В течение одного месяца используйте 15 двухдневных корзин или 10 трехдневных корзин. В течение года используйте 12 ежемесячных корзин.

...