MOTIS用户手册v1.0.2
MOTIS
一款专注于辅助浙江大学学生优化选课课表的软件
MOTIS: Multi-criteria Optimization Tool for Intelligent Scheduling

介绍
相信很多同学和lz一样都在选课时经历过下面这些情境:
- 面对选课系统满屏的红色冲突来回调整课表
- 来回翻阅chalaoshi,难以决定选择哪个教学班
- 常常想,要是这门课没选上,我的课表会不会更好呢
除了这些情境以外,还有很多的情境令人感到精疲力竭。
MOTIS的目标就是:在用户描述出自己的心愿后,能够自动选出最符合心愿的课表。
本软件支持的全部功能如下
- 帮你选你还没选的课程
- 帮你优化已经选上的课程
要实现上述两个功能,需要将课程添加到
愿望清单
中
- 可以探索“某门已选上的课程退选后的情况”
要实现这个功能,要使用“假设没选xxxx课程”的指令
理解软件关键概念
如果要使用本软件,最好要理解本软件的选课实现方法。阅读本部分不要求有编程基础。下面将顺着思路简要介绍选课算法的思路。
愿望清单
如果想让软件帮你选课,你必然要先告诉软件你要选哪些课。本软件中有一个愿望清单
,你可以向其中添加课程
。
为了精准锁定要选哪个课,本程序需要你提供课程代码
,例如MATH1136G
,而不是课程名称
。
描述课程需求
向愿望清单
中添加课程
后,我们可以描述一下对这个课程有什么个人的需求。比如喜欢哪些老师,不喜欢哪些上课时间之类。
程序如何评价一个教学班是好还是坏?
程序底层有一套评分系统
,用于给每个教学班评出一个分数。对同一门课程来说,得分越高的教学班被认为是越好的。
评分系统
给课程打分会从三个方面考虑:教师好坏
/时间好坏
/选上概率
- 程序从chalaoshi获取数据,给评分高的老师更高
教师评分
。此外,用户配置的课程需求(喜欢哪些老师之类)也会影响教师评分
- 程序比对教学班的上课时间与用户设定的
期待的上课时间
与不喜欢的上课时间
,给符合时间期望的教学班加时间评分
- 程序比较同一门课程所有教学班的选上概率,将各班选上概率映射到[0, 1],得到
概率评分
得到这三个分数后,程序将三者分别乘以对应权重并相加,得到最终这个教学班的分数。
这里的权重也是可以更改的。这属于“描述课程需求”的一部分。
越高的概率权值会导致程序越偏向于选择选上概率大的班级。也就是采取保守的志愿选择策略。
程序如何评价一个课表是好还是坏?
程序底层有一套评分系统
用于给一个课表打分。得分越高的课表被认为是越好的。
课表的评分如何计算出来呢?我们考虑到下面的问题:
- 不是所有课程都能放在同一高度比较。例如微积分和一些水课肯定是没法直接相比的,因为两者重要性不同。
- 为了尽量选更多的课,选上的课多的课表是相对好的。
基于此,我们采用优先级
的概念。
优先级也属于“描述课程需求”的一部分
我们可以往愿望清单
中添加很多课程,同时要给这些课程设置优先级
,从而标记哪些课相对更重要些。
程序会将课表里优先级
相同的课程的班级的评分相加,得到各下优先级的评分
。
评分系统
的目标是:选出高优先级得分高的课表。
为了确保程序选出更多的课,评分系统
保证:教学班的评分是大于0的。
程序如何选出最优的课表?
现在我们已经知道如何判断哪个课好、哪个课表好了。那么只需要采用枚举算法,也就是将各个教学班尝试插入课表,然后给课表评分,最终就能试出最优课表。
程序内部使用深度优先搜索算法(当然你不知道这是什么也不影响)实现枚举。
再回顾课程需求描述
如果你已经阅读并理解了上面的描述,那么你应该知道:
- 程序基于
评分系统
运行,给每个课程与课表打分,然后不断尝试,直至试出最佳课表。 - 用户描述的课程需求会影响到
评分系统
给教学班评的分数,最终影响选出的课表。
本程序支持的所有课程需求如下所示:
- 课程的选择优先级
- 课程的上课教师(指定上课教师/指定避免的上课教师/配置喜欢哪些老师/配置不喜欢哪些老师)
- 课程的上课时间(配置期待的上课时间/不期待的上课时间/要求三个志愿的上课时间一致)
- 课程的志愿选择策略(3个志愿怎么分配,选几个热门班级)
- 更改
教师好坏
/时间好坏
/选上概率
三个变量对于你来说的重要性。(可以让程序更偏向选择选上概率大的课程之类)
其中志愿选择策略
上面并没有涉及。但这项也很好理解。一门课程可以选3个志愿,你可以决定其中热门班级、冷门班级的数量分配。
一个描述选课心愿的示例
你可以描述如下面这样的选课心愿:
假设没选ME1002F这门课。
我要选MATH1136G这门课,这门课最重要,优先级是10,我想上朱静芬老师的课的课,这门课可以选的大胆一点。
我要选PHY1001G这门课,优先级为9。
我要选MATH1138F这门课,优先级为9
我要选ME1002F这门课,优先级为7
我要选CS1241G这门课,优先级为7
我要选PPAE1100G这门课,优先级为5,这门课最好在晚上第一节课上课。
心愿描述代码怎么解决?
对于不会书写Python代码的同学
可以借助AI的力量。
用记事本或其他软件打开readme.md
文件,将里面的文字喂给AI,并附上你对课程的描述,即可让AI生成心愿描述代码。
经测试,deepseek可以胜任这个任务。
对于想自己书写心愿描述代码的同学
readme.md
本身是开发文档。看这个就能学会。
LICENSE
MIT LICENSE
CONTRIBUTORS
xi2p
项目源代码地址
https://github.com/xi2p/ZJU-MOTIS/
期待你的加入开发!
如果我的程序有帮助到您,希望可以在Github上给我的项目一个Star (*╹▽╹*)