调度应用程序中的约束图变换

时间:2009-11-20 10:35:32

标签: algorithm language-agnostic graph scheduling constraint-programming

我正在开发一个交互式作业调度应用程序。给定一组具有相应容量/可用性配置文件的资源,一组要在这些资源上执行的作业以及一组约束,这些约束确定作业顺序和作业的最早/最晚开始/结束时间我想让用户手动移动周围的工作。基本上我希望用户能够“抓住”作业网络的节点并在不违反任何约束的情况下及时向前/向后拖动它。

该图显示了一个简单的示例配置。最后的三角形作业表示所有作业的最新完成时间,作业之间的连接线对作业施加顺序,灰色/绿色条表示资源可用性和负载。

您可以拖动任何作业来压缩计划。请注意,由于容量配置文件不同,作业的长度会发生变化。

我已经实现了一种有效的ad-hock算法。但是仍然存在失败并违反某些限制的情况。然而,由于作业车间调度是一个研究很充分的领域,有很多算法和启发式方法可以找到一般的NP难问题的最优(或相当好)的解决方案 - 我认为解决方案应该存在于我更容易的子集中。我已经研究了约束编程主题甚至基于物理的解决方案(通过静态关节连接的刚体),但到目前为止找不到合适的东西。任何指针/提示/提示/搜索关键词对我来说?

4 个答案:

答案 0 :(得分:1)

如果您有问题,我强烈建议您查看Mozart Oz 仅处理整数。 Oz对有限域有很好的支持 约束规范,推理和优化。在你的情况下 通常你会做以下事情:

  1. 以声明方式指定约束。在这,你会的 指定所有变量及其域(例如V1:1#100,表示 V1变量可以取1--100的范围内的值。一些变数 可能有值直接,比如说V1:99。另外你要指定 所有对变量的约束。

  2. 询问系统解决方案:任何满足的解决方案 约束或最佳解决方案。然后你会显示这个 用户界面上的解决方案。

  3. 让我们说用户更改变量的值,可能是开始 任务的时间。现在您可以转到步骤1将问题发布到 奥兹求解器。这一次,解决问题最有可能不会采取 和之前一样多的时间,因为所有的变量都已经实例化了。

    可能是用户选择了不一致的值。在那里面 case,求解器返回null。然后,您可以将UI带到前面 溶液

  4. 如果Oz符合您的需要并且您喜欢这种语言,那么您可能会想要 将约束求解器写为侦听套接字的服务器。这条路, 您可以将约束求解器与其余代码分开, 包括用户界面。

    希望这有帮助。

答案 1 :(得分:1)

我会赞成约束编程,原因如下:

1)CP会很快告诉你是否没有满足你的约束的时间表

2)看起来您希望为用户提供一个可行的解决方案,但是 允许他们操纵工作以改进解决方案。 CP也很擅长这一点。

3)MILP方法通常很复杂且难以制定,您必须人为地创建目标函数。

4)CP对于有经验的程序员来说并不难以学习 - 它真的来自计算机科学界而不是运营研究人员(像我一样)。

祝你好运。

答案 2 :(得分:0)

答案 3 :(得分:0)

您是否考虑过使用整数线性编程引擎(如lp_solve)?它非常适合安排应用程序。