-2

我被分配了一个项目,该项目要求安排(制定时间表)约 30 个资源,每天 2 个班次,为期 6 个月,具有非常复杂的硬约束,例如

  1. 没有连续的天班
  2. 对于每个资源:总夜班(和白班)总和,精细分布....SumShifts(Mondays)=SumShifts(Tuesdays)....
  3. 对于所有资源:SumTotalDayShifts(和夜班)分发
  4. 无法使用 resource_y 为 day_x 上的各种其他约束(如 resource_a)分配班次。

最初,我决定构建数学模型,对其进行编码并用 GA 求解。然后我发现了 Drools,它看起来很有前途……但有一个学习期。

选择哪种方式?有任何想法吗?

4

2 回答 2

1

我确实在 1.5 个月内完成了一个大学时间表项目,但对 Java 了解不多。它使用模拟退火并在 40 秒内运行(28 类,约 1000 个周期)。

我对每天的小时数有硬约束和软约束。添加的硬约束使当前状态变得不可能。软约束每次违规都会减去几分。我已经指定每天的工作量或多或少是均匀分布的。

这些点很容易调整,因为它们是在规则文件中指定的。用它的方言指定规则很简单,不需要编译任何东西来添加/调整规则

我可以通过在问题状态和规则中声明性地指定它来防止教师教授冲突时期:

...p1 = new Period(class, day ,num)
...p2 = new Period(class, day ,num)
...periodConflict1 = new PeriodConflict( p1, p2)

并编写一个规则来处理 aPeriodConflict如果它存在。所以我想它解决了你的 4 点。

然后作者 Geoffrey De Smet 亲自处理查询和错误。

所以 Drools planner 比编写自己的算法和处理领域的规则要好得多。

我首先提到了 N Queens(因为它最简单),然后是云平衡(第二简单),制作了一个数独应用程序和一个桶填充应用程序(将 100 个数字放在 10 个桶中,以便它们的总和彼此接近)并从那里。

于 2013-07-26T08:34:25.133 回答
0

这些限制听起来与OptaPlanner (= Drools Planner)中的护士排班示例非常相似。您可能想从该示例开始。

于 2013-07-22T10:02:55.327 回答