Модифицированный алгоритм «SM2 +» для рейтинга приложений Flashcard - PullRequest
0 голосов
/ 11 марта 2020

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

Модифицированный алгоритм «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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...