我们正在开始使用Optaplanner进行项目。我们有一个非常简单的解决方案设置如下:
Job -> PlanningEntity, PlanningVariable=Resource from resourcesList
Resource -> POJO
Solution
- List<Job> PlanningEntityCollectionProperty
- List<Resource> ProblemFactCollectionProperty, resourcesList
我们已经设置了一些测试规则。第一条规则就是说,不要为资源分配三个以上的工作:
rule "noMoreThan3JobsPerResource"
when
$resource : Resource()
$totalJobsOnResource : Number(intValue > 3) from accumulate (
Job(
resource == $resource,
$count : 1),
sum($count)
)
then
scoreHolder.addHardConstraintMatch(kcontext, 3 - $totalJobsOnResource.intValue());
end
我们想要了解的是,如何评估drools规则。例如,如果我们添加这两个规则:
rule "logWhenResource"
when
$resource: Resource()
then
System.out.println("RESOURCE encountered");
end
rule "logWhenJob"
when
$job : Job()
then
System.out.println("JOB encountered");
end
我们得到&#34; JOB遇到&#34;在日志中,但从未遇到过资源&#34;。然而,我们的第一个规则有$资源:资源()在什么时候? optaplanner在放置工作时是否会触发规则(在我们的示例中)?我们有点不清楚为什么logWhenResource不会触发,但是noMoreThan3JobsPerResource会这样做(当他们都尝试和匹配资源对象时?资源是否是作业被移动到的资源?< / p>
提前致谢
答案 0 :(得分:1)
在对IRC进行一些讨论之后(以及Geoffrey的大量患者帮助!),希望以下内容可以作为其他人的帮助。
<强> 1。打开登录
首先,请确保打开Optaplanner软件包的跟踪日志记录(并可能将其关闭以进行drools)。当optaplanner触发分数计算时,这确实有助于显示完全。它还显示了候选分数计算:
Move index (0), score (-3init/-2hard/0medium/0soft), move (Job 7 {null -> Resource 1}).
除了最后一步选择:
CH step (6), time spent (110), score (-3init/-2hard/0medium/0soft), selected move count (2), picked move (Job 7 {null -> Resource 1}).
您也可以登录&#34;然后&#34;规则的一部分,通过做类似的事情:
LoggerFactory.getLogger("org.optaplanner").debug("...);
这确保以正确的顺序记录它,因为Logging vs println可以是异步的,并且事情可能没有及时升序。
<强> 2。了解Optaplanner何时计算分数,以及何时不
这是一个非常实用的事件循环&#39; optaplanner:
doMove()
fireAllRules()
undoMove()
doMove()
fireAllRules()
undoMove()
doStep()
doMove()
fireAllRules()
undoMove() ...
等。有趣的是,根据我们在IRC上的聊天情况如下:
&#34;请注意,在undoMove之后或doStep()之后它不会执行fireAllRules()因为它可以预测分数&#34;。整齐。
第3。 FULL_ASSERT
要检查您是否损坏了分数,请启用FULL_ASSERT。
<environmentMode>FULL_ASSERT</environmentMode>
这有助于确定您的分数计算是否正确(我们的分数不是)。
答案 1 :(得分:0)
开启TRACE
日志记录。它会触发所有规则(自上次以来发生了变化,因为它的增量计算)每次在该日志中都有移动行。