分配算法帮助,使用Python

时间:2010-05-29 21:39:19

标签: python algorithm allocation

我一直在为学生研究这种通用分配算法。

它的伪代码(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得到一个项目,他排名1,学生B得到一个她排名5的项目,那么他们的本地分配权重是6.如果我们将学生A移动到他的2级项目,因此,学生B被移到她的等级3项目然后权重现在是5. 5&lt; 6这总体上更好。

  • 因此,我从我的学生集合开始,然后开始迭代它们

  • 我从第一个和第二个学生开始,并将他们的项目分配给他们

  • 然后我如上所述计算重量。鉴于权重等于排名,如果两者都排名为1,则权重为2.这是好的,我们希望继续第二和第三学生。

  • 现在,如果权重大于2,表示一个或多个项目的排名大于2,我们会尝试获得更好的版本。

  • 因此,我们选择排名最低的学生,然后将他/她排在一个等级(所以如果他/她排名第一,这会将他降到第2级)

  • 然后我们尝试将另一名学生重新分配到另一名。

  • 现在如果重量比之前的重量更好,那么我们就让它成为新的重量并让他们拥有这些项目。如果它更糟或相等,那么我们只是继续学习下一对学生。

  • 在当地,对于学生来说,这件事情一直在努力,直到达到最低体重并且无法做得更好。

希望这能解释我正在尝试做什么?


所以,问题:

  1. 这是模拟退火的一种修改,但对此的任何评论都会受到赞赏。

  2. 我如何跟踪哪个学生(i)和哪个学生(i + 1)

  3. 如果我的整个学生名单是100,那么事情就会陷入困境(i + 1)= 101,因为没有。我怎么能绕过那个?

  4. 可以发现任何直接的缺陷吗?

  5. 额外信息:

    我的学生词典是这样设计的:

    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}
    

1 个答案:

答案 0 :(得分:3)

似乎Assignment Problem可能对您有用,可以使用Hungarian Algorithm解决(正如您在其他问题中所述:Student-Project allocation algorithms?)。

显然有一个匈牙利算法的python实现:http://pypi.python.org/pypi/hungarian/0.2

我建议只使用一个众所周知且已经实现的算法,而不是试图提出自己的算法。

如果您真的想使用自己的算法并想要使其有效,我建议您清楚地解释您要做的事情,而不仅仅是提供代码。

祝你好运,希望有所帮助。