A simple pjoject.
  • Python 64.2%
  • Vue 29.5%
  • JavaScript 3.3%
  • CSS 2.8%
  • HTML 0.2%
Find a file
2026-04-12 21:16:45 +08:00
Algorithm New code 2026-04-12 21:16:45 +08:00
Backend New code 2026-04-12 21:16:45 +08:00
Data Architect 2026-04-12 19:25:37 +08:00
Database New code 2026-04-12 21:16:45 +08:00
Frontend New code 2026-04-12 21:16:45 +08:00
.gitignore Initial commit 2026-04-12 19:21:08 +08:00
docker-compose.yml New code 2026-04-12 21:16:45 +08:00
Dockerfile.backend New code 2026-04-12 21:16:45 +08:00
LICENSE Initial commit 2026-04-12 19:21:08 +08:00
README.md New code 2026-04-12 21:16:45 +08:00
requirements.txt New code 2026-04-12 21:16:45 +08:00

🎓 智慧排课系统

基于遗传算法的高校智慧排课系统,支持多约束条件、多方案生成与对比、前端可视化及手动微调。

技术栈

层次 技术
前端 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:0009:40
2 第 3-4 节 10:0011:40
3 第 5-6 节 14:0015:40
4 第 7-8 节 16:0017:40
5 第 9-10 节 19:0020: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.pyDEFAULT_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            # 重新导入数据