我正在开发一个交互式作业调度应用程序。给定一组具有相应容量/可用性配置文件的资源,一组要在这些资源上执行的作业以及一组约束,这些约束确定作业顺序和作业的最早/最晚开始/结束时间我想让用户手动移动周围的工作。基本上我希望用户能够“抓住”作业网络的节点并在不违反任何约束的情况下及时向前/向后拖动它。
该图显示了一个简单的示例配置。最后的三角形作业表示所有作业的最新完成时间,作业之间的连接线对作业施加顺序,灰色/绿色条表示资源可用性和负载。
您可以拖动任何作业来压缩计划。请注意,由于容量配置文件不同,作业的长度会发生变化。
我已经实现了一种有效的ad-hock算法。但是仍然存在失败并违反某些限制的情况。然而,由于作业车间调度是一个研究很充分的领域,有很多算法和启发式方法可以找到一般的NP难问题的最优(或相当好)的解决方案 - 我认为解决方案应该存在于我更容易的子集中。我已经研究了约束编程主题甚至基于物理的解决方案(通过静态关节连接的刚体),但到目前为止找不到合适的东西。任何指针/提示/提示/搜索关键词对我来说?
答案 0 :(得分:1)
如果您有问题,我强烈建议您查看Mozart Oz 仅处理整数。 Oz对有限域有很好的支持 约束规范,推理和优化。在你的情况下 通常你会做以下事情:
以声明方式指定约束。在这,你会的 指定所有变量及其域(例如V1:1#100,表示 V1变量可以取1--100的范围内的值。一些变数 可能有值直接,比如说V1:99。另外你要指定 所有对变量的约束。
询问系统解决方案:任何满足的解决方案 约束或最佳解决方案。然后你会显示这个 用户界面上的解决方案。
让我们说用户更改变量的值,可能是开始 任务的时间。现在您可以转到步骤1将问题发布到 奥兹求解器。这一次,解决问题最有可能不会采取 和之前一样多的时间,因为所有的变量都已经实例化了。
可能是用户选择了不一致的值。在那里面 case,求解器返回null。然后,您可以将UI带到前面 溶液
如果Oz符合您的需要并且您喜欢这种语言,那么您可能会想要 将约束求解器写为侦听套接字的服务器。这条路, 您可以将约束求解器与其余代码分开, 包括用户界面。
希望这有帮助。
答案 1 :(得分:1)
我会赞成约束编程,原因如下:
1)CP会很快告诉你是否没有满足你的约束的时间表
2)看起来您希望为用户提供一个可行的解决方案,但是 允许他们操纵工作以改进解决方案。 CP也很擅长这一点。
3)MILP方法通常很复杂且难以制定,您必须人为地创建目标函数。
4)CP对于有经验的程序员来说并不难以学习 - 它真的来自计算机科学界而不是运营研究人员(像我一样)。 祝你好运。答案 2 :(得分:0)
您可能可以更改Waltz约束传播算法以处理更改约束以快速查明给定解决方案是否有效。我没有提到手,但这可能会指向正确的方向: http://www.sciencedirect.com/science?_ob=ArticleURL&_udi=B6TYF-41C30BN-5&_user=809099&_rdoc=1&_fmt=&_orig=search&_sort=d&_docanchor=&view=c&_searchStrId=1102030809&_rerunOrigin=google&_acct=C000043939&_version=1&_urlVersion=0&_userid=809099&md5=696143716f0d363581a1805b34ae32d9
答案 3 :(得分:0)
您是否考虑过使用整数线性编程引擎(如lp_solve)?它非常适合安排应用程序。