我有将学生分组到最近的考试中心的问题。以下是条件/约束:
例如,有11500名学生和15个考试中心。 5个中心(1至5个)将容纳1500名学生,3个为600(6到8),另外7个(9到15)将容纳350名学生。
我开发了以下内容:
一个数据库表,其中包含每个考试中心的学生位置(注册地址)。像下面的东西
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
我可以为每个学生添加一个存储最近考试中心的栏目,并创建如下表格:
Ex centers Nearest for no. of students
1 2000
2 500
...
14 150
15 500
但我不知道如何进一步继续。我相信这是一种算法问题。如果有人能给我一些想法,我将不胜感激。
提前多多感谢!
答案 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
结果图应该类似于以下示例:
现在,运行最大流算法,如edmonds-karp。如果最大流量“进入”T是#num_studets,则存在最优解,并且由算法 2 实现的流网络表示。 max-flow算法将查找每个边缘的流量,这相当于如何将学生分配到中心,而不会超出容量限制。
<强>证明:强>
capcity
名学生
解决方案有效。(1)不完全是一个二分图,因为我们添加了S和T,没有它 - 它是。
(2)根据Integral Flow Theorem,由于所有权重都是整数 - 有一个完整的解决方案。
答案 1 :(得分:0)
我建议你在这里看看遗传算法。
吸纳学生及其作业 你的健身功能可以为重叠较少的学生提供更大的价值。
我以这种方式在大学里实施了学生/日程安排问题,但效果还不错。
所以我相信遗传算法是一种可以实现的方式
祝你好运!
答案 2 :(得分:0)
(我知道这是2年前被问到的,但也许会对某人有所帮助)
使用匈牙利算法(https://en.wikipedia.org/wiki/Hungarian_algorithm)创建二分图可以解决最佳问题:
问题:您的矩阵大小为11500²。
解决方案:可以使用以下算法在不将中心“扩展”到座位的情况下对问题进行建模(我不会详细介绍):