首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SuperMemo (SM-2)中的间隔重复算法

SuperMemo (SM-2)中的间隔重复算法
EN

Stack Overflow用户
提问于 2018-03-01 10:03:35
回答 1查看 10.6K关注 0票数 15

为了在Android中开发一个词汇表练习应用程序,我想在Java中实现SuperMemo (SM-2)算法。这是一个流行的选择间隔重复软件和Anki甚至采用它,据我所知。给出这里的源代码示例很难理解(对我来说),因为缺乏代码格式,而且它是用Delphi编写的。

SuperMemo 的作者:

  1. 将知识分成尽可能小的项目。
  2. 与所有项目关联的E-因子等于2.5。
  3. 使用以下间隔重复项目: I(1):=1 I(2):=6 n>2: I(n):=I(n-1)*EF 其中: I(n) -第n次重复之后的重复间隔(以天为单位), EF -E-给定项目的系数 如果间隔是一个分数,则将其舍入到最近的整数。
  4. 每次重复后评估0-5级的重复反应质量:5-完美反应。 4-犹豫后的正确反应 3-严重困难地回忆起正确的答复 2-不正确的反应;正确的反应似乎很容易回忆。 1-不正确的反应;记住正确的答复 0-完全停电。
  5. 每次重复之后,根据公式修改最近重复项目的E因子: EF':=EF+(0.1-(5-q)*(0.08+(5-q)*0.02)) 其中: EF‘-E因子的新值, 电子因子的旧值, Q-反应的质量在0-5级量表中. 如果EF小于1.3,则让EF为1.3。
  6. 如果质量反应低于3,则从一开始就开始重复,而不改变E-因子(即使用间隔I(1)、I(2)等,就像项目被重新记忆一样)。
  7. 在某一天的每一次重复会议之后,再重复所有在质量评估中得分低于4分的项目。继续重复,直到所有这些项目得分至少4分。

下面是关于堆栈溢出的一些相关(但不同的)问题:

如何在Java中实现这一点?

(我最近一直在做这件事,我想我有一个答案,所以我把它作为一对问答来提出,以帮助其他人做同样的事情。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-01 10:03:35

SuperMemo算法

以下是我们在影响SuperMemo (SM-2)算法 of 间隔重复时要处理的一些条款。

  • 重复--这是用户看到闪存卡的次数。0表示他们还没有研究过,1表示这是他们的第一次,依此类推。在一些文档中,它也被称为n
  • quality --也称为质量评估。这就是闪存卡的难度(用户定义的)。规模从05
  • 易易性--这也被称为易感因子或EFactor或EF。它是用于增加间隔重复的“空间”的乘数。范围从1.32.5
  • interval --这是重复之间的时间长度(以天为单位)。它是间隔重复的“空间”。
  • nextPractice --这是当闪存卡再次出现时的日期/时间

默认值

代码语言:javascript
复制
int repetitions = 0;
int interval = 1;
float easiness = 2.5;

代码

我发现这个Python实现SuperMemo示例源代码更容易理解,所以我或多或少地遵循了这一点。

代码语言:javascript
复制
private void calculateSuperMemo2Algorithm(FlashCard card, int quality) {

    if (quality < 0 || quality > 5) {
        // throw error here or ensure elsewhere that quality is always within 0-5
    }

    // retrieve the stored values (default values if new cards)
    int repetitions = card.getRepetitions();
    float easiness = card.getEasinessFactor();
    int interval = card.getInterval();

    // easiness factor
    easiness = (float) Math.max(1.3, easiness + 0.1 - (5.0 - quality) * (0.08 + (5.0 - quality) * 0.02));

    // repetitions
    if (quality < 3) {
        repetitions = 0;
    } else {
        repetitions += 1;
    }

    // interval
    if (repetitions <= 1) {
        interval = 1;
    } else if (repetitions == 2) {
        interval = 6;
    } else {
        interval = Math.round(interval * easiness);
    }

    // next practice 
    int millisecondsInDay = 60 * 60 * 24 * 1000;
    long now = System.currentTimeMillis();
    long nextPracticeDate = now + millisecondsInDay*interval;

    // Store the nextPracticeDate in the database
    // ...
}

备注

  • 上面的代码没有为easiness设置上限。应该是2.5吗?文档和源代码似乎相互矛盾。
  • 这些文档还让人觉得,如果质量评估小于3,那么就不应该更新易用性因素,但这似乎与源代码相矛盾。在我看来,更新它也更有意义(只要它保持在1.3以上)。不管怎样,我每次都在更新它。
  • Anki的源代码是这里。这是一个很大的项目,但我还没有深入了解他们的算法版本。
  • 这个职位讨论了SM-2的一些问题以及解决这些问题的方法.
票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49047159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档