Я бы попытался решить проблему простым, но (надеюсь) эффективным способом.
Во-первых, вы обновляете рейтинг учений только тогда, когда голосование отличается от того, что на самом деле ожидает система.Отныне я буду рассматривать только те случаи, когда пользовательский вывод отличается от того, что на самом деле ожидает система.
Во-вторых, я бы придавал больший вес голосам, в которых два уровня имеют большую разницу.Неправильное ожидание для двух esercises с рейтингом 2 и 3 должно иметь меньшее влияние, чем неправильное ожидание для двух упражнений с рейтингом 1 и 5.
Тем не менее, мой алгоритм будет выглядеть следующим образом:
1 - установлен постоянный процент, назовем его increment
.Он устанавливает процент влияния, которое оказывает голос, и может быть изменен в зависимости от количества пользователей.
2- Для «неожиданного» голосования я бы рассчитал разницу между исходными уровнями (минимум 1).
diff = max(1, abs(ex1.level - ex2.level))
3- Я бы обновлял рейтинг каждого упражнения на процент, основываясь на умножении increment
и diff
.
if (ex1 level expected bigger)
ex1.rating = ex1.rating + diff*increment;
else
ex1.rating = ex1.rating - diff*increment;
Рейтинг был бы плавающим, иУровень будет округлять rating
:
ex1.level = round(ex1.rating)
Пример :
Давайте установим increment = 0.1
.exA
, с рейтингом 2,0 и уровнем 2 сравнивается с exB
, рейтингом 3,0 и уровнем 3.
Первый пользователь выбирает exB
как самое сложное.Ничего не меняется, потому что это ожидаемый системой результат.
Второй пользователь выбирает exA
.Это не ожидаемый результат.Разница между этими двумя упражнениями равна 1, поэтому рейтинг изменяется с коэффициентом 1 * 0,1 = 0,1, в результате чего exA.rating = 2.1
для exB.rating = 2.9