代码之家  ›  专栏  ›  技术社区  ›  BuschnicK

调度应用中的约束图变换

  •  7
  • BuschnicK  · 技术社区  · 16 年前

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

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

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

    我已经实现了一个有点用的广告程序算法。然而,仍有一些情况下,它会失败并违反一些限制。然而,由于job-shop调度是一个研究得很好的领域,有很多算法和启发式方法来寻找一般np-hard问题的最优(或相当好的)解决方案,所以我认为应该为我更简单的子集存在解。我研究过约束编程主题,甚至是基于物理的解决方案(通过静态关节连接的刚体),但到目前为止还没有找到任何合适的解决方案。有我的提示/提示/提示/搜索关键词吗?

    4 回复  |  直到 11 年前
        1
  •  1
  •   prp    16 年前

    我强烈建议你看看 Mozart Oz ,如果您的问题 只处理整数。oz对有限域有很好的支持 约束规范、推理和优化。以你为例 通常您会执行以下操作:

    1. 以声明方式指定约束。在这方面,你会 指定所有变量及其域(如v1:1 100,表示 v1变量可以取1-100范围内的值。一些变量 可能直接有值,比如v1:99。此外,您还可以指定 变量的所有约束。

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

    3. 假设用户更改了变量的值,可能是 任务的时间。现在您可以转到步骤1将问题发布到 盎司求解器。这次,解决问题很可能不需要 和之前一样多的时间,因为所有的变量都已经被实例化了。

      可能是用户选择了不一致的值。在那 case,解算器返回空值。然后,您可以将ui带到前面的 解决方案。

    如果奥兹适合你的需要,而且你喜欢这门语言,那么你可能想 将约束求解器编写为侦听套接字的服务器。这种方式, 你可以把约束解算器和其他代码分开, 包括用户界面。

    希望这有帮助。

        2
  •  1
  •   Grembo    16 年前

    出于以下几个原因,我将投票赞成约束编程:

    1)如果没有满足您的限制的时间表,CP会很快告诉您

    2)看起来你想给你的用户一个可行的解决方案,但是 允许他们操纵作业以改进解决方案。CP也擅长这个。

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

    4)CP并不难学,特别是对有经验的程序员来说——它实际上来自计算机科学界,而不是像我这样的操作研究人员。

    祝你好运。

        3
  •  0
  •   mo-seph    16 年前

    您可以更改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

        4
  •  0
  •   vicatcu    16 年前

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