【要約】新人研修レビュー170件をどう割振る?数理最適化で全員の希望と公平性を両立した記録 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
従来の新人研修レビュー割り当てには、以下の課題があった。
- ・レビュアの得意分野が考慮されず、本領を発揮できない。
- ・新人に割り当てられるコメント数が偏り、不公平感が生じる。
- ・同一チームのレビュアが割り当てられず、関係構築の機会を逸する。
// Approach
Fixstars Amplifyを用い、以下の2段階アプローチで定式化した。
1.**Step 1: レビュアと課題の割り当て**
- ・決定変数: レビュア $i$ が課題 $j$ を担当するかを示す二次元変数 $q[i, j]$。
- ・目的関数: レビュアの希望度(積極的に担当したい)の最大化。
- ・制約: 各レビュアは1題のみ担当。各課題の必要人数を遵守。
2.**Step 2: レビュア・新人・課題の3次元割り当て**
- ・決定変数: レビュア $r$ が新人 $t$ の課題 $p$ を担当するかを示す三次元変数 $x[r, t, p]$。
- ・目的関数: 職位点数の分散最小化、および同一チーム割り当ての最大化。
- ・制約: 各課題・新人へのレビュア割り当て、レビュアの負担(2〜3件)、同一チーム上限(4人)。
// Result
最適化により、以下の成果を得た。
- ・レビュアの希望を全員が達成。
- ・新人の職位分布を極めて均等に制御。
- ・同一チームのレビュアを最大4名まで割り当て。
- ・実装から結果取得まで、わずか半日で完了。
Senior Engineer Insight
> 複雑な制約を「条件の追加」だけで扱える点が、実務における最大の強みである。特に、3次元の割り当て問題を2段階に分解した設計は、モデルの肥大化を防ぎ、デバッグやパラメータ調整を容易にする優れた判断だ。ただし、Step 1の結果がStep 2の探索空間を制限するため、全体最適が損なわれるリスクは常に考慮すべきである。実戦投入時は、制約間の競合をどう緩和するか、あるいは単一モデルへの統合が可能かを検討する審美眼が求められる。