A simple pjoject.
- Python 64.2%
- Vue 29.5%
- JavaScript 3.3%
- CSS 2.8%
- HTML 0.2%
| Algorithm | ||
| Backend | ||
| Data | ||
| Database | ||
| Frontend | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile.backend | ||
| LICENSE | ||
| README.md | ||
| requirements.txt | ||
🎓 智慧排课系统
基于遗传算法的高校智慧排课系统,支持多约束条件、多方案生成与对比、前端可视化及手动微调。
技术栈
| 层次 | 技术 |
|---|---|
| 前端 | Vue 3 + Vite + Element Plus + Vue Router |
| 后端 | FastAPI + Uvicorn + WebSocket |
| 算法 | Python 遗传算法(自实现) |
| 数据库 | PostgreSQL 16 + SQLAlchemy 2.0 |
| 容器化 | Docker + Docker Compose |
项目结构
Archiproj/
├── Data/ # 原始 Excel 数据
├── Database/ # 数据库模块
│ ├── db_config.py # 连接配置
│ ├── models.py # SQLAlchemy ORM 模型(10张表)
│ ├── create_tables.py # 建表脚本
│ └── import_data.py # Excel 批量导入
├── Algorithm/ # 遗传算法
│ ├── chromosome.py # 染色体 / 基因数据结构
│ ├── constraints.py # 硬约束 + 软约束检测
│ ├── fitness.py # 适应度函数
│ ├── operators.py # 选择 / 交叉 / 变异算子
│ └── scheduler.py # 算法主入口
├── Backend/ # FastAPI 后端
│ ├── main.py # 应用入口(CORS、路由注册)
│ ├── schemas.py # Pydantic 数据模型
│ └── routers/
│ ├── data.py # 基础数据 CRUD 接口
│ ├── schedule.py # 排课触发 / 方案管理
│ └── ws.py # WebSocket 进度推送
├── Frontend/ # Vue.js 前端
│ ├── src/
│ │ ├── api/index.js # Axios 封装 + WS 工厂
│ │ ├── router/index.js # 路由配置
│ │ ├── components/
│ │ │ └── WeeklyTable.vue # 周课表核心组件
│ │ └── views/
│ │ ├── RunScheduleView.vue # 启动排课 + 实时进度
│ │ ├── SolutionsView.vue # 方案管理(确认/删除)
│ │ ├── ScheduleView.vue # 课表视图 + 手动调整
│ │ ├── CompareView.vue # 多方案对比
│ │ └── DataManageView.vue # 数据管理(教师/班级/教室/任务)
│ ├── Dockerfile.frontend
│ └── nginx.conf
├── Dockerfile.backend
├── docker-compose.yml
└── requirements.txt
快速启动
方式一:Docker Compose(推荐)
# 1. 启动所有服务(数据库 + 后端 + 前端)
docker-compose up -d
# 2. 导入示例数据
docker exec schedule_backend python -m Database.import_data --data-dir Data
# 3. 访问前端
# http://localhost
# 4. 访问 API 文档
# http://localhost:8000/docs
方式二:本地开发环境
前置要求
- Python 3.11+
- Node.js 18+
- PostgreSQL 16
1. 安装 Python 依赖
pip install -r requirements.txt
2. 配置数据库
编辑 Database/db_config.py 或设置环境变量:
# Windows (cmd)
set DB_HOST=localhost
set DB_PORT=5432
set DB_NAME=schedule_db
set DB_USER=postgres
set DB_PASS=postgres
# Linux/macOS
export DB_HOST=localhost
...
3. 初始化数据库并导入数据
# 建表
python -m Database.create_tables
# 导入示例数据
python -m Database.import_data --data-dir Data
4. 启动后端
uvicorn Backend.main:app --reload --host 0.0.0.0 --port 8000
5. 启动前端
cd Frontend
npm install
npm run dev
# 访问 http://localhost:5173
功能说明
排课流程
启动排课页 → 配置参数 → 触发 GA → WebSocket 实时进度
→ 生成 N 个备选方案 → 方案管理页查看
→ 选择方案查看课表 → 手动微调 → 确认方案
遗传算法约束
硬约束(必须满足)
| 编号 | 约束描述 |
|---|---|
| H1 | 同一教师不能在同一时间排两门课 |
| H2 | 同一教室不能在同一时间排两门课 |
| H3 | 同一班级不能在同一时间排两门课 |
| H4 | 教室容量 ≥ 教学班人数 |
| H5 | 教室类型需符合课程要求(机房/多媒体/实训室) |
| H6 | 教师与班级须在同一校区上课 |
软约束(尽量满足)
| 编号 | 约束描述 | 权重 |
|---|---|---|
| S1 | 连排课安排在相邻节次 | 50 |
| S2 | 优先使用指定教室 | 30 |
| S3 | 优先使用指定时间 | 30 |
| S4 | 高优先级课程安排在早节次 | 20 |
| S5 | 课程在各天均匀分布 | 10 |
| S6 | 避免教师连续多节排课 | 10 |
时间节次定义
| 节次槽 | 对应节次 | 时间段 |
|---|---|---|
| 1 | 第 1-2 节 | 08:00–09:40 |
| 2 | 第 3-4 节 | 10:00–11:40 |
| 3 | 第 5-6 节 | 14:00–15:40 |
| 4 | 第 7-8 节 | 16:00–17:40 |
| 5 | 第 9-10 节 | 19:00–20:40 |
主要 API
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/semesters |
获取学期列表 |
GET |
/api/teachers |
教师列表(支持姓名/院系筛选) |
GET |
/api/classrooms |
教室列表(支持类型/容量筛选) |
POST |
/api/schedule/run |
触发排课(返回 job_id) |
GET |
/api/schedule/jobs/{job_id} |
查询排课进度 |
GET |
/api/schedule/solutions |
获取方案列表 |
GET |
/api/schedule/timetable |
按班级/教师/教室查询课表 |
PUT |
/api/schedule/items/{id} |
手动调整排课条目 |
POST |
/api/schedule/solutions/{id}/confirm |
确认排课方案 |
WS |
/ws/schedule-progress/{job_id} |
实时进度推送 |
完整 Swagger 文档:http://localhost:8000/docs
数据库表结构
| 表名 | 说明 |
|---|---|
departments |
部门/院系 |
majors |
专业 |
classes |
班级 |
teachers |
教师 |
courses |
课程库 |
buildings |
教学楼 |
classrooms |
教室 |
scheduling_tasks |
排课任务 |
schedule_solutions |
排课方案集 |
schedule_items |
排课结果条目 |
开发说明
调整 GA 参数
在 Algorithm/scheduler.py 的 DEFAULT_PARAMS 中修改:
DEFAULT_PARAMS = {
"population_size": 100, # 种群大小(越大效果越好,但越慢)
"max_generations": 300, # 最大代数
"n_solutions": 5, # 输出方案数量
"stagnation_limit": 50, # 停滞终止代数
...
}
重置数据库
python -m Database.create_tables --drop # 删除所有表
python -m Database.create_tables # 重新建表
python -m Database.import_data # 重新导入数据