最适合的调度algorithm
我正在编写一个编程难度很大的调度程序。 有几个事件,每个都有多个会议时间。 我需要find一个安排会议时间,使每个时间表包含任何给定的事件一次,使用每个事件的多个会议时间之一。
显然我可以使用暴力,但这很less是最好的解决scheme。 我猜这是一个相对基本的计算机科学问题,一旦我能够开始参加计算机科学课程,我将会了解到这个问题。 与此同时,我更喜欢任何可以阅读的链接,甚至只是一个可以让Google知名的链接。
我想你应该使用遗传algorithm,因为:
- 它最适合于大型问题实例。
- 它会减less不准确答案的价格的时间复杂性(不是最好的)
- 您可以轻松指定约束条件和偏好,通过调整不符合条件的健身惩罚。
- 您可以指定程序执行的时间限制。
-
解决scheme的质量取决于你打算花费多less时间来解决这个计划。
遗传algorithm定义
遗传algorithm教程
具有GA的课程调度项目
有几种方法可以做到这一点
一种方法是做约束编程。 这是feanor提出的dynamic编程的一个特例。 使用专门的库,可以为你做边界和分支,这是很有帮助的。 (Google用于“gecode”或“comet-online”查找库)
如果你是math上的倾向,那么你也可以使用整数编程来解决这个问题。 这里的基本思想是将你的问题转化为一组线性不等式。 (谷歌的“整数编程调度”,以find许多现实生活的例子和谷歌“算盘COIN-OR”为一个有用的图书馆)
我的猜测是约束编程是最简单的方法,但是如果你想在你的问题中包含真正的variables,整数编程是有用的。
你的问题描述不是完全清楚的,但是如果你所要做的只是find一个没有重叠事件的时间表,那么这是一个直接的双方匹配问题。
你有两组节点:事件和时间。 从每个事件到每个可能的会议时间画一条边。 然后,您可以使用增强path高效地构造匹配(节点之间最大可能的一组边)。 这是有效的,因为你总是可以把二部图转换成一个等价的stream图。
这是一个代码的例子是BIM 。 GOBLIN和NetworkX等标准graphics库也有双边匹配的实现。
这听起来像这可能是一个dynamic的编程解决scheme,特别是类似的区间调度问题的一个很好的候选人。
这里有一些关于区间调度问题的视觉效果,这可能会使概念更清晰。 这是一个关于dynamic编程的好教程。