有效的时间表算法

时间:2010-09-24 07:07:46

标签: algorithm

我找到了一份我被要求做的工作,其中包括编写一个程序来确定每个人在某一天工作的地点。

例如,输入可以是:
下午4-6点,现场A
下午1-2点,站点B
9-11am&下午2-4点网站A

基本上可以有很多站点,人们可以在多个块中工作。我觉得这种问题很久以前就已经解决了,所以不要重新发明轮子,我希望有人能指出我的优雅解决方案。

编辑:阅读类似问题我觉得问题可能是NP完成。我不需要最有效的解决方案,只需要有效且合理的东西。

编辑2:为了澄清,输出应该是一个时间表,人们分配这样的差距(没有人工作的实例)尽可能小。

1 个答案:

答案 0 :(得分:3)

看起来您正在尝试解决有相当专业的软件应用程序的问题。如果你的问题足够小,你可以尝试这样的强力方法:

  • 确定问题的粒度。例如。如果这是一个学校时间表,你的粒度可以是1小时。
  • 为每个时间段制作实例除以粒度。因此,对于站点B,将有一个实例(1-2pm),对于大小A,将有许多实例(下午4-5点,下午5-6点,上午9点到10点,上午10点到11点......)。
  • 为您要分配的所有人创建实例
  • 然后迭代地将一个人分配到一个空闲时间段,将所有约束考虑在内(如假期,午休时间,一次只能做一件事,每个站点最多人数......),直到:
    • 您有一个有效的解决方案(很好,打印出来并退出应用程序)
    • 您进入的情况是您仍然需要放置人员,但不再有有效的时段。然后回溯(撤消上一个操作并尝试为其找到替代方案)。

如果您的问题不是太大,您可以在合理的时间内找到解决方案。

但是,如果问题开始变大,请寻找更专业的软件。需要注意的是“基于约束的优化”和“约束编程”。

E.g。 ECLIPSe工具是一个开源约束编程环境。您可以在http://eclipseclp.org/examples/index.html上找到一些示例。你可以找到一个很好的例子是SEND + MORE = MONEY问题。在这个问题中,您有以下等式:

    S E N D
+   M O R E
-----------
= M O N E Y

用字母替换每个字母,以便总和正确。 这也说明虽然你可以解决这个暴力问题,但还有更智能的方法来解决这个问题(见http://eclipseclp.org/examples/sendmore.pl.txt)。