【发布时间】:2010-12-18 16:25:16
【问题描述】:
我正在开发一个交互式作业调度应用程序。给定一组具有相应容量/可用性配置文件的资源,一组要在这些资源上执行的作业,以及一组确定作业顺序和作业的最早/最晚开始/结束时间的约束,我想让用户手动移动周围的工作。本质上,我希望用户能够“抓住”工作网络的一个节点并及时向前/向后拖动而不违反任何约束。
图片显示了一个简单的示例配置。最后的三角形作业表示所有作业的最晚完成时间,作业之间的连接线对作业施加顺序,灰色/绿色条表示资源可用性和负载。
您可以拖动任何作业来压缩计划。请注意,由于容量配置文件不同,作业的长度会发生变化。
我已经实现了一个有点工作的临时算法。但是,仍然存在失败并违反某些约束的情况。然而,由于工作车间调度是一个研究得很好的领域,有很多算法和启发式方法可以找到一般 NP-hard 问题的最佳(或相当好的)解决方案 - 我认为解决方案应该存在于我更容易的子集。我研究了约束编程主题,甚至研究了基于物理的解决方案(通过静态关节连接的刚体),但到目前为止找不到任何合适的东西。对我有任何指示/提示/提示/搜索关键字吗?
【问题讨论】:
-
我没有完全理解这个问题,抱歉。为什么工作的长度会改变?当您说抓取并移动节点时,您是什么意思?作业是节点吗?谢谢。
-
如上所示的网络可以通过交互式拖放操作进行修改。单击一个作业(图中标记为“作业”的节点)并将其移动到其他位置。由于作业持续时间取决于可用容量(灰色/绿色条),因此作业长度会在移动时发生变化。
-
我也不懂。您是否希望其他工作移动以满足特定的工作移动 - 例如,如果您将 job032 向左拖动,job029 和 job031 会以某种方式重新安排自己,因此 job031 仍然在 job032 开始之前完成?如果是这样,您需要告诉我们允许我们对其他工作做什么——及时移动、更改资源等?资源共享是否简单(即在同一资源上运行的两个单元作业需要 2 个单位时间才能完成)?
-
是的,job029 和 job031 需要在您的示例中重新安排。允许更改资源。我不知道“简单分享”是什么意思。我们确实有复杂的情况,其中一项工作的持续时间取决于它的前任,或者多个工作可能在一个资源上并行运行,或者一个工作拖另一个工作,或者必须在另一个工作之后在有限的时间段内执行等等。无论如何,我主要关心的是满足链接(线)隐含的优先约束。
-
单个作业节点的图表会有所帮助。我假设它可以有 N 个工作传入(必须事先完成),以及 N 个工作传出(这取决于这个工作)。您的示例似乎不是“图论”,并且似乎并不关心资源 2 在作业 031 期间将处于空闲状态。如果这是实现既定目标的最有效方法,正确的解决方案只会让资源 2 空闲. “资源”不应该以这种方式表示;相反,您应该呈现动态节点,这些节点的行为与您描述的一样。诸如开始时间之类的“硬约束”“锁定”了一个动态特征。
标签: algorithm language-agnostic graph scheduling constraint-programming