道場「おまかせ」の仕組み

おまかせ(開始モード auto)は、道場プールから初見・練習不足・苦手の3枠を混ぜて出題します。端末に保存された解答履歴を使い、ログインは不要です。このページは実装と同じ数式・手順で説明しています。

設計の意図

冷たい道場プール(まだあまり解いていない)では初見多め。温まると練習不足と苦手の比率を上げ、定着と弱点補強のバランスを取ります。

習熟度 coverage は「その道場プールのうち、道場モードで1回以上解いた問題の割合」です。 レッスンや模試で同じ論点を解いていても、coverage には直接効きません(ただし leaf の統計には効きます。後述)。

3枠の比率は coverage に対して線形に変化します(UCB や Thompson サンプリングなどは使いません)。

学習経験者と初学者の違い

学習経験者
ホームの学習スタイルが「学習経験者」のとき。道場の全問題がおまかせの候補になります。 coverage もこの全プール基準です。
初学者
スタイルが「初学者」のときだけ論点ゲートがかかります。完了レッスンに紐づく論点だけを含む問題に候補を絞り、絞り後のプールで coverage・3枠割当・選定を行います。全問題へのフォールバックはしません。

論点(leaf)の集め方

おまかせは「問題に付いた論点タグ」を、論点ツリー上の末端(leaf)に正規化してから扱います。

問題タグ → leaf への展開
  1. 各問題には topicIds(論点 ID の配列)が付きます。親論点だけ・子だけ・混在があり得ます。
  2. まず「最も具体的なタグ」だけを残します(子と親が両方付いている場合、親は子に飲み込まれます)。
  3. 残った各 ID が leaf ならそのまま採用。親論点なら子孫の leaf すべてに展開します。
  4. leaf が1つも得られない問題は、初学者ゲートでは候補外になります。

例(イメージ)

タグ [商業簿記] → 子孫 leaf {仕訳, 減価償却, …}

タグ [仕訳](すでに leaf)→ {仕訳}

タグ [仕訳, 減価償却] → {仕訳, 減価償却}(問題は両方の leaf を持つ)

初学者ゲート:レッスン完了 → 許可 leaf 集合
  1. 端末のレッスン進捗から、完了したレッスンの ID を集めます。
  2. 各レッスンに TopicLesson で紐づく「ホーム論点」の public ID を集め、許可プール(Set)を作ります。
  3. 道場の各問題について、上の手順で得た leaf の集合が、すべて許可プールに含まれるときだけ残します(any-overlap ではありません)。
  4. 許可プールが空、または該当問題が0件のときは「はじめる」が押せず、案内文が表示されます。

解答履歴の ID と leaf への集約

レッスン・道場・模試の試行は、ソース付き ID で保存され、leaf 統計はソース横断でまとめます。

ソース履歴キーの形おまかせでの使われ方
lessonlesson:<問題ID>leaf の n_eff / 苦手度に寄与。道場の「未挑戦」枠には直接は載らない。
dojodojo:<問題ID>その道場問題を「見た」と coverage にカウント。問題ごとの attemptCount も道場キー基準。
contestcontest:<問題ID>leaf の n_eff / 苦手度に寄与。道場の「未挑戦」枠には直接は載らない。
leaf 統計(aggregateLeafStats)
ツリー上の各 leaf について、全ソースの試行を集め、減衰付きで次を計算します。
  • n_eff — 各試行の減衰重み w の合計(試行回数そのものではない)
  • c_eff — 正解(タイムアウト除く)の w の合計
  • p_hat — ベイズ平均 (c_eff + 1) / (n_eff + 2)
  • weak — 1 − p_hat(高いほど苦手寄り)

重み w = 0.5(経過日数 / 14) (半減期 14 日)

解答の古さ重み w(例)
今日1.000
14日前0.500
28日前0.250

他の開始モードとの違い

モード候補の決め方並び
おまかせ苦手や練習量の少ない問題を分析して出題3枠割当 + フォールバック + leaf 連続抑制
論点選択選んだ論点から出題(未選択は全範囲)論点フィルタ後の通常キュー
間違えた問題各問題の直近の解答が不正解のものだけを出題します。直近不正解のみ(該当なしならモード非表示)

アルゴリズム本体(ステップバイステップ)

planDojoRecommendQueue と同じ順序です。

① 入力:候補問題配列(初学者はゲート後)、論点ツリー、全試行履歴、出題数 N、乱数
② coverage = min(1, 道場で解いた問題数 / 候補プールサイズ) — 道場キーの試行のみ
③ 比率 = recommendSlotRatios(coverage)。問数 = allocateSlotCounts(min(N, プール), coverage)
④ 各問題・各 leaf の統計を計算(減衰・ベイズ平均)
⑤ 3つの候補列を構築(並び順ルールは下表)
⑥ fill:初見枠 → 練習不足枠 → 苦手枠の順に、重複なしで取り出し。足りなければフォールバックループ(同じ3列 + 余り列)
⑦ greedy leaf interleave:残りリストの先頭から、直前と leaf が重ならないものを優先して並べ替え
⑧ 先頭 N 問をセッションの並びとして返す
入る問題 / leaf並び順(優先が左)
初見attemptCount = 0重要度重み付きシャッフル(rank が高いほど先頭に来やすい。乱数キー = U1/(rank+1)
練習不足0 < n_eff < K(K=3)の leaf を持つ問題leaf は 1/(1+n_eff) の降順(n_eff が小さい=練習が薄い leaf を先)→ 各 leaf 内は未挑戦優先 → attempt 少ない → 重要度
苦手n_eff ≥ K の leaf を持つ問題(weak の閾値フィルタはなし)leaf は weak 降順 → 問題は weak 降順 → 未挑戦優先 → 最終解答が古い → 重要度
フォールバック余りまだ取られていない問題初見シャッフル + 既解は lastAt 昇順。枠ラベルは leftoverSlot で再判定
allocateSlotCounts と端数

各枠の生の値 = N × 比率。まず floor を取り、残り問数は小数部が大きい枠から1問ずつ配分(同率なら枠名の辞書順)。

coverage10問の割当(初見 / 練習不足 / 苦手)
0%(道場プールで未着手が多い)8 / 1 / 1
20%7 / 1 / 2
100%(プールの問題は一通り解いた)1 / 3 / 6

習熟度と3枠の比率

初見 = max(10%, 85% − 75% × coverage)

練習不足 = 7.5% + 22.5% × coverage

苦手 = 7.5% + 52.5% × coverage

0%(道場プールで未着手が多い)

初見

比率: 初見 85% / 練習不足 7.5% / 苦手 7.5%

20%

初見
練習不足
苦手

比率: 初見 70% / 練習不足 12% / 苦手 18%

100%(プールの問題は一通り解いた)

練習不足
苦手

比率: 初見 10% / 練習不足 30% / 苦手 60%

3枠の意味(要約)

初見
道場で未挑戦の問題。重要度で偏ったシャッフル。
練習不足
leaf の n_eff が 0 より大きく K 未満。データが少ない論点を先に。
苦手
n_eff ≥ K の leaf。weak で並べるが、枠が足りると「十分サンプルがあるがまだ得意」な leaf も末尾に入り得ます。

leaf 連続抑制

fill 後のリストを、先頭から走査して直前の問題と leaf が重ならない要素を選ぶ貪欲法で並べ替えます。 枠の大まかな順序(初見が先に来る傾向)は保ちつつ、隣接同 leaf を減らします。候補が1 leaf しかないプールでは連続は避けられません。 2問先までの leaf は見ません(隣接のみ)。

おまかせが使っていないもの

  • UCB / Thompson サンプリング / FSRS などの最適探索・記憶モデル
  • 苦手枠での weak 閾値によるハードフィルタ(並び順のみで優先)
  • 初学者ゲート後の「全道場フォールバック」
  • レッスン履歴を coverage の seen に含める処理(意図的に道場プールの冷温で見る)

既知の限界・今後の余地

苦手枠の定義 — n_eff ≥ K の leaf はすべて苦手プールの候補になります。得意な leaf は weak ソートで後方に回るだけで、枠が空くと選ばれることがあります。

coverage とレッスン — レッスンで繰り返していても、道場で未挑戦なら初見枠・高 coverage 扱いにはなりません(leaf 統計にはレッスン試行が効きます)。

初学者と道場のミスマッチ — レッスン完了論点と道場問題の leaf が一致しないと0問になります(全問題フォールバックはしません)。該当0件時は画面に案内を出します。

連続抑制 — 隣接1手先のみ。同一 leaf が3問連続するケースは理論上あり得ます。

将来: スコア一本化・sweet spot 帯・探索アルゴリズムの導入は別フェーズの検討項目です。

道場で試す

各道場の開始画面でモード「おまかせ」を選ぶと、この仕組みで出題されます。

道場一覧へ