対象読者:混合整数線形計画(MILP)およびAIエージェントによる構造化入力に関心のある方。
なぜ大学の時間割は「1枚の表」ではなく学年別(4枚)・教員別(10名)・教室別(7室)の複数枚が裏で同時に絡み合うNP困難問題になるのか、そしてGemini Nano(構造化抽出)× WaSHI / HiGHS(厳密求解・矛盾診断)がどのように連携しているのかを解説します。
オペレーションズ・リサーチ(OR)において、大学時間割編成問題(University Course Timetabling Problem; UCTP)はナース・スケジューリング問題(NSP)と並び、国際コンペティション(ITC-2007等)が開催され続ける代表的な実務組合せ最適化問題です。
小学校のクラス時間割なら「1クラス=1枚の表」の中で完結しますが、大学の学部時間割では「1年〜4年の学生カリキュラム(4枚の時間割)」「専任・非常勤10名の教員スケジュール」「定員・PC設備の異なる7つの講義室・演習室」がすべて共通の曜日・時限(週25枠)を奪い合います。ある学年の1コマを動かした瞬間、同じ先生が担当する他学年のゼミや、同じ大講義室を使う別科目が玉突きで衝突します。
| アプリ上の要素 | 実務の大学時間割(UCTP)での意味 | 数理モデル上の表現 |
|---|---|---|
開講科目 c ∈ C(全25科目・計30コマ) |
週1コマまたは週2コマ開講される講義・PC演習・ゼミ | 週間必要コマ数 S_c ∈ {1, 2}、履修者数 Enr_c |
曜日 d ∈ D・時限 p ∈ P・教室 r ∈ R |
月〜金(5日)× 1〜5限(計25枠)× 7室の講義室/PC室 | 4次元0-1決定変数 x_{c,d,p,r} ∈ {0, 1}(計4,375個) |
| 学年別4枚の時間割(1年〜4年) | 各学年の必修・選択必修カリキュラム(Curriculum) | 学年 k のコア科目集合 Core_k の同時開講禁止 |
| 非常勤講師の出講可能曜日・教授会NG枠 | 「小林先生は火・木のみ」「水曜5限は教授会」等の個別制約 | 該当枠の決定変数和を 0 に固定するハード制約 |
| PC演習室必須・大講義室定員制約 | プログラミング演習はPC端末必須、130名講義は大講義室のみ | 不適合教室 r ∉ R_c への割当を禁止(x_{c,d,p,r} = 0) |
| 学生の「空きコマ(中空き)」の最小化 | 1限と3限に必修があり2限が空く「中空き」の解消 | 補助連続変数 gap_{k,d,p} >= 0 によるソフト制約ペナルティ |
| 解なし(Infeasible)時の衝突ルール診断 | 条件の詰め込みすぎで時間割が組めない原因の特定 | 二段階スラック緩和(Elastic Relaxation)による極小衝突集合の抽出 |
科目集合を C(25科目)、曜日集合を D = {Mon, Tue, Wed, Thu, Fri}、時限集合を P = {1, 2, 3, 4, 5}、教室集合を R(7室)とします。科目 c を曜日 d・時限 p・教室 r に割り当てるとき 1、そうでないとき 0 をとる二値決定変数 x_{c,d,p,r} ∈ {0, 1} を定義します。
また表記を簡潔にするため、科目 c が枠 (d, p) のいずれかの教室で開講されるかを表す射影式を u_{c,d,p} = Σ_{r ∈ R} x_{c,d,p,r} と置きます。
x_{c,d,p,r} を学年 k でスライスすれば「学年別の4枚の時間割」になり、教員 prof でスライスすれば「教員別×25コマ一覧表」(式(5)により各マス高々1科目)、教室 r でスライスすれば「教室別×25コマ一覧表」(式(4)により各マス高々1科目)になります。つまり3種類の時間割ビューはすべて同じ4次元テンソル x_{c,d,p,r} の異なる断面(射影)です。
course_consecutive)
通常、週2コマの講義(例:『線形代数学I』『アルゴリズム』)は学習効果のため別々の曜日に分散させます(Σ_{p ∈ P} u_{c,d,p} <= 1)。しかし『ソフトウェア設計演習(C12)』のようなプログラミング演習では、「同じ曜日の連続する2時限(例:火曜2〜3限)にまとめて実施したい」という要望が頻繁に出ます。
これをMILPで表現するため、「曜日 d の時限 p と p+1 の両方で開講されたとき 1 になる補助二値変数 z_{d,p} ∈ {0, 1}(p ∈ {1, 2, 3, 4})」を導入し、以下の線形不等式で連続開講を強制します:
学生にとって「1限と3限に必修授業があり、2限が1コマだけ空いてしまう(中空き)」時間割は不評です。各学年 k・曜日 d・中間時限 p ∈ {2, 3, 4} について、前後の時限 p-1 と p+1 の両方にコア科目があるのに p 限が空いているときだけ 1 以上になる連続スラック変数 gap_{k,d,p} >= 0 を導入します:
運用中の時間割に対して「佐藤先生の金曜午後をNGにして」と1つ条件を追加したとき、関係ない科目の曜日まで全面シャッフルされてしまうと教務現場は大混乱します。微調整モードがONのときは、直前の時間割解で割り当てられていた枠 (c, d^*, p^*, r^*) に対して負の目的関数報酬(-6 * u_{c,d^*,p^*} - 2 * x_{c,d^*,p^*,r^*})を与えることで、変更が必要な最小限のコマだけを移動させます。
このデモでは、LLMに「時間割そのもの」を作らせることは一切していません。4,400変数の組合せ制約をLLMの推論だけで解かせると、教室の定員オーバーや非常勤講師のダブルブッキングが必ず発生するからです。代わりに役割を明確に分離しています:
LanguageModel API):自然言語の要望(「非常勤の小林先生は火・木の午後しか来られないようにして」等)を、responseConstraint(JSON Schema強制)によって型安全な操作コマンド(set_professor_unavailability 等)へ変換します。
model.validateSolution() で全1,601本の制約違反が 0 であることを検算します。
s_i >= 0 を入れた緩和モデルを2通りの重み(Pass 1: 追加ルール優先緩和、Pass 2: 基本ルール優先緩和)で解き、どのルールとどのルールが正面衝突しているかを数理的に特定して提示します。
// WaSHI による 4次元時間割モデル (UCTP) と 二段階スラック緩和診断の骨格
const m = new Model("UniversityCourseTimetabling_UCTP", { solver: "highs" });
// 1. 4次元0-1決定変数 x[course][day][period][room]
for (const c of courses) {
for (const d of ["Mon", "Tue", "Wed", "Thu", "Fri"]) {
for (const p of [1, 2, 3, 4, 5]) {
for (const r of rooms) {
x[c.id][d][p][r.id] = m.binary(`x_${c.id}_${d}_P${p}_${r.id}`);
}
}
}
}
// 2. 教室重複禁止・教員同時担当禁止・学年カリキュラム重複禁止・個別ルールを追加
m.constraint(expr`${sum(roomSlotVars)} <= 1`, `room_excl_${r.id}_${d}_P${p}`);
// 3. 求解と検算 (Infeasible 時は Elastic Relaxation で衝突ルールを特定)
const status = await m.solve({ timeLimit: 4.0, relGap: 0.001 });
const report = m.validateSolution();
Target Audience: Readers interested in Mixed-Integer Linear Programming (MILP) and neuro-symbolic AI copilot architectures.
This article explains why university course timetabling cannot be solved on a single grid—requiring simultaneous coordination across 4 student cohort boards, 10 professor schedules, and 7 specialized rooms—and how Chrome Built-in AI (Gemini Nano) + WaSHI (HiGHS) solve and diagnose it in the browser.
In Operations Research (OR), the University Course Timetabling Problem (UCTP)—standardized in benchmarks such as the International Timetabling Competition (ITC-2007 Curriculum-Based Track)—is one of the most heavily studied NP-hard scheduling problems alongside the Nurse Scheduling Problem (NSP).
Unlike an elementary school homeroom where one class stays together in one room, a university department timetable couples three distinct dimensions across 25 weekly periods (Mon–Fri × Periods 1–5): 4 student cohorts (Years 1–4), 10 faculty members (8 full-time + 2 adjuncts), and 7 heterogeneous rooms (large lecture halls, medium rooms, PC labs, and seminar rooms). Moving a single lecture immediately ripples across other cohorts taught by the same professor and other courses competing for the same lecture hall or PC lab.
| App Element | Real-World Academic Scheduling Meaning | Mathematical Model Representation |
|---|---|---|
Courses c ∈ C (25 courses, 30 weekly sessions) |
Lectures, PC labs, and seminars requiring 1 or 2 sessions/week | Required weekly sessions S_c ∈ {1, 2}, enrollment Enr_c |
Day d ∈ D, Period p ∈ P, Room r ∈ R |
5 days × 5 periods (25 slots) × 7 rooms | 4D binary decision variables x_{c,d,p,r} ∈ {0, 1} (4,375 vars) |
| 4 Cohort Timetables (Year 1 – Year 4) | Compulsory & core elective curriculum per student year | Non-overlapping core curriculum constraints for each cohort Core_k |
| Adjunct Day Limits & Faculty Meeting NG Slots | "Adjunct Prof. Kobayashi only on Tue/Thu", "Faculty meeting Wed P5" | Hard zero-fixing constraints on unavailable (prof, d, p) slots |
| PC Lab Equipment & Hall Capacity Limits | Programming labs require PC rooms; 130-student classes need Large Hall | Forbid incompatible rooms r ∉ R_c (x_{c,d,p,r} = 0) |
| Student Hollow Gap ("Idle Bridge Period") Penalty | Avoiding isolated empty periods between compulsory classes on the same day | Continuous slack variable gap_{k,d,p} >= 0 in the objective |
| Infeasible Conflict Diagnosis (IIS) | Pinpointing exact contradictory rules when no valid timetable exists | Two-pass Elastic Constraint Relaxation via HiGHS |
Let C be the set of 25 courses, D = {Mon, Tue, Wed, Thu, Fri} be the days, P = {1, 2, 3, 4, 5} be the periods, and R be the 7 rooms. We define a 4D binary variable x_{c,d,p,r} ∈ {0, 1} equal to 1 if and only if course c is assigned to day d, period p, and room r.
Defining the slot projection u_{c,d,p} = Σ_{r ∈ R} x_{c,d,p,r} ∈ {0, 1}, the core structural constraints are:
x_{c,d,p,r} by student cohort k produces the 4 Cohort Boards; slicing by professor prof produces the 10 Professors × 25 Slots Matrix (guaranteed at most 1 course per cell by Constraint 5); slicing by room r produces the 7 Rooms × 25 Slots Matrix (guaranteed at most 1 course per cell by Constraint 4).
course_consecutive)
While 2-session lecture courses are normally spread across different days (Σ_{p ∈ P} u_{c,d,p} <= 1), hands-on courses like "Software Design Lab (C12)" often require two consecutive periods on the same day (e.g., Tue Periods 2–3). We introduce binary indicator variables z_{d,p} ∈ {0, 1} for p ∈ {1, 2, 3, 4}:
To prevent students from having a compulsory class in Period 1, an empty Period 2, and another compulsory class in Period 3, we introduce a non-negative continuous slack variable gap_{k,d,p} >= 0 for each intermediate period p ∈ {2, 3, 4}:
When an academic affairs officer adds a single rule mid-planning, reshuffling the entire university timetable is disruptive. When Minimal Perturbation Mode is enabled, each previously assigned session (c, d^*, p^*, r^*) receives a negative objective reward (-6 * u_{c,d^*,p^*} - 2 * x_{c,d^*,p^*,r^*}), keeping unchanged courses in place unless mathematically required to move.
Instead of asking an LLM to guess a timetable (which inevitably violates room capacities or double-books faculty), the copilot separates natural-language understanding from combinatorial optimization:
LanguageModel API): Parses unstructured faculty requests into schema-validated tool calls via responseConstraint.
model.validateSolution().
Infeasible), WaSHI relaxes every hard constraint with non-negative slacks under two complementary weight profiles (prefer_structural and prefer_user) to isolate the exact colliding constraints.
适合读者:对混合整数线性规划(MILP)及神经符号(Neuro-Symbolic)AI 助手架构感兴趣的读者。
本文将解说为什么大学课表无法用“单张表格”解决,而是需要4个年级课表、10位教师课表与7间专业教室在底层同时联动的 NP-Hard 组合优化问题,以及 Chrome 内置 Gemini Nano + WaSHI (HiGHS) 如何在浏览器端实现秒级求解与冲突诊断。
在运筹学(OR)领域,大学课程排课问题(University Course Timetabling Problem; UCTP)与护士排班问题(NSP)并列为最经典的实务组合优化难题,国际排课竞赛(如 ITC-2007)长期围绕该问题展开研究。
与中小学固定班级课表不同,大学院系排课需要在每周25个时段(周一至周五 × 第1〜5节)内,同时协调“大一至大四共4张年级课表”、“8名专任教师与2名外聘兼职讲师的出勤时间”以及“容量与设备各异的7间教室(大阶梯教室、中型教室、PC机房、研讨室)”。只要挪动某一年级的一门课,同一位教授负责的其他年级课程或共用同一机房的实验课就会发生连锁碰撞。
| 应用内要素 | 高校教务排课(UCTP)中的实际含义 | 数学模型中的表达方式 |
|---|---|---|
开课科目 c ∈ C(25门课・共30节) |
每周1节或2节的理论课、PC上机实验课、研讨课 | 每周所需课时 S_c ∈ {1, 2},选课人数 Enr_c |
星期 d ∈ D・节次 p ∈ P・教室 r ∈ R |
周一至周五(5天)× 第1〜5节(25格)× 7间教室 | 四维 0-1 决策变量 x_{c,d,p,r} ∈ {0, 1}(共4,375个) |
| 4张年级课表同屏显示(大一至大四) | 各年级的必修与限选培养方案(Curriculum) | 同一年级核心课程集合 Core_k 的同时段互斥约束 |
| 外聘讲师可出勤日・教研会议禁排时段 | “小林老师仅周二/周四可来”、“周三第5节固定开会”等 | 将对应时段决策变量之和固定为 0 的硬约束 |
| PC机房设备要求・大教室容量限制 | 编程实验必须在PC机房,130人大课必须排在101大教室 | 禁止分配至不满足条件的教室 r ∉ R_c(x_{c,d,p,r} = 0) |
| 减少学生“空堂(中间空课)” | 避免同日第1节和第3节有必修课而第2节孤立空堂 | 引入连续辅助变量 gap_{k,d,p} >= 0 的软约束惩罚项 |
| 无解(Infeasible)时的冲突规则诊断 | 当排课条件互相矛盾时,自动定位哪几条规则发生冲突 | 基于 HiGHS 的两阶段弹性松弛(Elastic Relaxation)诊断 |
设课程集合为 C(25门),星期集合为 D = {Mon, Tue, Wed, Thu, Fri},节次集合为 P = {1, 2, 3, 4, 5},教室集合为 R(7间)。定义四维 0-1 变量 x_{c,d,p,r} ∈ {0, 1}:当课程 c 被排在星期 d、第 p 节、教室 r 时取 1,否则取 0。
记时段投影表达式为 u_{c,d,p} = Σ_{r ∈ R} x_{c,d,p,r} ∈ {0, 1},核心硬约束如下:
x_{c,d,p,r} 按年级 k 切片即可渲染“按年级4张同屏课表”;按教师 prof 切片即可得到“10位教师 × 25时段矩阵”(约束5保证每格最多1门课);按教室 r 切片即可得到“7间教室 × 25时段矩阵”(约束4保证每间教室同一时段最多1门课)。
course_consecutive)
像《软件设计实验(C12)》这样的上机课,往往需要在同一天的相邻两节(如周二第2〜3节)连排。我们引入辅助 0-1 变量 z_{d,p} ∈ {0, 1}(p ∈ {1, 2, 3, 4}),用3组线性不等式精确表达连排要求:
为避免学生同一天第1节和第3节有必修课而第2节空堂,对每个中间节次 p ∈ {2, 3, 4} 引入非负连续松弛变量 gap_{k,d,p} >= 0:
当教务老师在已有课表上追加一条新要求时,若开启“微调模式”,模型会对上一版课表中已排定的位置 (c, d^*, p^*, r^*) 赋予负目标函数奖励(-6 * u_{c,d^*,p^*} - 2 * x_{c,d^*,p^*,r^*}),从而在满足新约束的前提下仅移动最少数量的课程。
本应用没有让大语言模型直接“猜”课表,而是将自然语言理解与严格数学规划解耦:
LanguageModel API):利用 responseConstraint(JSON Schema 约束解码)将自然语言指令转化为类型安全的排课操作指令。
model.validateSolution() 独立验算所有约束零违反。
Infeasible)时,WaSHI 自动为所有硬约束添加非负松弛变量并按两种权重策略求解,精准定位发生碰撞的规则组合。