Optaplanner何时以及如何评估规则?

时间:2016-08-26 12:25:30

标签: drools optaplanner

我们正在开始使用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>

提前致谢

2 个答案:

答案 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日志记录。它会触发所有规则(自上次以来发生了变化,因为它的增量计算)每次在该日志中都有移动行。