Skip to content

Commit 0eb7c4f

Browse files
committed
fix(docs): 修复代码漏洞
1 parent 9b7ff12 commit 0eb7c4f

File tree

3 files changed

+136
-101
lines changed

3 files changed

+136
-101
lines changed

docs/final/algorithm.md

Lines changed: 115 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,69 @@
11
# 核心算法文档
22

33
## 1. 算法概述
4+
45
### 1.1 算法介绍
6+
57
本系统使用遗传算法(Genetic Algorithm, GA)实现智能排课功能。遗传算法是一种模拟自然选择和遗传机制的优化算法,通过不断迭代、进化,寻找最优解或较优解。在排课系统中,遗传算法能够有效处理多约束条件下的复杂排课问题,生成满足各类约束的课程表。
8+
69
### 1.2 算法简要逻辑
10+
711
​1.数据输入阶段
8-
前端提交排课约束条件(课程、教师、教室、时间等)
9-
后端接收并预处理数据,生成排课问题域
12+
- 前端提交排课约束条件(课程、教师、教室、时间等)
13+
- 后端接收并预处理数据,生成排课问题域
1014
​2.种群初始化
11-
随机生成初始种群(多个候选课表)
12-
每个个体表示一种排课方案(教室、教师、时间槽的合法组合)
15+
- 随机生成初始种群(多个候选课表)
16+
- 每个个体表示一种排课方案(教室、教师、时间槽的合法组合)
1317
​3.适应度评估
14-
对每个个体进行约束检测和评分
15-
计算冲突数(如教师时间冲突、教室占用冲突等)
16-
根据冲突情况计算适应度值(冲突越少,适应度越高)
18+
- 对每个个体进行约束检测和评分
19+
- 计算冲突数(如教师时间冲突、教室占用冲突等)
20+
- 根据冲突情况计算适应度值(冲突越少,适应度越高)
1721
​4.迭代优化阶段
18-
​选择(Selection)​
19-
采用轮盘赌选择法,优先保留高适应度个体
20-
适应度越高的个体被选中的概率越大
21-
​交叉(Crossover)​
22-
从父代中选择两个个体,交换部分课程安排
23-
生成新的子代个体,保留优质基因
24-
​变异(Mutation)​
25-
随机调整部分课程的时间或教室分配
26-
引入多样性,避免早熟收敛
22+
- ​选择(Selection)​
23+
- 采用轮盘赌选择法,优先保留高适应度个体
24+
- 适应度越高的个体被选中的概率越大
25+
- ​交叉(Crossover)​
26+
- 从父代中选择两个个体,交换部分课程安排
27+
- 生成新的子代个体,保留优质基因
28+
- ​变异(Mutation)​
29+
- 随机调整部分课程的时间或教室分配
30+
- 引入多样性,避免早熟收敛
2731
​5.结果输出阶段
28-
记录迭代过程中的最优解
29-
最终输出冲突最少的排课方案(适应度最高的)
30-
保存无法避免的冲突
32+
- 记录迭代过程中的最优解
33+
- 最终输出冲突最少的排课方案(适应度最高的)
34+
- 保存无法避免的冲突
3135

3236
## 2. 核心组件与数据结构
3337

3438
### 2.1 主要数据模型
3539

36-
| 数据模型名称 | 数据模型简介 |
37-
| ------------------------------- | ----------------------------- |
38-
| AutomaticClassSchedulingBaseDTO | 表示后端准备数据结束后生成的算法所需所有数据 |
40+
| 数据模型名称 | 数据模型简介 |
41+
| ------------------------------- | ---------------------------------------------------------- |
42+
| AutomaticClassSchedulingBaseDTO | 表示后端准备数据结束后生成的算法所需所有数据 |
3943
| ScheduleDTO | 表示一个完整课程表的解决方案,包含课程安排列表和适应度值。 |
40-
| CourseScheduleDTO | 单个课程的排课方案,包含时间槽与课程安排项的映射。 |
41-
| CourseScheduleItemDTO | 具体的课程安排项,包含课程、教师、教室、班级等信息。 |
42-
| TimeSlotDTO | 时间槽,表示第几周、星期几、第几节课。 |
44+
| CourseScheduleDTO | 单个课程的排课方案,包含时间槽与课程安排项的映射。 |
45+
| CourseScheduleItemDTO | 具体的课程安排项,包含课程、教师、教室、班级等信息。 |
46+
| TimeSlotDTO | 时间槽,表示第几周、星期几、第几节课。 |
4347

4448
### 2.2 关键工具类
45-
| 工具类名称 | 工具类简介 |
46-
| ------------------------- | ----------------------------- |
49+
| 工具类名称 | 工具类简介 |
50+
| ------------------------- | ---------------------------------------------------------- |
4751
| ClassroomSelectionUtil | 教室选择工具类,负责根据课程要求和学生人数选择合适的教室。 |
48-
| ScheduleFitnessCalculator | 适应度计算工具类,评估课程表的质量。 |
49-
| TimeSlotGeneratorUtil | 时间槽生成工具类,生成符合要求的时间安排。 |
50-
| CheckConflicts | 冲突检测工具类,检查各种资源冲突。 |
52+
| ScheduleFitnessCalculator | 适应度计算工具类,评估课程表的质量。 |
53+
| TimeSlotGeneratorUtil | 时间槽生成工具类,生成符合要求的时间安排。 |
54+
| CheckConflicts | 冲突检测工具类,检查各种资源冲突。 |
5155
### 2.3 算法接口
5256

53-
| 接口名称 | 接口简介 |
54-
| -------------------------------- | ---------------------------- |
55-
| GenerateInitialPopulationService | 初始化种群,根据要求初始化符合要求的种群 |
56-
| EvaluatePopulationService | 评估种群,根据要求计算种群的适应度 |
57-
| IterateService | 进化迭代,根据要求对各个种群进行选择,交叉与变异 |
57+
| 接口名称 | 接口简介 |
58+
| -------------------------------- | -------------------------------------------------------- |
59+
| GenerateInitialPopulationService | 初始化种群,根据要求初始化符合要求的种群 |
60+
| EvaluatePopulationService | 评估种群,根据要求计算种群的适应度 |
61+
| IterateService | 进化迭代,根据要求对各个种群进行选择,交叉与变异 |
5862
| BaseGeneticSchedulingLogic | 基础算法,包括冲突检测,根据排课结果创建返回值保存到数据 |
5963
## 3. 算法流程
6064

6165
### 3.1 数据准备阶段 (ScheduleLessonsDataPreparationThread)
66+
6267
```mermaid
6368
flowchart TD
6469
A[开始] --> B[获取基础数据]
@@ -101,118 +106,115 @@ flowchart TD
101106
```
102107

103108
### 3.2 遗传算法执行 (AutomaticClassSchedulingThread)
104-
```mermaid
105109

110+
```mermaid
106111
flowchart TD
107-
108112
    A[初始化种群] --> B[适应度评估]
109-
110113
    B --> C{满足终止条件?}
111-
112114
    C -->|否| D[选择操作]
113-
114115
    D --> E[交叉操作]
115-
116116
    E --> F[变异操作]
117-
118117
    F --> B
119-
120118
    C -->|是| G[获取最优解]
121-
122119
    G --> H[冲突检测]
123-
124120
    H --> I[保存排课数据]
125-
126121
    H --> J[保存冲突数据]
127122
128-
129-
130123
    %% 样式定义
131-
132124
    style A fill:#2196F3,stroke:#1976D2,color:white
133-
134125
    style B fill:#2196F3,stroke:#1976D2,color:white
135-
136126
    style D fill:#4CAF50,stroke:#388E3C,color:white
137-
138127
    style E fill:#FF9800,stroke:#F57C00,color:white
139-
140128
    style F fill:#9C27B0,stroke:#7B1FA2,color:white
141-
142129
    style G fill:#607D8B,stroke:#455A64,color:white
143-
144130
    style H fill:#607D8B,stroke:#455A64,color:white
145-
146131
    style I fill:#4CAF50,stroke:#388E3C,color:white
147-
148132
    style J fill:#FF9800,stroke:#F57C00,color:white
149-
150133
    %% 决策节点样式
151-
152134
    style C fill:#FFF8E1,stroke:#FFC107,color:#333,font-weight:bold
153-
154135
    %% 全局设置
155-
156136
    classDef default font-size:12px
157-
158137
```
159138

160139
## 4. 关键算法实现
140+
161141
### 4.1 种群初始化(GenerateInitialPopulationService)
142+
162143
通过基础数据,对需要排课的每一门课进行初次随机分配:
144+
163145
- 优先对每一门课进行分班处理,由于可能存在一门课的人数过多,若未限定行政班,算法将会根据人数进行分配,最小为30人一个教学班,最大为120人分配教学班,如果超过120人则进行随机分配班级,始终保持教学班人数为30-120人之间;若限定行政班级,算法将会优先按照专业一样的班级进行分班,专业一样的班级优先为一个教学班,若人数少于或超过则进行二次分班,始终保持由行政把你组成教学班人数为30-120人之间。
164146
- (ClassroomSelectionUtil) 为每一个教学班级随机分配一个符合要求的教室,符合人数大小(教室容量大于教学班人数)的,符合课程安排的教室,若基础数据为没有符合的教室,则会优先分配一个人数尽可能符合的教室,若还不存在,则随机分配一个人数尽可能符合的教室,保证每一个教学班都有教室上课。
165147
- 为每一个教学班级随机分配一个老师,根据基础数据获取符合有教学资格的老师(必定存在),通过随机数的分配,随机选择一个老师为这一个教学班级进行上课。
166148
- 以上数据会被存到CourseScheduleItemDTO中作为这门课的基础信息。
167149
- (TimeSlotGeneratorUtil)为每一教学班级分配上课时间槽,根据基础数据中周学时来为课程分配时间槽,根据周学时来自动分配每周上课时间槽,在周学时为奇数的情况下,系统会自动生成单双周补课时间槽(由用户定义单双周),在此基础上生成时间槽列表,存放到CourseScheduleDTO组成一门课程安排。
168150

169151
### 4.2 种群评估 (EvaluatePopulationService)
152+
170153
评估每个课程表解决方案的适应度,主要考虑因素包括:
154+
171155
#### 4.2.1 冲突检测:
172-
​教师冲突检测​:检查同一教师在同一时间是否被分配多个课程,每发现一处冲突给予100分惩罚
173-
​教室冲突检测​:检查同一教室在同一时间是否被分配多个课程,每发现一处冲突给予100分惩罚
174-
​班级冲突检测​:检查同一班级在同一时间是否被分配多个课程,每发现一处冲突给予100分惩罚
156+
157+
1. ​教师冲突检测​:检查同一教师在同一时间是否被分配多个课程,每发现一处冲突给予100分惩罚
158+
​2. 教室冲突检测​:检查同一教室在同一时间是否被分配多个课程,每发现一处冲突给予100分惩罚
159+
​3. 班级冲突检测​:检查同一班级在同一时间是否被分配多个课程,每发现一处冲突给予100分惩罚
160+
175161
#### 4.2.2 时间偏好评估
176-
​偏好时间段匹配​:课程被安排在教师/班级的偏好时间段时,每节课+10分
177-
​非偏好时间段惩罚​:课程被安排在教师/班级的非偏好时间段时:
178-
晚上但不期望晚课:每节课-5分
179-
早上但不期望早课:每节课-3分
162+
163+
1. ​偏好时间段匹配​:课程被安排在教师/班级的偏好时间段时,每节课+10分
164+
2. ​非偏好时间段惩罚​:课程被安排在教师/班级的非偏好时间段时:
165+
1. 晚上但不期望晚课:每节课-5分
166+
2. 早上但不期望早课:每节课-3分
167+
180168
#### 4.2.3 连续课程优化
181-
​连续课程奖励​:对同一班级连续安排2节以上相同课程时,每组连续课程给予(课程数-1)5分的奖励
182-
​合理间隔检查​:理论课与实践课之间至少间隔1天,不符合要求每处-5分
169+
170+
1. ​连续课程奖励​:对同一班级连续安排2节以上相同课程时,每组连续课程给予(课程数-1)5分的奖励
171+
2. ​合理间隔检查​:理论课与实践课之间至少间隔1天,不符合要求每处 -5 分
172+
3.
183173
#### 4.2.4 教室资源优化
184-
​容量匹配度​:计算教室容量利用率:
185-
70%-90%:+5分
186-
90%:+10分
187-
低于70%:-5分
188-
​教室类型匹配​:
189-
匹配课程需求(如实验室对应实验课):+10分
190-
不匹配:-5分
174+
175+
1. ​容量匹配度​:计算教室容量利用率:
176+
- 70%-90%:+5分
177+
- 90%:+10分
178+
- 低于70%:-5分
179+
2. 教室类型匹配​:
180+
- 匹配课程需求(如实验室对应实验课):+10分
181+
- 不匹配:-5分
182+
191183
#### 4.2.5 教师偏好满足
192-
根据教师对时间槽的偏好级别进行评分:
193-
非常期望的时间段:+10分/节课
194-
较期望的时间段:+5分/节课
195-
可接受的时间段:+0分
196-
尽量避免的时间段:-5分/节课
197-
最不期望的时间段:-10分/节课
184+
185+
根据教师对时间槽的偏好级别进行评分:
186+
187+
- 非常期望的时间段:+10分/节课
188+
- 较期望的时间段:+5分/节课
189+
- 可接受的时间段:+0分
190+
- 尽量避免的时间段:-5分/节课
191+
- 最不期望的时间段:-10分/节课
192+
198193
### 4.2.6 适应度公式
199-
适应度 = 基准分(1000)
200-
- (教师冲突数 × 100)
201-
- (教室冲突数 × 100)
202-
- (班级冲突数 × 100)
203-
+ (偏好时间段匹配数 × 10)
204-
- (非偏好晚课数 × 5)
205-
- (非偏好早课数 × 3)
206-
+ (连续课程组数 × (课程数-1) × 5)
207-
- (不合理间隔数 × 5)
208-
+ Σ教室容量加分(按利用率区间)
209-
+ Σ教室类型匹配分(+10或-5)
210-
+ Σ教师偏好分(按偏好级别)
194+
195+
```
196+
适应度 = 基准分(1000)
197+
- (教师冲突数 × 100)
198+
- (教室冲突数 × 100)
199+
- (班级冲突数 × 100)
200+
+ (偏好时间段匹配数 × 10)
201+
- (非偏好晚课数 × 5)
202+
- (非偏好早课数 × 3)
203+
+ (连续课程组数 × (课程数-1) × 5)
204+
- (不合理间隔数 × 5)
205+
+ Σ教室容量加分(按利用率区间)
206+
+ Σ教室类型匹配分(+10或-5)
207+
+ Σ教师偏好分(按偏好级别)
208+
```
209+
211210
### 4.3 选择、交叉与变异 (IterateService)
211+
212212
- **选择操作**:使用轮盘赌选择法,适应度高的个体有更大概率被选中。
213213
- **交叉操作**:将两个父代解决方案的部分课程安排进行交换,生成新的解决方案。
214214
- **变异操作**:随机改变部分课程的时间槽或教室分配,以增加种群多样性。
215+
215216
### 4.4 冲突检测 (BaseGeneticSchedulingLogic)
217+
216218
- **时间冲突检测**:检查相同时间槽是否有资源冲突。
217219
- **教师冲突**:同一教师不能同时出现在不同地点授课。
218220
- **教室冲突**:同一教室不能同时安排多门课程。
@@ -221,16 +223,20 @@ flowchart TD
221223
## 5. 算法优化策略
222224

223225
### 5.1 三种排课策略
226+
224227
系统提供三种排课策略,通过调整算法参数实现不同的优化目标:
228+
225229
- **优化策略**:种群大小200,最大迭代次数1000,交叉率0.8,变异率0.1。
226-
注重排课质量,生成最优解,但耗时较长。
230+
- 注重排课质量,生成最优解,但耗时较长。
227231
- **平衡策略**:种群大小100,最大迭代次数500,交叉率0.7,变异率0.2。
228-
在时间和质量之间取得平衡。
232+
- 在时间和质量之间取得平衡。
229233
- **快速策略**:种群大小50,最大迭代次数200,交叉率0.6,变异率0.3。
230-
快速生成可接受的解决方案,适合临时排课。
234+
- 快速生成可接受的解决方案,适合临时排课。
231235

232236
### 5.2 多约束条件优化
237+
233238
系统支持多种约束条件的组合优化:
239+
234240
- **教师偏好考虑**:尊重教师的时间偏好设置。
235241
- **教室优化**:合理分配教室资源,提高利用率。
236242
- **学生冲突避免**:避免同一班级在同一时间段有多门课程。
@@ -239,22 +245,31 @@ flowchart TD
239245
- **时间槽单双周分配**: 根据奇数周学时自动分配单双周补课
240246

241247
## 6 算法输出与结果处理
248+
242249
### 6.1 排课结果
250+
243251
系统生成的排课结果包含:
252+
244253
- **课程安排列表**:详细的课程安排信息,包括课程、教师、教室、时间等。
245254
- **冲突信息**:如果存在无法避免的冲突,会记录冲突详情。
246255
- **资源利用率**:包括教室利用率、教师工作量分布、时间槽使用率等。
256+
247257
### 6.2 数据持久化
258+
248259
- 将排课结果保存到数据库中的课程安排表和教学班表。
249260
- 记录排课过程中的冲突情况,便于管理员后续处理。
250261
- 临时保存排课结果到Redis缓存,支持查看,便于用户查看结果
262+
251263
## 7. 算法优势与特点
264+
252265
1. **多约束条件支持**:同时处理教师、教室、班级等多种资源约束。
253266
2. **灵活的策略选择**:提供多种排课策略,满足不同场景需求。
254267
3. **教室资源优化**:根据课程类型和学生人数智能分配教室。
255268
4. **冲突处理机制**:识别并记录无法避免的冲突,辅助人工决策。
256269
5. **时间偏好支持**:考虑教师和管理员的时间偏好设置。
257270
6. **连续课程优化**:优先安排连续课程,提高教学效果和资源利用率。
258271
7. **单双周排课**:支持单周、双周排课的特殊情况处理。
272+
259273
## 8. 结论
260-
遗传算法在智能排课系统中的应用,有效解决了高校排课中的复杂约束问题。通过模拟自然选择和遗传机制,系统能够在合理时间内生成满足多种约束条件的课程表,大幅提高排课效率和质量。系统的多策略支持和灵活配置,使其能够适应不同院校、不同场景的排课需求。
274+
275+
遗传算法在智能排课系统中的应用,有效解决了高校排课中的复杂约束问题。通过模拟自然选择和遗传机制,系统能够在合理时间内生成满足多种约束条件的课程表,大幅提高排课效率和质量。系统的多策略支持和灵活配置,使其能够适应不同院校、不同场景的排课需求。

0 commit comments

Comments
 (0)