我一直在为学生们设计这个通用的分配算法。
它的伪代码(Python 实现)如下:
简单来说,这个算法会尝试从最优先的项目开始分配。它的工作方式是,在一组大约有100个项目中,您列出10个您想要做的项目。因此,第10个项目不会是“总体上最不受欢迎的”,而是在他们选择的集合中最不受欢迎的,这还不错。
显然,如果无法分配一个项目,学生就会回到基本情况,即未分配任何项目,排名为11。
我正在计算分配“质量”,基于排名的加权和。因此,数字越低(即更高优先级的项目),分配质量越好(即更多的学生有高度优先的项目)。
这就是我目前所拥有的。简单而且有效。
现在我正在研究这个算法,试图在局部范围内最小化分配权重(很抱歉,这个伪代码有点凌乱)。
这可能会起作用的唯一原因是,我的“搜索空间”并不特别大(这只是一个非常普遍的观察结果)。由于该项目仅适用于我们系,因此我们有自己的限制。因此,学生人数不能超过100人,偏好数也不会超过10个。
它的伪代码(Python 实现)如下:
for a student in a dictionary of students:
for student preference in a set of preferences (ordered from 1 to 10):
let temp_project be the first preferred project
check if temp_project is available
if so, allocate it to him and make the project unavailable to others
break
简单来说,这个算法会尝试从最优先的项目开始分配。它的工作方式是,在一组大约有100个项目中,您列出10个您想要做的项目。因此,第10个项目不会是“总体上最不受欢迎的”,而是在他们选择的集合中最不受欢迎的,这还不错。
显然,如果无法分配一个项目,学生就会回到基本情况,即未分配任何项目,排名为11。
我正在计算分配“质量”,基于排名的加权和。因此,数字越低(即更高优先级的项目),分配质量越好(即更多的学生有高度优先的项目)。
这就是我目前所拥有的。简单而且有效。
现在我正在研究这个算法,试图在局部范围内最小化分配权重(很抱歉,这个伪代码有点凌乱)。
这可能会起作用的唯一原因是,我的“搜索空间”并不特别大(这只是一个非常普遍的观察结果)。由于该项目仅适用于我们系,因此我们有自己的限制。因此,学生人数不能超过100人,偏好数也不会超过10个。
for student in a dictionary/list/whatever of students:
where i = 0
take the (i)st student, (i+1)nd student
for their ranks:
allocate the projects
and set local_weighting(N) to be sum(student_i.alloc_proj_rank, student_i+1.alloc_proj_rank)
these are the cases:
if N is 2 (i.e. both ranks are 1):
then i += 1 and
and continue above
if N > 2 (i.e. one or more ranks are greater than 1):
let temp_N be N:
pick student with lowest rank
and then move him to his next rank
and pick the other student and reallocate his project
temp_N is sum of the the ranks
if temp_N is < N:
then allocate those projects to the students
i += 1
and move on for the rest of the students
更新:根据评论:
我想做什么:
我试图在两个学生组之间实现“最低权重分配”(即本地)
权重分配是由学生分配的等级总和。我们希望学生能够获得他们整体上排名最高的项目。因此,如果学生A获得了他排名第一的项目,学生B获得了她排名第五的项目,则它们的本地分配权重为6。如果我们将学生A移动到他的第二个排名项目,因此,学生B被移动到她的第三个排名项目,那么权重现在为5。 5 <6,这是整体更好的。
因此,我从我的学生集合开始迭代
我从第一个和第二个学生开始,并为他们分配项目
然后我按上述方式计算权重。鉴于权重等于等级,如果两者都排名第一,则权重为2。这是最好的,我们要转向第二个和第三个学生。
现在,如果权重大于2,表示一个或多个项目的排名大于2,则我们尝试获取更好的版本。
因此,我们取最低等级的学生,然后将他/她向下移动一个等级(所以如果他/她是第一名,这将使他向下移动到第二名)
然后我们尝试重新分配另一个学生到另一个等级。
现在,如果权重比先前的权重更好,则让它成为新的权重并让他们拥有这些项目。如果它比先前的权重更差或相等,则我们只是转到下一对学生。
在本地,对于学生而言,这个东西会一直尝试,直到达到最小权重并且不能再做得更好。
希望这解释了我想做什么?
问题:
这有点像模拟退火的修改版,但任何评论都将不胜感激。
如何跟踪哪个学生是(i),哪个学生是(i + 1)
如果我的学生总列表为100,则当(i + 1)= 101时,该怎么办,因为没有这样的学生。我该如何规避这种情况?
可以立即发现的任何缺陷吗?
额外信息:
我的学生字典设计如下:
students[student_id] = Student(student_id, student_name, alloc_proj, alloc_proj_rank, preferences)
where preferences is in the form of a dictionary such that
preferences[rank] = {project_id}