算法 - 匹配学生考试中心

时间:2012-09-20 06:50:46

标签: algorithm

我有将学生分组到最近的考试中心的问题。以下是条件/约束:

  1. 有X学生和Y考试中心。每个中心将容纳不同数量的学生。
  2. 考试中心总数的最大容量可以大于学生人数,但不能小于。
  3. 学生可以与1个以上的考试中心保持最小距离。
  4. 所有考试中心的考试同时进行。
  5. 例如,有11500名学生和15个考试中心。 5个中心(1至5个)将容纳1500名学生,3个为600(6到8),另外7个(9到15)将容纳350名学生。

    我开发了以下内容:

    1. 一个数据库表,其中包含每个考试中心的学生位置(注册地址)。像下面的东西

      Student ID  Dist-Ex1  Dist-Ex2 ... Dist-Ex14  Dist-Ex15
      1            10         70            20         50
      2            25         43            5          105
      ...
      11499        35         12             35         55
      11500        5          23              5         5
      
    2. 我可以为每个学生添加一个存储最近考试中心的栏目,并创建如下表格:

      Ex centers           Nearest for no. of students
      1                     2000
      2                      500
      ...
      14                     150
      15                     500
      
    3. 但我不知道如何进一步继续。我相信这是一种算法问题。如果有人能给我一些想法,我将不胜感激。

      提前多多感谢!

3 个答案:

答案 0 :(得分:1)

我知道您正在寻找最佳解决方案 - (所有学生都被分配到他们最近的考试中心)。为此,我们会将问题缩小为 max-flow problem

将问题减少到二分 1 G=(V,E),使V = {students} U {examination centers} U {S,T}(所有学生,所有考试中心和两个额外的顶点S和T)。
E = CLOSESTS U {S} X {examination centers} U {students} X {T}(S连接到所有中心,所有学生都连接到T和CLOSESTS - 我们现在将讨论)。
CLOSESTS = { (exam,stud) | exam is the closest examination center to the student sutd}

我们还需要一个权重函数f:E->N,以便:

f(u,v) = capcity if u=S, v=examination center
f(u,v) = 1 if u is examination center and v is student
f(u,v) = 1 if u is student and v is T

结果图应该类似于以下示例:

enter image description here 现在,运行最大流算法,如edmonds-karp。如果最大流量“进入”T是#num_studets,则存在最优解,并且由算法 2 实现的流网络表示。 max-flow算法将查找每个边缘的流量,这相当于如何将学生分配到中心,而不会超出容量限制。

<强>证明:

  • 如果#students有最大流量,则使用所有边(学生,T), 并且所有学生都有一个传入流,因此被分配。此外,每个考试中心最多只有capcity名学生 解决方案有效。
  • 如果最大流量小于#students,则有一个 没有从考试中心获得流量的学生,是 因此没有分配,也没有最佳解决方案。

(1)不完全是一个二分图,因为我们添加了S和T,没有它 - 它是。
(2)根据Integral Flow Theorem,由于所有权重都是整数 - 有一个完整的解决方案。

答案 1 :(得分:0)

我建议你在这里看看遗传算法。

吸纳学生及其作业 你的健身功能可以为重叠较少的学生提供更大的价值。

我以这种方式在大学里实施了学生/日程安排问题,但效果还不错。

所以我相信遗传算法是一种可以实现的方式

祝你好运!

答案 2 :(得分:0)

(我知道这是2年前被问到的,但也许会对某人有所帮助)

使用匈牙利算法(https://en.wikipedia.org/wiki/Hungarian_algorithm)创建二分图可以解决最佳问题:

  • 左侧节点代表学生
  • 右侧节点代表15个中心的席位
  • 从每个学生插入边缘到每个座位,重量=距离中心
  • 然后计算最小重量匹配

问题:您的矩阵大小为11500²。

解决方案:可以使用以下算法在不将中心“扩展”到座位的情况下对问题进行建模(我不会详细介绍):

https://en.wikipedia.org/wiki/Minimum-cost_flow_problem