【问题标题】:Constraints programming in javajava中的约束编程
【发布时间】:2013-11-01 00:50:42
【问题描述】:

如何制定有效的有约束条件的作业调度?

调度器应该包括这些方法:

startBeforeEndOf(Job j)
startAfterEndOf(Job j)
startBeforeStartOf(Job j)
startAfterStartOf(Job j)
endBeforeEndOf(Job j)
endAfterEndOf(Job j)
endBeforeStartOf(Job j)
endAfterStartOf(Job j)

每个作业都有一个id和时间参数。

此问题的可能解决方案可能基于技术回溯。作业用作选择点,时间瞬间用作选择(在最坏的情况下,活动的总持续时间是工作持续时间的总和,从而导致完全顺序执行)。

或者,我应该充分表示数据,然后在时间轴上生成调度,将工作置于约束之下,并在不满足约束时继续执行作业(以及依赖它的所有作业)。 但我不知道我如何在 java 中做到这一点。

换句话说,我在所描述的工作管理中寻找一种避免强烈回溯方法的方法。

【问题讨论】:

  • 这是作业吗?你知道任何可以用于此的算法吗?您可以在搜索过程中添加启发式方法,但无论哪种方式,回溯似乎都是解决方案的一部分。除非您当然希望进行详尽的搜索:-)
  • 我正在考虑根据他的约束使用各种列表来分隔每个作业,例如 private List startBeforeEnd;私有列表 startAfterEnd;私有列表 startBeforeStart;私有列表 startAfterStart;私有列表 endBeforeEnd;私有列表 endAfterEnd;私有列表 endBeforeStart;私有列表 endAfterStart;私有列表 受限;但我不知道究竟是如何开发的。

标签: java constraint-programming


【解决方案1】:

试试OptaPlanner(java,开源)。有a quick start here

例如,将每个Job 分配给startMinute,然后添加如下评分规则:

when
    $leftJob : Job($startMinute : startMinute)
    // getEndMinute() returns startMinute + durationInMinutes
    $rightJob : Job(beforeJob == $leftJob, endMinute > $startMinute)
then
    // punish
end

【讨论】:

  • emmm...你能不能给我更多的细节,如何适应流口水来满足这个问题的解决方案???谢谢
【解决方案2】:

您可以使用开源约束编程库。 This 帖子指向许多用 Java 编写的求解器,用于解决约束满足问题等问题。

【讨论】:

  • 谢谢,但是这些库对于这个特定问题来说太大了,有没有更小的?
  • @AndreaF - 我不知道。但是您可以从其中一个库中找到所需的功能。然后深入了解库的实现并根据您的情况进行调整。
  • 阅读一百个代码行广告尝试在这个问题上调整这些通用库是一种过于复杂的方法。凭着正确的直觉,我认为这可以由熟练的开发人员在几节小课上解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多