Исходная реализация алгоритма интервального повторения в 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.