Исходная реализация алгоритма интервального повторения в Java

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

Мой лучший вариант - использовать существующую библиотеку Java. Это может быть довольно просто, мне нужно только вычислить время для следующего повторения. Кто-нибудь слышал о такой инициативе?

Ответ 1

Я не смотрел на реализацию Anki, но вы видели это? quiz-me SRS в Java.

В основном это похоже на

public static void calcuateInterval(Card card) {
  if (card.getEFactor() < 3) {
      card.setCount(1);
  }
  int count = card.getCount();
  int interval = 1;
  if (count == 2) {
      interval = 6;
  } else if (count > 2) {
     interval =  Math.round(card.getInterval() * card.getEFactor());
  }
  card.setInterval(interval);
}

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

Ответ 2

Я изобрел квадратное колесо в своем приложении для флеш-карт. Алгоритм довольно прост: вес элемента - это продукт возрастной составляющей, компонента прогресса и компонента усилия.

Возрастная компонента

Формула A (x) = Cn ^ x, где

  • x - время, прошедшее с момента последнего тестирования элемента,
  • C - это значение, которое вы хотите, когда x равно нулю, и
  • n - константа, основанная на том, насколько быстро вы хотите, чтобы значение увеличивалось по мере увеличения x.

Например, если вы хотите, чтобы значение удваивалось каждые пять дней, n = e ^ (ln (2/C)/5).

Компонент прогресса

Формула P (x) = Cn ^ -x, где

  • x - это число, соответствующее тому, насколько успешно вы были с этим элементом,
  • C - это значение, которое вы хотите, когда x равно нулю, и
  • n - константа, основанная на том, насколько быстро вы хотите, чтобы значение распадалось по мере увеличения x.

Например, если вы хотите, чтобы значение удвоило каждые пять последовательных успехов, n = e ^ (ln (1/2)/- 5).

Компонент усилия

Это принимает одно из двух значений:

  • 10, если вы обнаружили, что ваш последний отзыв элемента "жесткий" или
  • 1 в противном случае.

Прогресс настраивается таким образом:

  • Новые записи начинаются с прогресса 0.
  • Если вы легко найдете ответ, прогресс элемента увеличивается на 1.
  • Если вы находите ответ тяжело, прогресс элемента идет до min (int (предыдущий/2), предыдущий - 1).
  • Если вы ошиблись в ответе, прогресс элемента будет минимальным (-1, предыдущий - 1).

Да, значения могут быть отрицательными.:)

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

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

(Извините за качество картофеля математических выражений. LaTeX здесь запрещено).

Ответ 3

Anki использует алгоритм SM2. Однако SM2, как описано в этой статье, имеет ряд серьезных недостатков. К счастью, их легко исправить.

Объяснение, как это сделать, будет слишком длинным для темы для этого сообщения, поэтому я написал сообщение в блоге об этом здесь. Для этого нет необходимости использовать библиотеку с открытым исходным кодом, поскольку фактическая реализация невероятно проста.

Ответ 4

Вот алгоритм разнесенного повторения, который хорошо документирован и прост для понимания. https://github.com/Jakobovski/SaneMemo

Отказ от ответственности: я являюсь автором SaneMemo.