我被分配了一个项目,要求安排(构建一个时间表)大约30个资源,每天2个班次,为期6个月,并且有非常复杂的硬约束,如
最初,我决定构建数学模型,对其进行编码并使用GA进行求解。 然后我发现Drools看起来很有希望......但是有一个学习期。
选择哪种方式?有任何想法吗?
答案 0 :(得分:1)
我确实在1.5个月内制作了一个大学时间表项目而不太了解java。它使用模拟退火并在40秒内运行(28个等级,约1000个周期)。
我对每天的小时数有严格的限制和软约束。添加的硬约束使得当前状态变得不可能。软约束每次违规减去几个点。我已经指定每天的工作量或多或少均匀分布。
这些点很容易调整,因为它们在规则文件中指定。用方言指定规则很简单,不需要编译任何东西来添加/调整规则。
我可以通过在问题状态和规则中以声明方式指定教师来阻止教师教授冲突的时期:
...p1 = new Period(class, day ,num)
...p2 = new Period(class, day ,num)
...periodConflict1 = new PeriodConflict( p1, p2)
并编写一个处理PeriodConflict
的规则(如果存在)。所以我想它可以解决你的4分。
然后作者Geoffrey De Smet亲自处理查询和错误。
因此,Drools规划师比编写自己的算法和处理域规则要好得多。
我首先提到N Queens(最简单)然后云平衡(第二个最简单),制作一个数独应用程序和一个桶装填应用程序(在10个桶中放置100个数字,以便它们的总和彼此接近)和从那里建造它。
答案 1 :(得分:0)
这些约束听起来与OptaPlanner (= Drools Planner)中的Nurse Rostering示例非常相似。您可能希望从该示例开始。