问题描述
底部的三个时间如何设置呢,怎么样的时间间隔才算合理?
这三个时间间隔是由 Anki 的安排算法计算得出的。
关于 Anki 算法的通俗介绍可以看这篇文章:
叶峻峣:Anki 算法与术语浅谈嫌简单?那继续往下看吧!
Anki 术语
新卡片
graduating interval: 新卡片学习以 'Good' 结束后进入复习阶段的第一个间隔
easy interval: 新卡片学习以 'Easy' 结束后进入复习阶段的第一个间隔
starting ease: 初始间隔基数,默认 250%
复习
easy bonus: 简单奖励系数,默认 130%
interval modifier: 间隔系数修饰,默认 100%
maximum interval: 最大间隔
hard interval: 'Hard' 间隔系数,默认为 120%
遗忘
new interval: 遗忘间隔系数
minimum interval: 遗忘最小间隔
leech threshold: 顽固卡片遗忘次数门槛
leech action: 对顽固卡片的处理
Anki 算法
初始化
间隔系数 = 初始间隔基数,默认为 250%
again/重来
新间隔 = 上次规划间隔 * 遗忘间隔系数
间隔系数减少 20%
hard/困难
新间隔 = 上次规划间隔 * 'Hard' 间隔系数
间隔系数减少 15%
good/一般
新间隔 = (上次规划间隔 + 延迟 ) * 间隔系数
间隔系数不变
easy/简单
新间隔 = (上次规划间隔 + 延迟) * 间隔系数 * 简单奖励系数
间隔系数增加 15%
early/提早
新间隔 = (上次规划间隔 - 提早) * 间隔系数 * 提早奖励系数
提早奖励系数 = (简单奖励系数 - 100%) / 2 + 100%
间隔系数由具体选项确定
通用
规划间隔 = 新间隔 * 间隔系数修饰
code/代码
def _rescheduleRev(self, card: Card, ease: int, early: bool) -> None:
# update interval
card.lastIvl = card.ivl
if early:
self._updateEarlyRevIvl(card, ease)
else:
self._updateRevIvl(card, ease)
# then the rest
card.factor = max(1300, card.factor + [-150, 0, 150][ease - 2])
card.due = self.today + card.ivl
# card leaves filtered deck
self._removeFromFiltered(card)
def _nextRevIvl(self, card: Card, ease: int, fuzz: bool) -> int:
"Next review interval for CARD, given EASE."
delay = self._daysLate(card)
conf = self._revConf(card)
fct = card.factor / 1000
hardFactor = conf.get("hardFactor", 1.2)
if hardFactor > 1:
hardMin = card.ivl
else:
hardMin = 0
ivl2 = self._constrainedIvl(card.ivl * hardFactor, conf, hardMin, fuzz)
if ease == BUTTON_TWO:
return ivl2
ivl3 = self._constrainedIvl((card.ivl + delay // 2) * fct, conf, ivl2, fuzz)
if ease == BUTTON_THREE:
return ivl3
ivl4 = self._constrainedIvl(
(card.ivl + delay) * fct * conf["ease4"], conf, ivl3, fuzz
)
return ivl4
以上就是 Anki 算法的介绍,关于它的前身 SuperMemo 2 算法的诞生,可参阅以下文章:
叶峻峣:04 SuperMemo 1.0: 日志 (1987)