Я не знаю, как изменить код для моей адаптации приложения с флэш-картой, которое использует старый алгоритм для возврата данных с флэш-карты, основываясь на простоте, а не на уровне сложности, которая возвращает более точный результат. По мнению авторов, аргументы должны быть изменены следующим образом. Полный расчет отображается по ссылке ниже. Мне нужна ваша помощь в преобразовании кода для отражения нового алгоритма.
Модифицированный алгоритм «SM2 +» http://www.blueraja.com/blog/477/a-better-spaced-repetition-learning-algorithm-sm2
Вот новый алгоритм со всеми выше улучшения на месте. Для каждого элемента обзора сохраните следующие данные: • затруднение: плавание - насколько сложно элемент, начиная с [0.0, 1.0]. По умолчанию 0,3 (если программа не может определить лучший вариант по умолчанию для элемента) • daysBetweenReviews: float - сколько дней должно пройти между попытками просмотра этого элемента • dateLastReviewed: datetime - последний раз, когда этот элемент был просмотрен
Когда пользователь хочет просмотреть элементы, выберите первые 10 ~ 20 элементов, упорядоченные по убыванию в процентах по времени (как определено ниже), отбрасывая элементы, просмотренные за последние 8 или около того часов.
После попытки элемента выберите показатель PerformanceRating из [0.0, 1.0], где 1.0 - лучший. Установите точку отсечения для ответа «правильный» (по умолчанию 0,6). Затем установите ...
def get_next_due_date(self, rating):
""" Supermemo-2 algorithm realization.
http://www.blueraja.com/blog/477/a-better-spaced-repetition-learning-algorithm-sm2
Args:
easiness (int) - answer rating (0=worst, 5=best)
Returns:
next_due_date,easiness,consec_correct_answers (tuple) - information
to update Flashcard data
"""
**# user does self-eval after review of item
correct = (rating >= 3)
blank = (rating < 2)
# performance rating calc
easiness = self.easiness - 0.8 + 0.28*rating + 0.02*rating**2
if easiness < 1.3:
easiness = 1.3
if correct:
consec_correct_answers = self.consec_correct_answers + 1
# next_due_date to review item
interval = 6*easiness**(consec_correct_answers-1)
elif blank:
consec_correct_answers = 0
interval = 0
else:
consec_correct_answers = 0
interval = 1
next_due_date = timezone.now() + timedelta(days=interval)
return next_due_date, easiness, consec_correct_answers
def save(self, rating=None, *args, **kwargs):
if rating:
result = self.get_next_due_date(rating)
self.next_due_date = result[0]
self.easiness = result[1]
self.consec_correct_answers = result[2]
# Call the "real" save() method.
super(Flashcard, self).save(*args, **kwargs)**
@receiver(post_save, sender=User)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)