# duty_sorted **Repository Path**: observerw/duty_sorted ## Basic Information - **Project Name**: duty_sorted - **Description**: 索思排值班表脚本 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-03-28 - **Last Updated**: 2021-04-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 索思值班表排序脚本 - 数据使用金数据收集,样例表单:https://jinshuju.net/f/OKuTJX - 本脚本输入位金数据导出的csv文件,请将csv文件放在根目录下,并命名为`data.csv` - 目前输出为直接在控制台打印值班表 - 待续... # 算法原理 对于每位部长和每位部员,我们期待将他们尽可能的平均分配至一周30节课的每一天。因此对于$m$位部长和$n$位部员,我们期望每节课的人数为: $$ nums = \lfloor \frac m {30} \rfloor $$ 但我们不能要求在人家没空的时候过来值班,因此在实际情况中,也许某一时间段的空闲人数不够多,这时我们应该**尽可能的让这个时间段的空闲人员来值班**。也即,如果某部员有A和B两个空闲时间段,但A段只有2个人有空,B段有5个人有空,则该部员显然应该优先被排到A段。 接下来要考虑的是算法执行过程中,进行比较的两个时间段中已经被安排了的人数。我们期望每个时间段的值班人数都正好是上述的期望人数,因此若一个时间段达到了期望人数,而另一个没有达到,则无论优先级情况如何,显然都应优先填充那个没达到的那个时间段。如果两个时间段都达到了期望人数,那么也许应该去找第三个时间段。但如果正好有人所有有空的时间段都已经被填满了,那么我们~~不应让他值班~~应该把他排到所有这些时间段中人数最少的那个,以期人数均衡。