MOTIS

一款专注于辅助浙江大学学生优化选课课表的软件

MOTIS: Multi-criteria Optimization Tool for Intelligent Scheduling

python contributors star 文档对应版本 license

介绍

相信很多同学和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 (*╹▽╹*)