分配算法帮助,使用Python

4
我一直在为学生们设计这个通用的分配算法。
它的伪代码(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,则我们尝试获取更好的版本。

  • 因此,我们取最低等级的学生,然后将他/她向下移动一个等级(所以如果他/她是第一名,这将使他向下移动到第二名)

  • 然后我们尝试重新分配另一个学生到另一个等级。

  • 现在,如果权重比先前的权重更好,则让它成为新的权重并让他们拥有这些项目。如果它比先前的权重更差或相等,则我们只是转到下一对学生。

  • 在本地,对于学生而言,这个东西会一直尝试,直到达到最小权重并且不能再做得更好。

希望这解释了我想做什么?


问题:

  1. 这有点像模拟退火的修改版,但任何评论都将不胜感激。

  2. 如何跟踪哪个学生是(i),哪个学生是(i + 1)

  3. 如果我的学生总列表为100,则当(i + 1)= 101时,该怎么办,因为没有这样的学生。我该如何规避这种情况?

  4. 可以立即发现的任何缺陷吗?

额外信息:

我的学生字典设计如下:

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}

我对此不是特别熟悉,但您的问题似乎是应用分支定界算法的一个很好的候选者。 - user319799
1个回答

3
似乎分配问题适合您,可以使用匈牙利算法来解决(正如在您的其他问题中所指出的:学生-项目分配算法?)。
显然,有一个匈牙利算法的Python实现:http://pypi.python.org/pypi/hungarian/0.2 我建议您只使用一个已知且已实现的算法,而不是试图自己开发算法。
如果您真的想使用自己的算法并希望获得使其工作的建议,请明确说明您要做什么,而不仅仅提供代码。
祝你好运,希望这有所帮助。

我已经更新了问题,用散文形式解释了我想要做的事情。 - PizzAzzra
1
我喜欢你提到的维基百科文章;显然,OP的问题是一种分配问题。你提到Harold Cooper实现的匈牙利算法(可从PyPI获取)不太准确和有用,因为它实际上是一个Python封装的C++实现,这并不是我所说的Python实现。(这可能对OP有或没有问题,但不能假定每个使用Python的人都能阅读/编译C++。) - John Y
@Moron:感谢你。我真的很感激维基百科的文章——我没有意识到答案已经更新了几次。@John Y:一个纯Python实现会很好,但由于时间紧迫,我将继续使用我已有的东西(最上面的算法)。那个算法有名字吗?它对我来说似乎很直观,所以我相信它早就被某个人开发出来了。 - PizzAzzra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接