2014-02-14 2 views
4

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

Спасибо за любую помощь.

ответ

3

Вы можете просто сделать его линейное отображение, используя следующее уравнение:

points = 50 * 100/time_in_ms

Это будет дает вам:

  • time_in_ms=100ms =>50 Баллы
  • ...
  • time_in_ms=10min =>0.0083 точки
  • ...
  • time_in_ms=+∞ =>0 точки

Вы можете легко настроить вышеприведенное уравнение, если диапазоны времени и указывает изменения.

+0

Есть ли способ растянуть точку, чтобы они не уменьшались так быстро? Примерно через 5 секунд мы достигнем отметки <1 балл. – jbassking

+3

Вы можете взять лог или квадратный корень времени и отрегулировать '100'. Например, если вы используете 'points = 50 * 10/sqrt (time)', вы все равно получите 50 очков за 100 мс, а 5 секунд - примерно 7 очков. Он не ударил бы 1 очко до 250 секунд или чуть более четырех минут. – Geobits

+0

Perfect. Благодаря! – jbassking

0

Я думаю, что у вас есть два варианта:

  1. Если вы действительно хотите, чтобы иметь возможность назначать очки за любой промежуток времени, выбрать формулу, которая делит количество точек по количеству времени , например:

    points = [max_number_of_points]/[time] 
    

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

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

2

Вы можете каким-то образом преобразовать задержку, прежде чем применять линейное сопоставление, чтобы быстрее и медленнее давать точки раньше. Одним из вариантов было бы сделать логарифм времени до сих пор. Другим вариантом может быть функция , которая быстро увеличивается с 0 при x = 0, но позже замедляется, когда она приближается к A по мере увеличения x, но не достигает ее. (При этом увеличивается, и вы хотите, уменьшается, но вы можете исправить это с линейной функцией - очевидный пример точки = A - Ax/(A + x))

Например, если вы установите A=10 затем

f(0) = 10 - 10*0/(10 + 0) = 10, 
f(1) = 10 - 10/11 = 9 1/11, 
f(2) = 10 - 20/12 = 8 1/3, 
f(100) = 10 - 1000/110 = 10/11 

и так далее..

+0

Можете ли вы привести пример, пожалуйста? – jbassking

+0

Я добавил один к ответу – mcdowella

+0

Ссылка, которую вы предоставили, сломана. –

0

Все, что должно быть сделано с некоторой задержкой, если набор записей слишком велик.

Предположим, что вы постоянно получаете время, затраченное на пользователя в потоке, вы держите дорожку в размере max за период, и у вас также есть другая система, которая оценивает точки динамически.

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

Логика точки . Расчет:

Мы ясно видим его в качестве обратной линейной зависимости от времени, затраченного Таким образом, вы знаете, что все записи со значением времени, равный среднему вычисленной выше получает 25 по шкале от 1 - 50.

Следовательно, для данной записи предположим, что 100 мс, где максимальное значение составляет 500 мс, answ er будет 50 * (500 - 100)/500

Смежные вопросы