我需要找到一个算法来找到最好的时间来让我们说一个研究小组。该系统具有关于一组学生及其课程表的信息。系统应该给与会面时间,与任何人的课程时间表没有冲突。什么是解决这个问题的最好方法。我正在寻找任何调度算法,但没有找到合适的人。学生时间调度算法
在此先感谢
我需要找到一个算法来找到最好的时间来让我们说一个研究小组。该系统具有关于一组学生及其课程表的信息。系统应该给与会面时间,与任何人的课程时间表没有冲突。什么是解决这个问题的最好方法。我正在寻找任何调度算法,但没有找到合适的人。学生时间调度算法
在此先感谢
我记得这个问题的最佳解决方案是由遗传算法
产生的解看到此链接http://www.codeproject.com/KB/recipes/GaClassSchedule.aspx
有趣的问题。
这是我会做什么:
然后看起来是这样的,例如:
Student A: 11100000111111100000
Student B: 00000011111000010001
Student C: 00000000111111110001
_______________________________+
11100022333222220002
^^^ ^^^
然后,你需要使用一个简单的循环,其保持当前的轨迹找到所有间隙在阵列中(用零区)零长度。记忆开始和结束索引并将其翻译回来(步骤1的反向)到一个时间区域。
谢谢,我正在寻找更多的算法方法。 – user171034 2010-01-18 16:05:22
+1为简单起见。研究小组的规模和一天中的职位空缺数量足够小,以至于对这个NP问题的大多数暴力方法都是一种选择。对上述解决方案的一个推动是使用整数数组(每个学生一个数组,每个时隙一个整数)并且对时隙值进行求和而不是对它们进行求和,即布尔方式。这个系统允许SUM数组提供更好的选择“第二选择”的指导,即当一些学生不可用时满足可能性。 – mjv 2010-01-18 16:16:14
谢谢,更新了这个例子。 – Pindatjuh 2010-01-18 16:30:13
这是一个匹配的问题,并且可以通过maximum flow algorithm
每个学生和研究组被解决是在一个有向图,并输入用于 一个节点的每个学生具有一个流动单元作为输入,并连接到所有研究组中节点。 每个研究节点组具有无限的输出能力,当网络中的流量是最大的,你有你的正确组合
也Introduction to Algorithms(流网络章)见
每天有24*60 = 1440
分钟。所以你可以很容易地蛮力,因为你不需要超过一分钟的准确度。不过,我要描述一个简单的DP。
您可以创建一个布尔数组来存储该分钟中组的学生是否有班级。你也有第二个数组。该数组存储此块中和左侧的空余数量。所以你可以做的是从右向左遍历布尔数组,如果块中有一个类,则使数字为0,否则将其加1,再加上前一分钟的数字。
不过,我觉得我的解释缺乏的,所以这里是伪代码:
blocked = <boolean array>;
numtoleft = <array containing the counts>;
if blocked[0]:
numtoleft[0] = 0;
else:
numtoleft[0] = 1;
for i = 1 to 1440-1:
if blocked[i]:
numtoleft[i] = 0;
else:
numtoleft[i] = numtoleft[i-1];
然后你可以通过“numtoleft”阵列中发现的最大数量容易找到的最大的开放式插槽,您可以添加限制到你正在看的时代。
编辑:
下面是蟒蛇的算法:
def largestslot(blocked, startminute, endminute):
numtoleft = [0]*1440
numtoleft[startminute] = 0 if blocked[startminute] else 1
for i in xrange(startminute+1, endminute+1):
numtoleft[i] = 0 if blocked[i] else 1
ansmax = max(numtoleft[startminute:endminute+1)
ansi = numtoleft.index(ansmax)
return (ansi-ansmax, ansi)
我不认为这是一个优雅的解决方案。 – user171034 2010-01-18 16:10:05
我将开始一个非常简单的方法是:
现在您的列表包含所有组成员都有其他活动的时间块。因此,您需要查看免费时间表的列表并检查,如果该时间段足够满足所需的会议时间。
每个学生都有一段时间的可用时间。每个人都必须见面(意味着至少有一个小时他们都是免费的)。您只需从第一名学生开始,并与下一名学生相交的可用小时范围内,并为每个学生做到这一点(继续缩小原始范围),并且您应该留下适合每个学生的范围。
我会设置会议持续时间以及何时可以出现在会议有效的时间范围,或之后8:00 AM而不是等到9:30 PM即45分钟时间出发。然后,它应该是一个简单的问题,即将群组成员的空闲时间与找到适合的块匹配。您需要包含重叠的容差,即如果该组的75%能够符合,那么它是可行的。
您可能还需要包括开始/结束时间缓冲,允许旅游等,包括在你的搜索条件的缓冲区。我讨厌大多数会议的一件事是,他们没有考虑到旅行/安装时间,而是把一次会议预定在另一次会议上。
我不认为GA对这个问题会有很大的帮助,因为没有适合评估解决方案的标准。乙醚是空闲的时间段,或者没有。 – 2010-01-18 16:16:16
,因为有一个最佳解决方案可以在小于指数时间内找到,所以GA真的不需要! – Agos 2010-01-18 16:17:59
不,你正在考虑制定一个时间表,这是一个NP-Complete问题。这个问题要简单得多。 :) – JPvdMerwe 2010-01-18 16:20:57