25

我正在写一个编程难度很大的调度程序。有几个事件,每个都有多个会议时间。我需要找到一个安排会议时间,使每个时间表包含任何给定的事件一次,使用每个事件的多个会议时间之一。最适合的调度算法

显然我可以使用蛮力,但这很少是最好的解决方案。我猜这是一个相对基本的计算机科学问题,一旦我能够开始参加计算机科学课程,我将会了解到这个问题。与此同时,我更喜欢任何可以阅读的链接,甚至只是一个可以让Google知名的链接。

+2

调度问题一般是NP完全的,这意味着你不能做得更好*(我们认为)*比蛮力更好。不过,我不确定这个更具体的问题。 – 2010-04-30 17:07:57

+7

确实,这些问题通常是NP完全的,因此没有有效的算法来获得最优解,但是有效的算法在大多数情况下可以得到相当好的答案。就关键词而言,我可能会寻找“垃圾箱装箱问题”,尽管它不太正确。您也可以尝试搜索“课程调度算法”并查看您找到的内容。 – 2010-04-30 17:12:34

+1

“每个时间表”?所以你想找到所有可能的方式来参加所有活动? – Beta 2010-04-30 17:15:18

回答

11

我认为你应该使用遗传算法,因为:

+0

所有的答案看起来都非常好。我选择这一个,因为这是我不熟悉的头脑最容易理解的一个。感谢大家! – stillinbeta 2010-05-01 16:28:58

3

您的问题描述并不完全清楚,但如果您所要做的只是找到一个没有重叠事件的计划,那么这是一个直接的bipartite matching问题。

您有两组节点:事件和时间。从每个事件到每个可能的会议时间画一条边。然后,您可以使用augmented paths有效地构建匹配(节点之间最大可能的一组边)。这是有效的,因为你总是可以将二部图转换为等价的流图。

这样做的代码示例是BIM。标准图形库,如GOBLINNetworkX也有双边匹配的实现。

2

这听起来像这可能是一个dynamic programming解决方案,特别是类似于interval scheduling问题的一个很好的候选人。

对于区间调度问题,有一些视觉here具体,这可能会使概念更清晰。 Here是一个关于整体动态编程的好教程。

5

有几种方法可以做到这

一种方法是做约束编程。这是feanor建议的动态编程的特例。使用可以为你做边界和分支的专门库是很有帮助的。 (谷歌的“gecode”或“彗星在线”来找到库)

如果你是数学上的倾向,那么你也可以使用整数编程来解决这个问题。这里的基本思想是将你的问题转化为一组线性不等式。 (谷歌的“整数编程调度”,以找到许多现实生活中的例子和谷歌“算盘COIN-OR”为一个有用的库)

我的猜测是约束编程是最简单的方法,但整数编程是有用的,如果你想要在某个时候在你的问题中包含实际变量。

+0

BTW:我不会使用遗传编程来完成这样的任务:1)遗传算法有点慢2)它们有点难以调试,因为它不总是收敛到全局最优。 – nielsle 2010-06-09 10:18:39