Java中间隔重复算法的开源实现[已关闭]

2022-09-03 00:39:58

我从事一个项目,其中间隔重复是必不可少的,但我不是这个主题的专家,我害怕重新发明方轮。我的研究为我指出了两个不同的系统,即Leitner系统和SM系列算法。
我还没有决定哪个系统最适合我的项目。如果我要采取SM方向,我想我会尝试实现类似于Anki使用的东西。

我最好的选择是使用现有的Java库。这可能很简单,我所需要的只是计算下一次重复的时间。
有没有人听说过这样的倡议?


答案 1

我还没有看过Anki的实现,但你见过这个吗?quiz-me a SRS in 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的算法,请查看Github中Android中Anki的来源。虽然它是GPL,所以你可能需要购买许可证。


答案 2

我确实在自己的抽认卡应用程序中重新发明了方形轮子。该算法非常简单:项目的权重是年龄组件,进度组件和努力组件的乘积

年龄部分

公式为 A(x) = Cn^x,其中

  • x 是自上次测试项目以来的时间(以天为单位),
  • 当 x 为零时,C 是所需的值,并且
  • n 是一个常量,基于您希望值随着 x 的增加而增加的速度。

例如,如果希望该值每五天翻一番,则 n = e^(ln(2/C)/5)。

进度组件

公式为 P(x) = Cn^-x,其中

  • x 是一个数字,对应于您对该项目的成功程度,
  • 当 x 为零时,C 是所需的值,并且
  • n 是一个常量,基于您希望值随着 x 的增加而衰减的速度。

例如,如果希望该值每连续五次成功减半,则 n = e^(ln(1/2)/-5)。

工作量组件

这采用以下两个值之一:

  • 10 如果您发现上次召回该商品是“硬”的,或者
  • 否则为 1。

进度调整如下:

  • 新条目以进度 0 开始。
  • 如果你很容易找到答案,该项目的进度将增加1。
  • 如果你很难找到答案,项目的进度会变为min(int(previous / 2),previous -1)。
  • 如果你得到一个错误的答案,项目的进度将变为min(-1,上一个-1)。

是的,值可以为负数。:)

该应用程序通过从所有项目中随机选择来选择要测试的下一个项目,选择的概率直接随项目的重量而变化。

算法中的特定数字是可调整的。我已经使用我目前的价值观大约一年了,在积累和保留西班牙语,德语和拉丁语的词汇方面取得了巨大成功。

(抱歉马铃薯质量的数学表达式。LaTeX在这里是不允许的。